Seite 1 von 2
FASM in einer DLL
Verfasst: 07.05.2006 19:41
von MVXA
Hi,
ich hab mir Heute den Tag genommen um FASM für ein Projekt in eine
DLL zu quetschen. Hier ist das Resultat samt Beispielcode zu bewundern:
http://www.mvxa.net/WIN32_DLL.zip
//Edit:
schlagt mich ruhig wegen meinem Assembler Stil. Ich wusste nicht wie
der STDCall Kopf aussieht.
wusste nich so ganz wohin damit.
Verfasst: 08.05.2006 00:23
von ts-soft

Funzt einwandfrei, ersten Test hat er einwandfrei übersetzt, mach weiter.
PS: ein bissel Doku wäre nicht schlecht!
Verfasst: 09.05.2006 17:46
von MVXA
Code: Alles auswählen
Prototype FASM_ApplyCallBack(A.l, *pB.Long)
Global sASMSource.s
Global lReadPos.l
Global lBinary.l
Procedure CLB_Print(*pBuffer.Byte)
If *pBuffer
;Debug PeekS(*pBuffer)
Print(PeekS(*pBuffer))
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure CLB_Open(*pDateiName.Byte, lMode.l)
Protected lReturn
If *pDateiName
Select lMode.l
Case 1
If PeekS(*pDateiName) = "INPUT"
lReturn = 2
Else
lReturn = ReadFile(#PB_Any, PeekS(*pDateiName))
EndIf
Case 2
lReturn = 3
EndSelect
Debug "> Öffne Datei: " + PeekS(*pDateiName) + " ("+Str(lReturn)+")"
ProcedureReturn lReturn
Else
ProcedureReturn -1
EndIf
EndProcedure
Procedure CLB_Write(lFileID.l, *pBuffer.Byte, lSize.l)
lBinary = AllocateMemory(lSize+1)
CopyMemory(*pBuffer, lBinary, lSize)
ProcedureReturn #True
EndProcedure
Procedure CLB_Read(lFileID.l, *pBuffer.Byte, lSize.l, *pRead.Long)
If lFileID And *pRead
If lFileID = 2
CopyMemory(@sASMSource, *pBuffer, lSize)
*pRead\l = lSize
Else
*pRead\l = ReadData(lFileID, *pBuffer, lSize)
EndIf
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure CLB_Close(lFileID.l)
If lFileID
If (lFileID <> 2) And (lFileID <> 3)
ProcedureReturn CloseFile(lFileID)
Else
ProcedureReturn #True
EndIf
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure CLB_Seek(lFileID.l, lDistanz.l, lMode.l)
If lFileID
If lFileID = 2
If lMode = 2
ProcedureReturn (Len(sASMSource) - lDistanz)
Else
ProcedureReturn 0
EndIf
Else
ProcedureReturn SetFilePointer_(FileID(lFileID), lDistanz, 0, lMode)
EndIf
EndIf
EndProcedure
Procedure CLB_EnVar(*pName.Byte, *pBuffer.Byte, lSize.l)
Shared sIncFolder.s
If *pName And *pBuffer
Select PeekS(*pName)
Case "INCLUDE"
PokeS(*pBuffer, sIncFolder, lSize)
ProcedureReturn MemoryStringLength(*pBuffer)
EndSelect
Else
ProcedureReturn #False
EndIf
EndProcedure
If OpenLibrary(1, "FASM.DLL")
ApplyCallback.FASM_ApplyCallBack = GetFunction(1, "ApplyCallBack")
OpenConsole()
If Not ApplyCallback(1, @CLB_Print()): End 1: EndIf
If Not ApplyCallback(2, @Clb_Open() ): End 2: EndIf
If Not ApplyCallback(3, @CLB_Write()): End 3: EndIf
If Not ApplyCallback(4, @CLB_Read() ): End 4: EndIf
If Not ApplyCallback(5, @CLB_Close()): End 5: EndIf
If Not ApplyCallback(6, @CLB_Seek() ): End 6: EndIf
If Not ApplyCallback(7, @CLB_EnVar()): End 7: EndIf
sIncFolder = "D:\Compiler\fasm\INCLUDE\"
sASMSource + "USE32" + #CRLF$
sASMSource + "mov eax, 42" + #CRLF$
sASMSource + "ret" + #CRLF$
CallFunction(1, "SetInputFile", "INPUT")
CallFunction(1, "StartAssemble")
If lBinary
If VirtualProtect_(lBinary, MemorySize(lBinary)+1, #PAGE_EXECUTE_READWRITE, @lOldProt.l)
MessageRequester("FASM JITC", Str(CallFunctionFast(lBinary)))
VirtualProtect_(lBinary, MemorySize(lBinary)+1, lOldProt, @lOldProt.l)
EndIf
FreeMemory(lBinary)
EndIf
Input()
EndIf
Beispiel für JIT compilieren. Ne Frage habe ich aber noch:
~100 mal angesehen aber bis jetzt hat sich nur TS Soft gemeldet.
Feedback ist erwünscht, nur so zur Info.
Verfasst: 10.05.2006 18:08
von edel
Exe wird zwar erstellt , aber ich kann keine Pfadangaben machen wenn Leerzeichen vorhanden sind (SetOutputFile) .
Ansonsten kann ich mich ts nur anschliessen .
ps : Doku waer nicht schlecht

Verfasst: 13.05.2006 00:50
von edel
Machst du hier noch weiter ?
Verfasst: 13.05.2006 01:03
von MVXA
Sry, hatte die Woche nicht viel Zeit. Heute werde ich mich darum bischen
kümmern und noch eine Userlib veröffentlichen, die FASM enthält

.
> aber ich kann keine Pfadangaben machen wenn Leerzeichen
> vorhanden sind (SetOutputFile) .
Haste irgendwie ein kleines Beispiel für mich?
Verfasst: 13.05.2006 01:31
von edel
MVXA hat geschrieben:Sry, hatte die Woche nicht viel Zeit. Heute werde ich mich darum bischen
kümmern und noch eine Userlib veröffentlichen, die FASM enthält

.
MVXA hat geschrieben:
> aber ich kann keine Pfadangaben machen wenn Leerzeichen
> vorhanden sind (SetOutputFile) .
Haste irgendwie ein kleines Beispiel für mich?
C:\Dokumente und Einstellungen[...]
Verfasst: 16.05.2006 00:02
von MVXA
Soa, alles ist bereinigt, ich wollte eigentlich schon gestern oder so die
neue Version hoch laden. Habs aber gelassen. Dann wollte ich die
Heute hoch laden aber Stronghold Crussader, was ich mir heute ge-
kauft hab, hat mich zusehr gefesselt. Ich hoffe morgen bekomme
ich meinen fetten Hinterteil dazu die Version upzuloaden. sry

Verfasst: 18.05.2006 23:08
von MVXA
Verfasst: 18.05.2006 23:12
von edel
Danke
Musst du ein breiten Hintern haben (-;