5

さて、私は次のコードスニペットを扱っています:

push   %ebp
mov    %esp,%ebp   
push   %ebx
mov    0x8(%ebp),%eax 
movzwl %ax,%edx

したがって、正の値を扱う場合、これは期待どおりに動作します。%edx にコピーされる値は、%eax (または %ax) の末尾の 16 ビットです。

ただし、負の数を入れると、すべてがおかしくなり始め、期待どおりに動作していないように見えます。

たとえば、%eax の値が -67043552 の場合、%edx にコピーされる値は 65312 です。

組み立て初心者ですので、私の勘違いでしたら申し訳ありません。どんな助けでも大歓迎です。

4

1 に答える 1

16

の上位 16 ビットをゼロで埋めて、ビットのみをmovzwlコピーすることに注意してください。%ax%edx%edx

したがって%edx、常に 65535 以下の正の数になります。

詳細: -6704355216 進数ではfc00ff20. したがって、それが にある場合、 が%eax含ま%axれますff20%edxそれをゼロ拡張で移動すると、%edxが取得され0000ff20ます。それは 65312 です。

于 2011-09-06T06:07:02.320 に答える