x64 asm奇怪行为
问题描述:
有人可以帮助我理解x64 asm行为吗?我无法找到任何类型的文件。x64 asm奇怪行为
所以,基本上,我们有:
- 64注册
RAX
。 - x32注册
EAX
。 - x16注册
AX
。 - x8注册
AL
。
现在代码:
mov rax, -1 (0xFFFFFFFFFFFFFFFF)
add al, 1
结果将是0xFFFFFFFFFFFFFF00(正确的,al
寄存器溢出,但我们只改变AL
1字节)
mov rax, -1 (0xFFFFFFFFFFFFFFFF)
add ax, 1
结果将是0xFFFFFFFFFFFF0000(正确的, ax
寄存器溢出,但我们只更改AX
2个字节)
mov rax, -1 (0xFFFFFFFFFFFFFFFF)
add eax, 1
结果将是0x0000000000000000(WTF ?, eax
寄存器溢出,但导致改变所有8个字节,而不是4,为什么它是0x0000000000000000但不0xFFFFFFFF00000000)
答
32位操作数产生一个32位的结果,零扩展为目标通用寄存器中的64位 结果。
就是这样。谢谢!
mov rax, 0x6666666666666666
add eax, 1
结果证实了这一点,将是0x0000000066666667
参见:https://*.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of -a-32位寄存器 –
注意'add eax,0'也将清除RAX的最重要的一半。 –
顺便说一句,只有你写的字节的一半,'al'是1字节,'ax'是两个字节等。 – harold