2017-09-22 42 views
1

有人可以幫助我理解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://stackoverflow.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

回答

1

32位操作數產生一個32位的結果,零擴展爲目標通用寄存器中的64位 結果。

就是這樣。謝謝!

mov rax, 0x6666666666666666 
add eax, 1 

結果證實了這一點,將是0x0000000066666667