Was ist die Funktion der 0x10 in Bezug auf diese LEAL-Anweisung? Ist es eine Multiplikation oder Ergänzung oder ist etwas anderes?
leal 0x10(%ebx), %eax
Kann jemand bitte klären? Dies ist der x86-Assembler auf einer Linux-Box.
leal oder lea full name ist "Laden effektive Adresse" und tut genau dies: Es führt eine Adressberechnung durch.
In Ihrem Beispiel ist die Adressberechnung sehr einfach, da sie nur einen Versatz zu ebx hinzufügt und das Ergebnis in eax speichert:
eax = ebx + 0x10
lea kann noch viel mehr. Es kann Register hinzufügen, Register mit den Konstanten 2, 4 und 8 für Adressberechnungen von Wörtern, Ganzzahlen und Duplikaten multiplizieren. Es kann auch ein Offset hinzugefügt werden.
Beachten Sie, dass lea in der Art und Weise besonders ist, dass es niemals die Flags ändert, selbst wenn Sie es als einfache Ergänzung wie im obigen Beispiel verwenden. Compiler nutzen diese Funktion manchmal aus und ersetzen einen Zusatz durch einen Lea, um den Scheduler zu unterstützen. Es ist nicht ungewöhnlich, dass Lea-Anweisungen aus diesem Grund in kompiliertem Code einfache Arithmetik ausführen.
lea
steht für "effektive Adresse laden"; Es ist eine Möglichkeit, die ausgefeilten Adressierungsmodi des IA32-Befehlssatzes für die Arithmetik zu verwenden. Mit dem Suffix l
können Sie die Größe der Befehlsoperanden in der Syntax von GNU als unterscheiden, die Sie auf Ihrer Linux-Box haben.
Kurz gesagt, ja, es ist eine Art Zusatzanweisung. Es kann auch Multiplikationen von 2, 4 oder 8 gleichzeitig behandeln.
Siehe auch diese verwandte Frage (wo sie die Intel-Syntax verwenden, um dieselbe Anweisung zu diskutieren):
GNU als 2.18 Dokumente
https://sourceware.org/binutils/docs-2.18/as/i386_002dMemory.html
AT & T: -4 (% ebp), Intel: [ebp - 4]
und dann ist die Intel-Syntax selbsterklärend.
Noch wichtiger ist, dass die Dokumente auch den allgemeinen Fall erläutern:
Eine indirekte Speicherreferenz der Intel-Syntax des Formulars
section:[base + index*scale + disp]
wird in die AT & T-Syntax übersetzt
section:disp(base, index, scale)
dabei sind Basis und Index die optionalen 32-Bit-Basis- und Indexregister, Disp ist die optionale Verschiebung und die Skalierung multipliziert den Wert unter Verwendung der Werte 1, 2, 4 und 8 und berechnet die Adresse des Operanden
Dinge werden in AT & T etwas unordentlich, wenn wir einige Teile der Adresse weglassen, z. -4(%ebp)
, aber mit den Beispielen in den Dokumenten können wir leicht alle Syntaxfälle ableiten.
Um wirklich zu verstehen, was los ist, empfehle ich Ihnen, sich die Kodierung von Anweisungen anzusehen. Dies ist ein gutes Tutorial: http://www.c-jump.com/CIS77/CPU/x86/lecture.html Wenn Sie das sehen, wird klar, warum einige Teile der Adresse weggelassen werden können. und was jedes Formular kompilieren wird.
Um Nils Antwort hinzuzufügen,
Als Auffrischung hat der Adressierungsmodus im IA32-Assembler im Allgemeinen die Form:
IO (Rb, Ri, s), wobei:
IO = Sofortiger Offset
Rb = Basisregister
Ri = Indexregister
s = Skalierungsfaktor {1, 2, 4, 8}
Die effektive Adresse wird also als * IO + [Eb] + [Ei] sberechnet.
leal sieht ähnlich aus wie andere Anweisungen wie movl, aber es ist etwas Besonderes. Statt von der Quelle zum Ziel zu lesen, kopiert es die effektive Adresse der Quelle in das Ziel.
Es kann also verwendet werden, um Zeiger für spätere Speicherreferenzen zu generieren, und auch .__ für grundlegende Rechenoperationen, wie Nils betonte.
Zum Beispiel:
lassen Sie das Register% edx den Wert x enthalten
leal 1 (% edx,% edx, 8),% eax
lädt die effektive Adresse von 1 + x + 8 * x = 1 + 9x, um% eax zu registrieren.
Im Wesentlichen ist die Operation:
leal source, destination => destination = Adresse von source
Wenn Sie mit C vertraut sind, entspricht dies:
char * b = & a;
wo die Adresse von Zeichen a dem Zeichenzeiger b zugeordnet ist
mehr Beispiele:
Lassen Sie das Register% eax den Wert x und das Register% ecx den Wert y festlegen
leal (% eax,% ecx, 4),% edx weist% edx den Wert x + 4y zu
leal 0xB (,% ecx, 5),% edx weist% edx den Wert 0xB + 5y = 11 + 5y zu
leal (% eax,% eax, 2),% eax weist 3x den Wert zu, um% eax zu registrieren
Hoffe das hilft