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
Bild
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 . :allright:

ps : Doku waer nicht schlecht :D

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 ;).
:allright:
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 :coderselixir:

Verfasst: 18.05.2006 23:08
von MVXA

Verfasst: 18.05.2006 23:12
von edel
Danke :)


Musst du ein breiten Hintern haben (-;