インテルマニュアルのx86-64ツアーで、私は読んだ
おそらく最も驚くべき事実は、レジスタ
MOV EAX, EBX
の上位32ビットを自動的にゼロにするなどの命令RAX
です。
同じソースで引用されているIntelのドキュメント(手動の基本アーキテクチャの64ビットモードの3.4.1.1汎用レジスタ)には、次のように記載されています。
- 64ビットのオペランドは、宛先の汎用レジスタに64ビットの結果を生成します。
- 32ビットのオペランドは32ビットの結果を生成し、宛先の汎用レジスタで64ビットの結果にゼロ拡張されます。
- 8ビットおよび16ビットのオペランドは、8ビットまたは16ビットの結果を生成します。宛先汎用レジスタの上位56ビットまたは48ビット(それぞれ)は、演算によって変更されません。8ビットまたは16ビット演算の結果が64ビットアドレスの計算を目的としている場合は、レジスタを完全な64ビットに明示的に符号拡張します。
x86-32およびx86-64アセンブリでは、次のような16ビット命令
mov ax, bx
eaxの上位ワードがゼロになるような「奇妙な」動作を示さないでください。
したがって、この動作が導入された理由は何ですか?一見、それは非論理的に見えます(しかし、その理由は、私がx86-32アセンブリの癖に慣れているためかもしれません)。