x64 asm奇怪行为

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)

+0

参见:https://*.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of -a-32位寄存器 –

+0

注意'add eax,0'也将清除RAX的最重要的一半。 –

+0

顺便说一句,只有你写的字节的一半,'al'是1字节,'ax'是两个字节等。 – harold

32位操作数产生一个32位的结果,零扩展为目标通用寄存器中的64位 结果。

就是这样。谢谢!

mov rax, 0x6666666666666666 
add eax, 1 

结果证实了这一点,将是0x0000000066666667