Printing 从寄存器打印字符

Printing 从寄存器打印字符,printing,character,nasm,Printing,Character,Nasm,我正在使用NASM汇编程序 当我试图打印整数表示时,返回到eax寄存器的值应该是一个字符,它的值看起来像内存地址。我原以为这封信是十进制的。例如,如果字符“a”被移动到eax,我应该看到正在打印97(“a”的十进制表示)。但事实并非如此 section .data int_format db "%d", 0 ;----------------------------------------------------------- mov eax, dword[ebx +

我正在使用NASM汇编程序

当我试图打印整数表示时,返回到eax寄存器的值应该是一个字符,它的值看起来像内存地址。我原以为这封信是十进制的。例如,如果字符“a”被移动到eax,我应该看到正在打印97(“a”的十进制表示)。但事实并非如此

section .data
             int_format db "%d", 0
;-----------------------------------------------------------

mov eax, dword[ebx + edx]
push eax
push dword int_format
call _printf   ;prints a strange number
add esp, 8

xor eax, eax
mov eax, dword[ebx + edx]
push eax
call _putchar ;prints the correct character!
add esp, 4
那么这里有什么意义呢?最后,我想比较字符,因此eax获得字符的正确十进制表示非常重要

mov eax, dword[ebx + edx]
您正在从指向ebx+edx的地址加载dword(32位)。如果需要单个字符,则需要加载一个字节。为此,您可以使用movzx指令:

movzx eax, byte[ebx + edx]
这将向
eax
(即
al
)的低位字节加载一个字节,并将寄存器的其余部分归零

另一种选择是在加载dword后屏蔽额外的字节,例如:

and eax, 0ffh


至于
putchar
,它之所以有效,是因为它将传递的值解释为char,即它忽略寄存器中的高三个字节,而只考虑低字节。

非常感谢,这非常有效。我对德沃德的转会很好奇,但movzx完全超出了我的想象,我仔细阅读了说明书。现在有道理了。第一次组装,再次感谢!!
movxz eax, al