FASM in einer DLL

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

FASM in einer DLL

Beitrag 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.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Bild
Funzt einwandfrei, ersten Test hat er einwandfrei übersetzt, mach weiter.

PS: ein bissel Doku wäre nicht schlecht!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Machst du hier noch weiter ?
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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?
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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[...]
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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:
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Danke :)


Musst du ein breiten Hintern haben (-;
Antworten