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.