Unterschied zwischen lea und offset
ar db "Defference $"
Was ist der Unterschied zwischen
mov dx,offset ar
und
lea dx,ar
Ich denke, beide machen dieselbe Arbeit, aber was ist der Unterschied zwischen diesen beiden
- der einzige Unterschied zwischen Ihnen ist, dass
lea
ist eine Anweisung undoffset
ist nicht - Mögliche Duplikate von Was ist der Unterschied zwischen MOV und LEA?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In diesem use-case, LEA und MOV die gleiche Sache zu tun. LEA ist mächtiger als MOV, wenn Sie berechnen möchten, eine Adresse in einer komplexeren Art und Weise.
Können zum Beispiel sagen Sie, dass Sie möchten, um die Adresse der n ' te Zeichen im array, und das n ist gespeichert in bx. Mit MOV-schreiben Sie die folgenden beiden Anweisungen:
Mit lea können Sie es mit nur einer Anweisung:
Andere Sache zu prüfen, hier: die
add dx,bx
Anweisung ändern Sie die status-flags der CPU. Die Zugabe erfolgt im inneren deslea dx, [ar + bx]
Unterricht auf der anderen Seite nicht zu einer änderung des flags in keiner Weise, denn es ist nicht als eine arithmetische Anweisung.Dies ist manchmal hilfreich, wenn Sie beibehalten möchten, die Fahnen, während Sie ein paar einfache Berechnungen (Adresse Berechnungen sind sehr Häufig). Speichern und wiederherstellen der flag-register ist machbar, aber ein langsamer Vorgang.
offset ar
- ist ein direkter Wert, der berechnet wird während der übersetzung. Undlea
- ist die aktuelle Prozessor-Anweisung "Lade Effektive Adresse" mit dem zweiten Operanden, welche Hinweise auf memmory.lea
auf eine absolute Adresse, diedisp16
ist die gleiche wie dieimm16
für diemov
beide auf die gleiche Weise berechnet zu montieren Zeit (eigentlich zur link-Zeit, wenn die Letzte Adresse bekannt ist).lea
lädt nichts (Referenz ist nur ein Verweis). Ich sagte, dass es eine echte x86-Instruktion. Wenn Sie calculatons, das getan werden kann während der übersetzung können Siemov
.lea
ist die syntax von Compiler und Debugger.lea ax, [addr]
für mich ist so etwas wie "etwas zu tun mit der Inhalt vonaddr
und das Ergebnis inax
, was nicht der Fall ist.offset
oderlea
austauschbar, die meisten der Zeit, aber die Arbeit mit der memory-Modelle anderer alstiny
würde eine Menge Probleme verursachen, daoffset
ist relativ zu den segment-Basis-Adresse, wo die Daten definiert.lea dx, [ar]
. Es ist ein byte länger alsmov
, und nicht schneller. Für eine statische Adresse mit kein register index Sie nur jemals wünschen LEA auf x86-64, für die RIP-relative (position-independent) 64-bit-Adressierung. Sonst, verwenden Sie immer die mov-unverzüglich, wenn Sie Sie brauchen, eine nur statische Adresse in ein register. (Auf x86-64 in position-abhängig codemov edi, offset mydata
ist noch immer optimal, z.B. unter Linux, wo statische Daten in der unteren 32 bits des virtuellen Adressraums, also 32-bit absolute Adressen verwendet werden können, für die Effizienz.)Zitat von Assembler für x86-Prozessoren, 7e, KIP R. IRVINE