开始学习NASM组装,我在Stack Overflow的此处查看了一些组装问题,并在此处找到了以下问题: Concatenating strings from registers and printing them
我相信这个问题不会重复,因为我正试图 在NASM中复制代码,而且在 另一个问题。
我决定在NASM中复制此代码,但我不太了解所涉及的MASM代码。
我了解了CPUID
,并做了一些测试程序。
我想知道如何连接寄存器,然后使用NASM在屏幕上打印它们。
我想打印'ebx'+'edx'+'ecx',因为what I see in GDB是CPUID
输出的组织方式。
我用CPUID
叫eax=1
答案 0 :(得分:3)
“字符串”不是一个非常精确的术语。 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