Beispiel für Übergabe und Rückgabe von Parametern an/von einer AutoItfunktion aus dem Assemblercode
Anbei ein Beispiel, wie man aus dem Assembler sehr einfach AutoIt-Funktionen aufrufen kann, und natürlich auch die Rückgabe dieser Funktionen auswerten kann.
Das kann man u.a. natürlich sehr schön zum Debuggen des Assemblercodes verwenden!
Falls man Werte/Registerinhalte innerhalb des Assemblercodes überprüfen möchte, ist das eine sehr einfache Möglichkeit!
Spoiler anzeigen
#include <FASM.au3>
#include <Array.au3>
#include <MemoryDll.au3>
;Beispiel für Übergabe und Rückgabe von Parametern an und von AutoIt-Funktionen
[/autoit] [autoit][/autoit] [autoit];AutoItfunktion erstellen, 3 Parameter
func _Testfunc($integer,$float,$string)
msgbox(0,"Parameter aus dem Assemblercode", _
"Integer: "&$integer&@crlf& _ ;INTEGER
"Float: "&$float&@crlf& _ ;FLOAT
"Text: "&$string&@crlf ) ;String
return 66 ;Rückgabewert an das Assemblerprogramm
endfunc
;Callback-Adresse festlegen
;Reihenfolge der Funktionsparameter wie bei der AutoIt-Funktion
$Func = DllCallbackRegister("_Testfunc", "int","int;float;str")
Dim $Fasm = FasmInit()
FasmReset($Fasm)
_("use32")
_("org " & FasmGetBasePtr($Fasm))
_("mov eax,44") ;Integer belegen
;Parameter an die AutoItfunktion auf den Stack pushen!
;Beachten, daß LIFO, der zuerst gepushte Parameter ist der letzte der Funktion!
_("push _teststring") ;dritter Parameter der AutoIt-Testfunc bei Strings nur die Adresse!
_("push [_float]") ;zweiter Parameter der AutoIt-Testfunc ansonsten den INHALT der Variablen
_("push eax") ;erster Parameter der AutoIt-Testfunc
_("call " & DllCallbackGetPtr($Func))
;der call bereinigt den Stack, daher KEINESFALLS POPen!
_("shr eax, 1") ;rückgabe aus dem call in EAX shiftright 1 = geteilt durch 2
_("ret")
;variablen
_("_float dd 3.1415926")
_("_teststring db 'Hallo, das ist ein Text',0")
ConsoleWrite(String(FasmGetBinary($Fasm)) & @CRLF)
$Ret = MemoryFuncCall("int", FasmGetFuncPtr($Fasm))
msgbox(0,"Rückgabe aus der AutoItfunktion","EAX / 2 = "&$ret[0])
DllCallbackFree($Func) ;Funktion freigeben
FasmExit($Fasm)
Func _($str) ; Nur für die bequemlichkeit ![]()
Fasmadd($Fasm,$str)
EndFunc ;==>f
exit