2010-05-09 3 views
9
ar db "Defference $" 

Was ist der Unterschied zwischenUnterschied zwischen lea und Offset

mov dx,offset ar 

und

lea dx,ar 

denke ich beide tun gleiche Arbeit, aber was ist der Unterschied zwischen diesen beiden

Antwort

14

In diesem Anwendungsfall machen LEA und MOV dasselbe. LEA ist leistungsfähiger als MOV, wenn Sie eine Adresse auf eine komplexere Weise berechnen möchten.

Nehmen wir zum Beispiel an, Sie möchten die Adresse des n-ten Zeichens in Ihrem Array erhalten, und das n wird in bx gespeichert. Mit MOV müssen Sie die beiden folgenden Anweisungen schreiben:

Mov dx, offset ar 
add dx, bx 

mit lea können Sie es mit nur einem Befehl:

lea dx, [ar + bx] 

Eine andere Sache, hier zu berücksichtigen: die add dx,bx Anweisung werden die Statusflags ändern der CPU. Die Hinzufügung innerhalb des lea dx, [ar + bx]-Befehls andererseits ändert die Flags in keiner Weise, da sie nicht als arithmetischer Befehl betrachtet wird.

Dies ist manchmal hilfreich, wenn Sie die Flags beibehalten möchten, während Sie einfache Berechnungen durchführen (Adressberechnungen sind sehr häufig). Das Speichern und Wiederherstellen des Flag-Registers ist möglich, aber ein langsamer Vorgang.

+3

Auch 'Offset ar' - ist sofort Wert, der während der Übersetzung berechnet. Und "lea" - ist die tatsächliche Prozessoranweisung "Load Effective Address" mit dem zweiten Operanden, der auf den Speicher verweist. – ony

+1

@ony: 'lea' ist nur eine Shift-and-Add-Anweisung. Es wird nie tatsächlich aus dem Speicher geladen, sondern verwendet nur die Adressierungsmodus-Syntax und die Binärcodierung. Im Falle des OPs, mit 'lea' an einer absoluten Adresse, ist das' disp16' dasselbe wie das 'imm16' für das' mov', beide berechnet zur Assemblierungszeit (tatsächlich zur Verbindungszeit, wenn die letzte Adresse ist) bekannt). –

+0

@PeterCordes, ich sagte nicht, dass 'lea' irgendwas lädt (Referenz ist nur eine Referenz). Ich sagte, dass es eine echte x86-Anweisung ist. Wenn Sie Berechnungen durchführen, die während der Übersetzung durchgeführt werden können, können Sie 'mov' verwenden. – ony

0

Zitat von Assembly Language für x86-Prozessoren, 7e, KIP R. IRVINE

Es ist nicht möglich, die Adresse eines Stapels Parameter zu erhalten, weil nur funktioniert bei der Kompilierung bekannt mit Adressen Offsets OFFSET. Die folgende Anweisung würde montieren nicht:

mov esi,OFFSET [ebp-30]  ; error