2017-09-22 25 views
1

誰かがx64 asmの動作を理解できますか?私はそのためのあらゆる種類の文書を見つけることができません。x64 asm奇妙な振る舞い

ので、基本的に、我々は持っている:

  • のx64は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レジスタオーバーフロー、それは0x0000000000000000なく0xFFFFFFFF00000000なぜ全8バイトの代わりに4を変更結果)

+0

を参照してくださいになります。https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of -a-32-bit-register –

+0

'add eax、0'も' RAX'の最も重要な部分をクリアすることに注意してください。 –

+0

Btwあなたが書いたバイト数の半分だけです.'al'は1バイト、 'ax'は2バイトです。 – harold

答えて

1

32ビットオペランドであろう32ビットを生成します結果、デスティネーション汎用レジスタの結果がゼロ拡張され、64ビットの になります。

これはです。ありがとう!

mov rax, 0x6666666666666666 
add eax, 1 

結果はこれを確認し、0x0000000066666667