IA-32 AT&T構文でMOVZBL命令は何をしますか?
質問
まさに指示は何ですか
movzbl 0x01(%eax,%ecx),%eax
やりますか?
解決
AT&T構文は分割します movzx
Intel Instruction Mnemonic さまざまなソースサイズの異なるニーモニックに(movzb
vs。 movzw
)。 Intelの構文では、次のようになります。
movzx eax, byte ptr [eax+ecx+1]
IEは、EAX+ECX+1のメモリからバイトをロードし、ゼロエクステンデンドフルレジスタに拡張します。
ところで、ほとんどのGNUツールには、Intel構文を好むスイッチまたは設定オプションがあります。 (そのような objdump -Mintel
また gcc -S -masm=intel
, 、後者は、インラインASMをコンパイルするときに使用される構文に影響します)。あなたが生活のためにAT&Tアセンブリをしないなら、私は確かにそれを調べることをお勧めします。を参照してください x86 より多くのドキュメントとガイドについては、wikiにタグを付けます。
他のヒント
最小限の例
mov $0x01234567, %eax
mov $1, %bl
movzbl %bl, %eax
/* %eax == 0000 0001 */
mov $0x01234567, %eax
mov $-1, %bl
movzbl %bl, %eax
/* %eax == 0000 00FF */
ニーモニックは次のとおりです。
- mov
- ゼロ拡張
- バイト(8ビット)
- 長い(32ビット)
他のサイズのバージョンもあります。
movzbw
: :byte(8ビット)からワード(16ビット)movzwl
: :単語(16ビット)から長い(32ビット)
ほとんどのガス指示と同様に、レジスタを扱うときに最後のサイズの文字を省略できます。
movzb %bl, %eax
しかし、前の手紙を省略できない理由を理解できません。たとえば、次の失敗:
movz %bl, %eax
オペランドが登録しているときに、オペランドのサイズからそれを推測してみませんか mov
およびIntelの構文?
また、間違ったサイズのレジスタを使用する場合、例:
movzb %ax, %eax
所属していません StackOverflow