我正在使用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得到字符的正确十进制表示。
答案 0 :(得分:1)
mov eax, dword[ebx + edx]
您正在从指向ebx + edx的地址加载双字(32位)。如果需要单个字符,则需要加载一个字节。为此,您可以使用movzx指令:
movzx eax, byte[ebx + edx]
这会将单个字节加载到eax
的低字节(即al
),并将寄存器的其余部分清零。
另一种选择是在加载双字后掩盖额外的字节,例如:
and eax, 0ffh
或
movxz eax, al
对于putchar
,它起作用,因为它将传递的值解释为char,即它忽略寄存器中存在的高三个字节并仅考虑低字节。