Zeiger in ASM



  • Ich versuche ein wenig in ASM einzusteigen. Dazu benutze ich den InlineAssembler von VisualC++

    Das habe ich schon hibekommen:

    int test(int a, int b)
    {
        __asm
        {
            mov eax,a
            add eax,b
            mov a,eax
        }
        return a;
    }
    

    Wie funktioniert das mit Zeigern?

    void test2(int* a; int* b)
    {
        __asm
        {
            ????
        }
    }
    


  • Da liegen in a und b die Adressen:

    void test2(int* a, int* b)
    {
        __asm
        {
            mov eax, [a]
            add eax, [b]
            mov [a], eax
        }
    }
    

    [] entspricht so quasi dem * in C. Ohne Garantie (ungetestet ;))

    [ Dieser Beitrag wurde am 11.04.2003 um 23:54 Uhr von TriPhoenix editiert. ]



  • funktioniert nicht ?



  • So, nun gehts 🙂

    void test2(int* a, int* b)
    {
        __asm {
            mov esi, a
            mov edi, b
            mov eax, [esi]
            add eax, [edi]
            mov [esi], eax
        }
    }
    

    Man lädt also erst die Werte der Zeiger in Register und dereferenziert dann via [].



  • Warum werden nicht die Register ebx und ebp benutzt. Das verstehe ich in ASM nicht. Genauso eax oder ecx ich meine die könnten doch das selbe machen.



  • Da kannst du die Register benutzen die du willst, nur ESP/EBP solltest du tunlichst in ruhe lassen, die Werden für Funktionsaufrufe gebraucht. Ansonsten kannst du die Tätigkeit verlagern wie du willst. Nur ganz bestimtme Befehle brauchen ihre Daten in bestimmten registern, abe rnihct für sowas allgemeines.
    Es ist nur halt Konvention:
    - eax hält rechenergebnisse
    - ebx ist ein index
    - ecx ist ein zähler
    - edx ist ein datenzeiger
    - esi ist ein datenzeiger (source)
    - edi ist ein datenzeiger (destination)

    ob man sich dran halten will oder nicht ist geschmackssache 🙂



  • Ich finde es gerade schön, dass man da alle Register zum indirekten Adressieren benutzen kann. Im Realmode ging das schließlich nicht! Da war man auf BP, BX, SI und DI beschränkt und zwar (soweit ich mich erinnere) folgendermaßen:

    [Basisregister+Indexregister+Displacement]

    Basisregister = BP oder BX
    Indexregister = SI oder DI
    Displacement = 16-bit Zahl

    Im Protected Mode wird da schon weitaus mehr erlaubt:

    [reg32+reg32*scale+displacement]

    reg32 = beliebiges 32-bit Register
    scale = 1, 2 oder 4
    displacement = 32-bit Zahl



  • Das hat weniger etwas mit RealMode oder ProtectedMode zu tun sondern vielmehr mit 32Bit oder 16Bit Addressierung.
    Beides kann auch im RealMode verwendet werden.



  • @Nobuo_t: Sorry, bin's halt so gewöhnt, dass ich im Realmode nur via 16 bit Register adressiere.


Anmelden zum Antworten