46

この指示は正確に何をしますか?

movzbl  0x01(%eax,%ecx), %eax
4

2 に答える 2

49

AT&T構文は、movzxIntel命令ニーモニックをさまざまなソースサイズ(movzbmovzw)のさまざまなニーモニックに分割します。Intel構文では、次のようになります。

movzx eax, byte ptr [eax+ecx+1]

つまり、eax + ecx + 1でメモリからバイトをロードし、レジスタ全体にゼロ拡張します。

ところで、ほとんどのGNUツールには、Intel構文を優先するためのスイッチまたは構成オプションがあります。(objdump -Mintelまたはなどgcc -S -masm=intel。ただし、後者はインラインasmのコンパイル時に使用される構文に影響します)。生活のためにAT&Tの組み立てを行わないのであれば、私は確かにそれを調べることをお勧めします。タグwikiも参照してください。

于 2012-02-16T19:44:52.967 に答える
29

最小限の例

mov $0x01234567, %eax
mov $1, %bl
movzbl %bl, %eax
/* %eax == 0000 0001 */

mov $0x01234567, %eax
mov $-1, %bl
movzbl %bl, %eax
/* %eax == 0000 00FF */

assertions を使用して GitHub アップストリームを実行できます

ニーモニックは次のとおりです。

  • MOV
  • ゼロエクステンド
  • バイト (8 ビット)
  • Long (32 ビット)

他のサイズのバージョンもあります:

  • movzbw:バイト(8ビット)~ワード(16ビット)
  • movzwl: Word (16 ビット) から Long (32 ビット)

ほとんどの GAS 命令と同様に、レジスタを扱うときは最後のサイズ文字を省略できます。

movzb %bl, %eax

しかし、最後の文字の前を省略できない理由がわかりません。たとえば、次の例では失敗します。

movz %bl, %eax

movオペランドが forおよび Intel 構文のようにレジスターである場合、オペランドのサイズから推測してみませんか?

間違ったサイズのレジスタを使用すると、コンパイルに失敗します。

movzb %ax, %eax
于 2015-06-29T11:56:32.163 に答える