Zugegeben - bedeutend schlauer bin ich nicht noch nicht wirklich.
; ist das die Größe des 1. Parameters in Bytes?
$a=4
;nein, das ist der Parameter, der Integer der quadriert werden soll
Ok mich hatte an der Nummer verwundert, dass man die Werte bereits beim Erstellen des Codes einträgt. Wenn ich das aber richtig verstehe, geht es darum, dass man die Debugging-Funktionalität damit nutzen kann?
Traumziel wäre ein JIT-Compiler für derartige Sachen in AutoIt.
Aktuell stehe ich aber noch vor dem Problem, dass du ein Opcode vom Kompilat des gcc-Compilers ausgetauscht hast und ich (mangels ASM-Kenntnisse) nicht weiß warum das nötig ist.
Momentan sieht mein Grundgerüst auf Grundlage deiner Skripte folgendermaßen aus:
#AutoIt3Wrapper_UseX64=y
#include "JSON.au3" ; https://github.com/Sylvan86/autoit-json-udf
#include "Array.au3"
Global $sSourceCode = _
'double square(double num) {' & @LF & _
' return num * num;' & @LF & _
'}'
; klappt noch nicht (vermutlich weil hier der sqrt-Code nicht mit gelinkt ist)
;~ Global $sSourceCode = _
;~ '#include <math.h>' & @LF & _
;~ 'double squareroot(double num) {' & @LF & _
;~ ' return sqrt(num);' & @LF & _
;~ '}'
; get compiled code as binary struct
Global $tCode = _CodeToCallStruct($sSourceCode)
; run code
Global $aDll = DllCallAddress("double:cdecl", DllStructGetPtr($tCode), "double", 12)
_ArrayDisplay($aDll)
; takes a code as a string, compiles it and prepares it so that it can be called via DllCallAdress
Func _CodeToCallStruct($sCode, Const $sCompilerID = "cg142", Const $sLangId = "c", Const $sProxy = Default, Const $sCEServerDomain = "https://godbolt.org")
Local $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
; set proxy if neccesary
If IsKeyword($sProxy) <> 1 Then $oHTTP.SetProxy(2, $sProxy)
Local $mCompiled = _ce_compileCode($oHTTP, $sCode, $sCompilerID, $sLangID, Default, $sCEServerDomain)
; adapt the code by exchanging individual opcodes
Local $bCode = Binary("0x" & StringRegExpReplace($mCompiled.BinaryString, '(?i)7D|[[:xdigit:]]{2}(*SKIP)(?!)', "4D"))
Local $iNCode = BinaryLen($bCode)
; convert to a 64Bit aligned structure
Local $aStructMem = DllCall("kernel32.dll", "ptr", "VirtualAlloc", "ptr", 0, "ulong_ptr", DllStructGetSize(DllStructCreate("byte[" & $iNCode & "]")), "dword", 4096, "dword", 64)
Local $tCodeBuffer = DllStructCreate("byte[" & $iNCode & "]", Ptr($aStructMem[0]))
DllStructSetData($tCodeBuffer, 1, $bCode)
Return $tCodeBuffer
EndFunc
; compiles a code via a compiler explorer server and returns the asm-code and the binary
Func _ce_compileCode($oHTTP, $sCode, $sCompilerID, $sLangID = "c", $sCompilerFlags = Default, Const $sCEServerDomain = "https://godbolt.org")
Local $mPostData[]
$mPostData.source = $sCode
$mPostData.lang = $sLangID
Local $mOptions[]
If IsString($sCompilerFlags) Then $mOptions.userArguments = $sCompilerFlags
Local $mFilters[]
$mFilters.binary = True ; with this also opcodes are returned
$mFilters.binaryObject = True
$mOptions.filters = $mFilters
$mPostData.options = $mOptions
; do the api compile request
Local $sResponse
With $oHTTP
.Open("POST", $sCEServerDomain & "/api/compiler/" & $sCompilerID & "/compile", False)
.SetRequestHeader("Accept", "application/json") ; so that JSON comes back as return type
.setRequestHeader("Content-type", "application/json")
.Send(_JSON_Generate($mPostData))
$sResponse = .ResponseText
EndWith
; extract the asm code and the binary opcodes
Local $sASMCode = "", $sBinary = "", $mLine, $sOpCode, $mFuncs[], $iOffset = 0
For $mLine In _JSON_Parse($sResponse).asm
If Not MapExists($mLine, "text") Then ContinueLoop
If $mLine.text = "main:" Then ExitLoop
If StringRegExp($mLine.text, '^\w+:') Then
$mFuncs[StringLeft($mLine.text, StringInStr($mLine.text, ":", 1))] = $iOffset
EndIf
$sASMCode &= $mLine["text"] & @CRLF
If MapExists($mLine, "opcodes") Then
For $sOpCode In $mLine["opcodes"]
$sBinary &= $sOpCode
$iOffset += 1
Next
EndIf
Next
Local $mRet[]
$mRet.Code = $sASMCode
$mRet.Binary = Binary("0x" & $sBinary)
$mRet.BinaryString = $sBinary
$mRet.Funcs = $mFuncs
Return $mRet
EndFunc
Alles anzeigen
Eventuell kannst du Licht ins Dunkel bringen in welchen Fällen das versagt und in welchen es klappt und was dazu immer notwendig ist.