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.


Anmelden zum Antworten