Gibt es einen Assembler Befehl, mit dem man mehrere Bytes der Länge n auf einmal verschieben kann?
-
Also in etwa so etwas:
mov destination source length
Wobei destination und source eine Adresse im Arbeitsspeicher ist und source auf den ersten Wert verweist. (vergleichbar einem pointer auf die erste Stelle eines Arrays)
Und length ist dann die Anzahl der Bytes die ab source gelesen und in einem Rutsch nach destination verschoben (oder kopiert bei nem Copybefehl) werden sollen.
-
Ja, es gibt Architekturen die so etwas erlauben.
-
Okay, ich hätte vielleicht dazuschreiben sollen, dass ich die x86 bzw. x64 Architektur meine.
-
Mehrere Bytes schrieb:
Okay, ich hätte vielleicht dazuschreiben sollen, dass ich die x86 bzw. x64 Architektur meine.
Einen einzelnen Befehl gibt es dafür nicht.
Es gibt aber die Stringbefehle, wie den MOVS-Befehl, den man zusammen in Kombination mit dem REP-Befehl verwenden kann.
Damit lassen sich (E)CX mal die Daten von DS:(E)SI nach ES:(E)DI entweder byteweise, Words, oder DWORDs kopieren. Die Adresszeiger von der Quelle und Ziel werden in Abhängigkeit vom Direction-Flag entweder jeweils erhöht, oder veringert und damit auf den nächsten Eintrag gesetzt. Der Vorgang wiederholt sich bis E(CX) null geworden ist.http://www.fermi.mn.it/linux/quarta/x86/movs.htm
Sonst kann man auch MMX, oder SSE-Register zum Kopieren verwenden und damit eine Schleife bilden.
Dirk
-
freecrac schrieb:
REP-Befehl
Das ist kein Befehl, sonder ein Befehlspräfix. Von daher kommt REP MOVSx der Forderung schon sehr nahe.
-
freecrac schrieb:
Mehrere Bytes schrieb:
Okay, ich hätte vielleicht dazuschreiben sollen, dass ich die x86 bzw. x64 Architektur meine.
Einen einzelnen Befehl gibt es dafür nicht.
Es gibt aber die Stringbefehle, wie den MOVS-Befehl, den man zusammen in Kombination mit dem REP-Befehl verwenden kann.
Damit lassen sich (E)CX mal die Daten von DS:(E)SI nach ES:(E)DI entweder byteweise, Words, oder DWORDs kopieren. Die Adresszeiger von der Quelle und Ziel werden in Abhängigkeit vom Direction-Flag entweder jeweils erhöht, oder veringert und damit auf den nächsten Eintrag gesetzt. Der Vorgang wiederholt sich bis E(CX) null geworden ist.http://www.fermi.mn.it/linux/quarta/x86/movs.htm
Sonst kann man auch MMX, oder SSE-Register zum Kopieren verwenden und damit eine Schleife bilden.
Dirk
THX, ich werde dann den MOVS Befehl nutzen.
-
Das kann so aussehen, die Vorteile von
Assembler werden jedoch erst merklich bei
längeren Strecken, und Ausnutzung aller
Erweiterungen des x86 Befehlssatzes.void CDraw::FillMem(DWORD fill,DWORD anz) { __asm { mov ebx, this mov edi, [ebx]CDraw.m_pTmp; mov eax,fill mov ecx,anz rep stosd } } void CDraw::MovMem(DWORD scr,DWORD anz) { __asm { mov ebx, this mov edi, [ebx]CDraw.m_pTmp; mov esi,scr mov ecx,anz rep movsd } }
Gruß K.