Array ansprechen



  • Hi, ich hab keine Ahnung von Assembler, will es aber trotzem benutzen 🙄 weil ich den xchg-Befehl brauche um ein Bitmap etwas schneller zu spiegeln.

    Folgenden Code habe ich:

    DWORD* pData = Bitmap;
    i=0;
    j=breite;
    
    while( i < j )
    {
        __asm
        {
            xchg  pData[i], pData[j]
        }
        ++i;
        --j;
    }
    

    Der Fehler ist klar, ich benutze C++ Schreibweise zur Addressierung. Könnt Ihr mir bitte kurz schreiben wie es richtig heißen müsste?

    [ Dieser Beitrag wurde am 11.01.2003 um 01:04 Uhr von 0x00000001 editiert. ]



  • der xchg-befehl wird dir so nicht viel nützen zur Beschleunigung, weil da nur ein Operand eine Speicheradresse sein darf (wie bie jedem x86-Befehl). Ergo müsstest du einen der Operanden in ein Register laden, vertauschen und einen Operanden wieder speichern. Ich weiß nicht ob das in Assembler noch schneller wäre als das was der Compiler produzieren kann. Vor allem weil man nicht sicher sagen kann, was der Compiler noch für sich belegt, man kanns natürlich versuchen. In dem Fall wäre passender Code (für das Register eax):

    mov eax, pData[i]
    xchg eax, pData[j]
    mov pData[i], eax

    Aber ich schätze der Compielr kann das mindestens genauso gut.



  • Danke TriPhoenix, ich dachte ich könnte die Kopiererei mit dem xchg weglassen, aber wenn das so ist dann bringt mir das echt nix.



  • Mögliche und sinvolle Optimierungen könntest du durch das Nutzen von MMX oder anderen SIMD-Befehlen erreichen. Bin mir nicht sicher, ob das irgendein Compiler automatisch kann.

    mfg
    -bg-


Anmelden zum Antworten