2016-05-15 13 views
-5

lea assembly instructionwas ist leal (% edx,% edx, 4),% eax bedeutet?

oberhalb Seite sagt, es

Die Anweisung leal (%edx, %edx, 4), %eax bedeutet: eax = edx * 5

aber wie?

als i %edx weiß, ist Ausgangspunkt neben %edx ist Index und 4 ist

d.h. disp (Basis-, Index- Skala) skalieren.

+4

Die Frage, die Sie bereits verknüpft haben, erklärt es. Es ist nur 'edx + edx * 4', das ist natürlich 'edx * 5' (du weißt,' 1 + 4 = 5') – Jester

+0

@Jester kannst du Schritt für Schritt erklären, wie 'edx + edx * 4' zu' edx wird * 5 (wie aus 4 wird 5)? – andrew01239

+1

Das ist Mathe der Grundschule ... wenn du 1 Apfel und 4 weitere Äpfel bekommst, bekommst du 5 Äpfel ... was ist unklar? – Jester

Antwort

2

Im Allgemeinen disp(base,index,scale) gibt Adresse:

base + scale * index + disp 

daher Adresse (%edx, %edx, 4) wird interpretiert als

disp := 0 
base := %edx 
index := %edx 
disp := 4 

In zusammen, es gibt:

%edx + %edx * 4 + 0 

die %edx * 5 gibt.

Jetzt wird leal für die Adresszuweisung verwendet. Es weist die obige Adresse %eax zu, daher erhalten Sie %eax := %edx * 5.


Dieser allgemein gesehen wird, da der Skalierungsfaktor scale nur 1 sein kann, 2, 4, 8, daher gibt es keine Möglichkeit% EDX von 5 direkt zu multiplizieren. Ähnlich, wenn wir %eax = %edx * 3 bekommen wollen, müssen wir leal (%edx, %edx, 2), %eax tun.

+0

können Sie es mit Beispiel erklären.Ich meine mit der Zuweisung von Zahlen zu% edx – andrew01239

+0

'(% edx,% edx, 4)' erste '% edx' ist die Basisadresse dh jede Adresse im Speicher Adressraum, zweite% edx ist der Index dh alles von 0,1, 2 ..... und Skalierung ist "4" dann wie es interpretiert wird als% edx * 5? – andrew01239

+1

Nein, beide '% edx' sind die gleichen, nur Zahlen (die eine Speicheradresse sein könnten, aber höchstwahrscheinlich nicht in diesem Fall sind). Sie haben also die Basis '% edx' und Sie fügen den Index'% edx' mit der Skalierung '4' hinzu, dh Sie fügen der Basis'% edx' den Index '% edx * 4' hinzu, was'% edx + 'ergibt % edx * 4' was, mit einfacher Mathematik, '% edx * (1 + 4)' ist, was '% edx * 5' ergibt. Mit Zahlen: Unter der Annahme '% edx == 10' haben Sie% edx: =% edx +% edx * 4','% edx: = 10 + 10 * 4', '% edx: = 10 + 40', '% edx: = 50'. – CherryDT

3

DISP (Basis, Index, Skalierung).

Sie wissen, wie diese Anweisung funktioniert (Basis + Index * Skala), aber Ihre Probleme kommen von der Tatsache, dass Sie die erste Komponente immer unter Berücksichtigung immer eine Adresse zu sein („dh jede Adresse in Speicheradressraum“) und die zweite Komponente immer ein Index sein ("also alles von 0,1,2 .....").

Für die CPU, die diese Anweisung ausführt, kann der Inhalt von %edx eine von Ihnen gewählte Bedeutung haben! Es ist immer nur eine Nummer und das ist genau, warum wir Anweisungen wie leal (%edx, %edx, 4), %eax verwenden, um %eax = %edx * 5 zu berechnen.

+2

Ich möchte 'lea' erklären, indem ich sage, dass es sich um eine Shift-and-Add-Anweisung handelt, die zufälligerweise die Adressierungsmodus-Syntax und die Maschinencode-Codierung verwendet. –

Verwandte Themen