2

私のコードは次のとおりです:(Windows 64ビット環境では、Windows 7、Core i5 520M CPU上のVisual Express 2012でデバッグ)

mov edx, a_number_which_is_less than_16_bits
shl rdx,32       ; moves that number to upper 32 bits of RDX
<few lines that leave an useless number in EDX, but does not touch upper 32 bits of RDX>
xor edx,edx      ; should clear the lower 32 bits of RDX keeping upper 32 bits intact

しかし、RDX の上位 32 ビットもクリアしています... RDX 全体をゼロのままにします。64 ビット プロセッサ用の Intel マニュアルでは、XOR 命令が上位 32 ビットもクリアすることを指定していません (Vol 2 B、ページ 4-531)。

これは他のプログラマーにも見られましたか?

4

2 に答える 2

3

ゼロ拡張と符号拡張の結果は、AMD による設計上の決定であり、Intel もこれに従いました。したがって、これは予期される動作です。技術的なメリットについては、別の場所で説明します

于 2013-05-05T06:46:42.317 に答える
2

32 ビット オペランドを処理するときに 64 ビット デスティネーション レジスタの上位 32 ビットがクリアされるという事実は、Intel の「Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1: Basic Architecture」 - 3.4 で説明されています。 1.1 64 ビット モードの汎用レジスタ:

  • 32 ビットのオペランドは 32 ビットの結果を生成し、宛先の汎用レジスタで 64 ビットの結果にゼロ拡張されます。
于 2013-05-05T07:16:30.650 に答える