【问题标题】:Joining strings from registers and printing them (CPUID)从寄存器连接字符串并打印它们(CPUID)
【发布时间】:2019-03-25 12:15:28
【问题描述】:

开始学习 NASM 组装,我在 Stack Overflow 中查看了一些组装问题,并在这里找到了这个: Concatenating strings from registers and printing them

我相信这个问题不会重复,因为我正在尝试 复制 NASM 中的代码,并且在 其他问题。

我决定在 NASM 中复制这段代码,但我不太了解有问题的 MASM 代码。
我了解了CPUID 并做了一些测试程序。

按顺序,我想知道我们如何连接寄存器,然后使用 NASM 将它们打印在屏幕上。

我想打印 'ebx' + 'edx' + 'ecx' 因为CPUID 输出是由what I see in GDB 组织的。

我用eax=1打电话给CPUID

【问题讨论】:

    标签: string assembly x86 nasm cpuid


    【解决方案1】:

    “字符串”不是一个非常精确的术语。 CPUID/EAX=0 的供应商标识字符串仅包含 12 个 ASCII 字符,打包到 3 个 DWORD 寄存器中。没有像 C 中那样的终止字符,也没有像 PASCAL 中那样的长度信息。但它始终是相同的寄存器,并且始终是 3*4=12 字节。这是 write-syscall 的理想选择:

    section .bss
    
        buff resb 12
    
    section .text
    global _start
    
    _start:
    
        mov eax, 0
        cpuid
    
        mov dword [buff+0], ebx     ; Fill the first four bytes
        mov dword [buff+4], edx     ; Fill the second four bytes
        mov dword [buff+8], ecx     ; Fill the third four bytes
    
    
        mov eax, 4                  ; SYSCALL write
        mov ebx, 1                  ; File descriptor = STDOUT
        mov ecx, buff               ; Pointer to ASCII string
        mov edx, 12                 ; Count of bytes to send
        int 0x80                    ; Call Linux kernel
    
        mov eax, 1                  ; SYSCALL exit
        mov ebx, 0                  ; Exit Code
        int 80h                     ; Call Linux kernel
    

    【讨论】:

    • 谢谢,但您能否告诉我更多关于为什么使用 .bss 会话来存储此缓冲区变量的信息。
    • @PySnake:两个原因:1)缓冲区未初始化,2)在 .data 部分定义一个 12 个空字节的数组看起来很糟糕。在可执行文件中只有关于 BSS 部分长度的信息,没有像 DATA 或 TEXT 这样的值。整个段是在程序启动时构建的。
    猜你喜欢
    • 2015-12-30
    • 2015-06-10
    • 1970-01-01
    • 2017-07-12
    • 2021-06-15
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多