Was ist die Aufgabe von "cld" und "rep movsb" in diesem Assembler Programm?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

MOVSB ist eine byteweise string move Einzeloperation. CLD gibt die Richtung an, also ob die Indexregister, welche auf Quelle und Ziel zeigen, inkrementiert oder dekrementiert werden. Dies ist bei Wiederholung von MOVSB und überlappenden Quelle und Ziel Blöcken wichtig, um Quelle nicht mit zu Ziel geschriebenen Daten zu überschreiben, bevor sie gelesen wurden. Da MOVSB byteweise Daten kopiert, werden die Indexregister auch nur um den Adressinkrement von einem Byte (also 1) verändert.

MOVSB wird üblicherweise mit der REP Präfixinstruktion verwendet, womit MOVSB wiederholt wird, und damit ganze Blöcke von Speicherinhalt kopieren kann.

In "modernem" assembly würdest du diese Operationen aber nicht mehr verwenden, da auscodierte Schleifen schneller als diese Mikrocode-CISC Instruktionen sind, allerdings stehen die aus Kompatibilitätsgründen nach wie vor zur Verfügung.

Woher ich das weiß:Berufserfahrung – hard meets soft
AchSo774 
Fragesteller
 07.03.2023, 16:43

Ja, ich weiß schon die Aufgabe von CLD und MOVSB im allgemein .

Aber meine Frage ist, warum wir diese in diesem Code verwendet haben ?

0
Bushmills145  07.03.2023, 16:49
@AchSo774

Warum *ihr* die verwendet, müsstest du eigentlich eher mir sagen können. Um den in der LODSB/STOSB kopierten Block zurück zum Ursprung zu kopieren, scheint mir. Aber zur Motivation, dies zu tun, kann ich dir nichts sagen, denn ob hier oder da, Daten sind Daten, und wenn kein spezifischer Grund besteht, diese wieder an der ursprünglichen Adresse zu haben, wäre meine Motivation dann, dies auch nicht zu tun.

1
Bushmills145  08.03.2023, 15:28

Danke schön für Sternchen!

0

In diesem Code werden die Werte der Variablen "len", "s1" und "s2" in die Register "ecx", "esi" und "edi" kopiert. Dann wird eine Schleife ausgeführt, um Bytes aus dem Speicher an der Adresse "esi" in das Register "al" zu laden, diese dann an die Adresse "edi" zu schreiben und dann die Adressregister "esi" und "edi" um eins zu erhöhen. Die Schleife wird so oft wiederholt, bis der Wert des "ecx" Registers auf Null gesetzt ist.

Nachdem die Schleife abgeschlossen ist, wird "cld" verwendet, um das "Direction Flag" im CPU-Register "FLAGS" zu löschen und sicherzustellen, dass Daten in die richtige Richtung kopiert werden. Dann wird "rep movsb" verwendet, um die restlichen Bytes von der Quelladresse zur Zieladresse zu kopieren. Die Anzahl der Bytes, die kopiert werden sollen, wird wiederum durch den Wert des "ecx" Registers bestimmt.

Zusammenfassend kopiert dieser Code einen Block von Speicher von der Quelladresse "s1" zur Zieladresse "s2". Der Code verwendet eine Schleife, um jedes Byte des Speicherblocks einzeln zu kopieren und erhöht dann die Adressregister "esi" und "edi". Sobald die Schleife abgeschlossen ist, wird der "rep movsb" Befehl verwendet, um den Rest des Speicherblocks zu kopieren.

Woher ich das weiß:Berufserfahrung – Startup zum weltweiten Unternehmen entwickelt.