在x86汇编中打印寄存器

3

我遵循了几份在线文档,但当我尝试打印存储在寄存器%ecx中的数字时,什么也没有发生。这可能是因为我正在执行计算,然后在循环中尝试打印吗?

   mov     $48, %ecx  #Convert to ascii
   mov     $1, %edx   #Print Byte
   add     %eax, %ecx

   mov     $4, %eax          #Output To Console
   mov     $1, %ebx          #File Descriptor - Standardout
   int      $0x80            #Call the Kernel
2个回答

5
< p > < code > write 系统调用需要一个指向要打印的数据的指针。据我所知,您只有一个单个数字。您可以将其在堆栈上临时存储以进行打印,如下所示:

mov     $48, %ecx  #Convert to ascii
mov     $1, %edx   #Print Byte
add     %eax, %ecx
push    %ecx       # store on stack
mov     %esp, %ecx # load address
mov     $4, %eax   # Output To Console
mov     $1, %ebx   # File Descriptor - Standardout
int     $0x80      # Call the Kernel
pop     %ecx       # clean up stack

记住,对于多位数字,您需要更好的转换程序。


2
这个系统调用是一个 write。在C语言中,其签名应该为:
int write(int fd[ebx], char *p[ecx], int size[edx]);

现在看你的代码,ebxedxeax都没问题。但是ecx是一个指向缓冲区的指针,而不是一个字符。此外,我并不真正知道这个

标签的含义。

add eax, ecx

根据你的代码片段,eax未被定义,因此你需要在内存中保留一个缓冲区,将要写入的字节放入其中,然后让ecx指向它。

如果eax应该是0-9范围内的单个数字,则最好使用mov $'0', ecx,这样更易读。


1
GNU汇编器中的$符号表示“立即数”,而不是十六进制。因此,$48是正确的。当然,$'0'更易读。 - Jester
好的。我不太了解AT&T语法,例如M68000,$表示十六进制数字(其他汇编器也是如此)。 :) 感谢更新。 - Devolus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接