从寄存器打印字符

时间:2011-04-27 11:27:33

标签: printing character nasm

我正在使用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得到字符的正确十进制表示。

1 个答案:

答案 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,即它忽略寄存器中存在的高三个字节并仅考虑低字节。