it-swarm.com.de

Was ist das 0x10 in der x86-Assemblyanweisung "leal 0x10 (% ebx),% eax"?

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.

32
Tony The Lion

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.

71

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): 

4
Pascal Cuoq

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

0
Kelvin Spencer