Frage

Was genau die Anweisung

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

tut?

War es hilfreich?

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 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top