wake-up-neo.com

Zweck der Register ESI und EDI?

Was ist der eigentliche Zweck und die Verwendung der EDI & ESI in Assembler?

Ich weiß, dass sie zum einen für String-Operationen verwendet werden.

Kann jemand auch ein Beispiel geben?

111
Tony The Lion

Es gibt einige Operationen, die Sie nur mit DI/SI ausführen können (oder deren erweiterten Gegenstücken, wenn Sie 1985 ASM nicht gelernt haben). Darunter sind

REP STOSB
REP MOVSB
REP SCASB

Das sind jeweils Vorgänge zum wiederholten (= Massen-) Speichern, Laden und Scannen. Sie richten SI und/oder DI so ein, dass sie auf einen oder beide Operanden zeigen, setzen vielleicht eine Zählung in CX und lassen dann rippen. Hierbei handelt es sich um Vorgänge, die mit einer Reihe von Bytes gleichzeitig ausgeführt werden und die CPU automatisch aktivieren. Da Sie Schleifen nicht explizit codieren, erledigen sie ihre Aufgabe (normalerweise) effizienter als eine handcodierte Schleife.

Nur für den Fall, dass Sie sich fragen: Je nachdem, wie Sie die Operation eingerichtet haben, kann das wiederholte Speichern so einfach sein, dass der Wert 0 in einen großen zusammenhängenden Speicherblock geschrieben wird. Ich denke, MOVSB ​​wird verwendet, um Daten von einem Puffer (naja, ein paar Bytes) in einen anderen zu kopieren. und SCASB wird verwendet, um nach einem Byte zu suchen, das einem Suchkriterium entspricht (ich bin nicht sicher, ob es nur nach Gleichheit sucht oder was - Sie können es nachschlagen :))

Das ist das meiste, wofür diese Regs sind.

71
Carl Smotricz

Opcodes wie MOVSB ​​und MOVSW, die Daten aus dem Speicher, auf den ESI) verweist, effizient in den Speicher kopieren, auf den EDI verweist.

mov esi, source_address
mov edi, destination_address
mov ecx, byte_count
cld
rep movsb ; fast!
33
catfood

Zusätzlich zu den String-Operationen (MOVS/INS/STOS/CMPS/SCASB/W/D/Q usw.), die in den anderen Antworten erwähnt wurden, wollte ich hinzufügen, dass es auch "modernere" x86-Assembly-Anweisungen gibt, die implizit unter verwendet werden am wenigsten EDI/RDI:

Der Befehl SSE2 MASKMOVDQU (und der bevorstehende Befehl AVX VMASKMOVDQU) schreiben selektiv Bytes aus einem XMM-Register in den Speicher, auf den durch EDI/RDI verwiesen wird.

12
PhiS

Zusätzlich zu den Registern, die für Massenoperationen verwendet werden, sind sie nützlich für ihre Eigenschaft, durch einen Funktionsaufruf (call-preserved) in einer 32-Bit-Aufrufkonvention erhalten zu bleiben. ESI, EDI, EBX, EBP, ESP) sind aufrufsicher, während EAX, ECX und EDX nicht aufrufsicher sind. Aufrufsichere Register werden von der C-Bibliotheksfunktion respektiert und ihre Werte bleiben erhalten die C-Bibliothek Funktionsaufrufe.

Jeff Duntemann hat in seinem Assembler-Sprachbuch einen Beispiel-Assembler-Code zum Drucken der Befehlszeilenargumente. Der Code verwendet esi und edi zum Speichern von Zählern, da diese durch die C-Bibliotheksfunktion printf unverändert bleiben. Für andere Register wie eax, ecx, edx kann nicht garantiert werden, dass sie nicht von den C-Bibliotheksfunktionen verwendet werden.

https://www.Amazon.com/Assembly-Language-Step-Step-Programming/dp/0470497025

Siehe Abschnitt 12.8 Wie C Befehlszeilenargumente sieht.

Beachten Sie, dass 64-Bit-Aufrufkonventionen sich von 32-Bit-Aufrufkonventionen unterscheiden, und ich bin nicht sicher, ob diese Register aufrufsicher sind oder nicht.

5
Jay Rajput