noobfrage: call auf addresse von variable (NASM)



  • hi.

    ich habe vor kurzem angefangen mich bisschen mit asm zu beschaeftigen.

    jetzt komme ich nicht weiter: ich habe 2 funktionen einer DLL importiert, (testFunc1 und testFunc2). ich will diese aber nicht direct callen, sondern die adresse einer der beiden in eine variable speichern, und dann den inhalt dieser variablen (die adresse) callen.

    also grob sowas:

    mov dword funcAddress, [testFunc1]
    call funcAdress
    

    allerdings funktioniert das offensichtlich so nicht. ich habe auch versucht den inhalt von funcAddress in ein register zu packen, aber das wollte auch nicht.

    was muss ich denn da beachten? habe das NASM manual schon gewaelzt ohne ende. vielleicht suche ich nur falsch und denke zu C-zentrisch.



  • Normalerweise ist die Grammatik so, das die Addresse der Variable mit Variablenname aufgerufen wird, und der Inhalt mit [Variable]
    In debug:

    Microsoft Symbolic Debug Utility
    Version 2.00
    (C) Copyright Microsoft Corp 1984, 1985, 1986
    Processor is [80386]
    -rbx
    BX 0000
    :200
    -e200
    1E6D:0200  00.c3
    -a100
    1E6D:0100 mov ax,bx
    1E6D:0102 call bx               ;oder eben ax
    ...
    -u200
    1E6D:0200 C3             RET
    1E6D:0201 0000           ADD    [BX+SI],AL
    1E6D:0203 0000           ADD    [BX+SI],AL
    

    Darüberhinaus braucht es für die Funktionen noch einen Return - oder du baust einfach ein paar Jumps ein, das ginge auch.



  • hat geklappt, vielen dank



  • loki1985 schrieb:

    hat geklappt, vielen dank

    Wäre nett, wenn Du die Lösung zeigen könntest, der Vollständigkeit halber und für die nächste Generation sozusagen...



  • abc.w schrieb:

    loki1985 schrieb:

    hat geklappt, vielen dank

    Wäre nett, wenn Du die Lösung zeigen könntest, der Vollständigkeit halber und für die nächste Generation sozusagen...

    ich habe den exakten code nicht mehr, aber das finale ziel war eine funktion zu haben in einer DLL, die die adresse einer 2ten funktion aus der DLL zurueckgibt, damit man diese dann per adresse direkt aufrufen kann. das ergebnis ist das hier:

    %include "win32n.inc"
    
    extern testFunc1
    import testFunc1 test.dll
    
    segment .data USE32
    
    testFunc2:   dd 0
    
    segment .code USE32
    
    WinMain:
    ..start:
    	call [testFunc1]
    	mov [testFunc2], eax
    	call [testFunc2]
    	ret
    


  • loki1985 schrieb:

    ich habe den exakten code nicht mehr

    Dann benutze ein Tool zur Versionsverwaltung - ich empfehle git. Ich hätte in diesem Fall z.B. einen "branch" gemacht, ausprobiert, getestet, rumgespielt und dann zurück auf den "master-branch" zurückgeschaltet. Auf jeden Fall wäre die Arbeit auf diese Weise gesichert, sie hatte ja schließlich Zeit gekostet.



  • abc.w schrieb:

    Dann benutze ein Tool zur Versionsverwaltung - ich empfehle git. Ich hätte in diesem Fall z.B. einen "branch" gemacht, ausprobiert, getestet, rumgespielt und dann zurück auf den "master-branch" zurückgeschaltet. Auf jeden Fall wäre die Arbeit auf diese Weise gesichert, sie hatte ja schließlich Zeit gekostet.

    ich nutze subversion. aber wegen 2 zeilen die anders sind werde ich keinen commit machen.


Anmelden zum Antworten