Was macht die MOVZBL-Anweisung in der IA-32 AT & T-Syntax?
Frage
Was genau die Anweisung
movzbl 0x01(%eax,%ecx),%eax
tut?
Lösung
AT & T Syntax spaltet die auf movzx
Intel -Anweisung mnemonisch in verschiedene Mnemonik für verschiedene Quellgrößen (movzb
vs. movzw
). In der Intel -Syntax ist es:
movzx eax, byte ptr [eax+ecx+1]
dh ein Byte aus dem Speicher bei EAX+ECX+1 und Null-Extend in das vollständige Register laden.
Übrigens haben die meisten GNU -Tools jetzt einen Switch oder eine Konfigurationsoption, um die Intel -Syntax zu bevorzugen. (Wie zum Beispiel objdump -Mintel
oder gcc -S -masm=intel
, obwohl letztere die Syntax beeinflussen, die beim Kompilieren von Inline-Assims verwendet wird). Ich würde auf jeden Fall empfehlen, es zu untersuchen, wenn Sie keine AT & T -Assembly zum Leben vornehmen. Siehe auch die x86 Tag Wiki für weitere Dokumente und Führer.
Andere Tipps
Minimales Beispiel
mov $0x01234567, %eax
mov $1, %bl
movzbl %bl, %eax
/* %eax == 0000 0001 */
mov $0x01234567, %eax
mov $-1, %bl
movzbl %bl, %eax
/* %eax == 0000 00FF */
Runanble Github stromaufwärts mit Behauptungen.
Die Mnemonik ist:
- MOV
- Null verlängern
- Byte (8-Bit)
- zu lang (32-Bit)
Es gibt auch Versionen für andere Größen:
movzbw
: Byte (8-Bit) zu Wort (16-Bit)movzwl
: Wort (16-Bit) bis lang (32-Bit)
Wie bei den meisten Gasanweisungen können Sie den Charakter der letzten Größe beim Umgang mit Registern weglassen:
movzb %bl, %eax
Aber ich kann nicht verstehen, warum wir den vorletzten Brief nicht weglassen können, z. B. folgt:
movz %bl, %eax
Warum nicht einfach die Größe der Operanden abgeben, wenn sie Register sind wie für mov
und Intel -Syntax?
Und wenn Sie Register der falschen Größe verwenden, kann es nicht kompilieren, EG:
movzb %ax, %eax