Von PB erzeugten asm code anzeigen lassen...
Verfasst: 23.11.2007 22:19
Vielleicht ist es für die meisten kein Tipp und kein Trick, aber ich habe eigentlich recht lange nach einer Möglichkeit gesucht, mir den Assemblercode anzeigen zu lassen, den PB bei der Compilierung an den FASM Assembler schickt.
Daß der asm code für den kurzen Augenblick der Compilierung in einem Unterverzeichnis von %Temp liegt, hatte ich ja schon mitbekommen, aber da kommt man halt schlecht ran, weil er gleich wieder gelöscht wird.
Ein Blick in die PB HIlfe unter "Benutzung des SHELL-Compilers" hat mir dann die Augen geöffnet.
Man muß nur den PBCompiler mit den richtigen Parametern aufrufen.
Ich habe mir dazu jetzt einen Eintrag in's PB-Werkzeuge-Menü gemacht, der mir den aktuellen Quellcode des PB Editors nach D: compiliert. Also so, daß unter D:\PureBasic.asm dann die Datei mit dem Assemblercode steht.
Folgende Einstellungen unter Werkzeug:
Jedes mal wenn ich das auswähle, erzeugt mir der Compiler unter D:\PureBasic.asm den code. Der Dateiname ist immer der gleiche.
Ggf. müsst ihr den Pfad zum PBCompiler anpassen.
Gruß Markus
Edit: Mist, funktioniert nicht, wenn der Code Konstanten aus den Compileroptionen nutzt. Die sind dem PBCompier dann nämlich nicht bekannt.
Edit2: Außerdem sieht man nicht was der PBCompiler anmeckert (wenn er meckert), weil das DOS-Fenster gleich wieder geschlossen wird.
Ich habe mir daher ein kleines Tool geschrieben, was das managed und sowohl die Compilermeldunegn, als auch den generierten ASM-Code anzeigt.
Sieht dann so aus:

Daß der asm code für den kurzen Augenblick der Compilierung in einem Unterverzeichnis von %Temp liegt, hatte ich ja schon mitbekommen, aber da kommt man halt schlecht ran, weil er gleich wieder gelöscht wird.
Ein Blick in die PB HIlfe unter "Benutzung des SHELL-Compilers" hat mir dann die Augen geöffnet.

Ich habe mir dazu jetzt einen Eintrag in's PB-Werkzeuge-Menü gemacht, der mir den aktuellen Quellcode des PB Editors nach D: compiliert. Also so, daß unter D:\PureBasic.asm dann die Datei mit dem Assemblercode steht.
Folgende Einstellungen unter Werkzeug:
Code: Alles auswählen
Kommandozeile:
C:\Programme\PureBasic\Compilers\PBCompiler.exe
Argumente:
%TEMPFILE /COMMENTED
Arbeitsverzeichnis:
D:\
Name:
Show ASM
Ggf. müsst ihr den Pfad zum PBCompiler anpassen.
Gruß Markus
Edit: Mist, funktioniert nicht, wenn der Code Konstanten aus den Compileroptionen nutzt. Die sind dem PBCompier dann nämlich nicht bekannt.
Edit2: Außerdem sieht man nicht was der PBCompiler anmeckert (wenn er meckert), weil das DOS-Fenster gleich wieder geschlossen wird.
Ich habe mir daher ein kleines Tool geschrieben, was das managed und sowohl die Compilermeldunegn, als auch den generierten ASM-Code anzeigt.
Sieht dann so aus:

Code: Alles auswählen
;
; ------------------------------------------------------------
;
; PB to ASM
;
; (c) 2007 - Markus Haacke
;
; ------------------------------------------------------------
;
; Wird als PB IDE-Tool eingebunden und erwartet als einzigen Paraneter den
; korrekten Pfad der umzuwandelden .pb Datei.
; Unter Benutzung des PBCompilers wird im Outputverzeichnis eine Datei namens
; "PureBasic.asm" und "PureBasic.exe" erstellt, die den Assemblercoode des
; aktuellen PB-Projektes enthält bzw. die ausführbare Datei.
;
; Die Ausgaben des PBCompilers und auch der Inhalt der erzeugten Assemblerdatei
; werden im Fenster von PB to ASM angezeigt.
; Der PBCompiler startet das Programm nach der Umwandlung automatisch, da kann
; ich nichts gegen machen. Also nicht erschrecken. ;-)
;
; Einrichtung dieses Tools in den PB-Werkzeugen
; 1) Die Konstanten #PBCOMPILER und #PBCOMPILEROUTPUTPATH anpassen
; 2) Dieses Tool compilieren
; 3) Einrichtung als Werkzeug (siehe unten)
;
; Kommandozeile: [Pfad zu diesem Tool]
; Argumente: "%FILE"
; Arbeitsverzeichnis: [egal]
; Name: PB to ASM
EnableExplicit
; ------------------------------------------------------------
; Konstanten-, Variablen- und Strukturdeklarationen
#PBCOMPILER = "C:\Programme\PureBasic\Compilers\PBCompiler.exe"
#PBCOMPILERPARAMETER = "/COMMENTED"
#PBCOMPILEROUTPUTPATH = "D:\" ; Wenn diese Konstante "" ist, dann wird die ASM-Datei im Source-Verzeichnis erstellt!
#EOL = Chr(13)+Chr(10)
Enumeration
#ASMFile
EndEnumeration
Enumeration
#Window_Main
EndEnumeration
Enumeration
#Editor_Log
EndEnumeration
Global temp.l, NumParameters.l, Compiler.l
Global Parameter$, Outputpath$, ASMText$
; ------------------------------------------------------------
Procedure Open_Window_Main()
If OpenWindow(#Window_Main, 280, 178, 600, 500, "PB to ASM (using the PBCompiler)", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Window_Main))
EditorGadget(#Editor_Log, 10, 10, 580, 480)
EndIf
EndIf
EndProcedure
Procedure InsertEditorText(Gadget,Text$)
ProcedureReturn SendMessage_(GadgetID(Gadget),#EM_REPLACESEL,0,Text$)
EndProcedure
; ------------------------------------------------------------
; Main
Open_Window_Main()
NumParameters = CountProgramParameters()
If NumParameters > 0
Parameter$ = ProgramParameter(temp)
If #PBCOMPILEROUTPUTPATH = ""
Outputpath$ = GetPathPart(Parameter$)
Else
Outputpath$ = #PBCOMPILEROUTPUTPATH
EndIf
DeleteFile(Outputpath$ + "PureBasic.asm") ; Vorherige Dateiversion löschen...
InsertEditorText(#Editor_Log, "Programmparameter: " + Parameter$ + #EOL + #EOL)
Compiler = RunProgram(#PBCOMPILER, #PBCOMPILERPARAMETER + " " + Chr(34) + Parameter$ + Chr(34), Outputpath$, #PB_Program_Read|#PB_Program_Open)
If Compiler
While ProgramRunning(Compiler)
While AvailableProgramOutput(Compiler)
InsertEditorText(#Editor_Log, ReadProgramString(Compiler) + #EOL)
Wend
Wend
EndIf
If ReadFile(#ASMFile, Outputpath$ + "PureBasic.asm")
ASMText$ = #EOL + "----------------- ASSEMBLER-SOURCE -----------------" + #EOL + #EOL
While Eof(#ASMFile) = 0
ASMText$ + ReadString(#ASMFile) + #EOL
Wend
InsertEditorText(#Editor_Log, ASMText$)
Else
InsertEditorText(#Editor_Log, #EOL + "Die Assemblerdatei " + Chr(34) + Outputpath$ + "PureBasic.asm" + Chr(34) + " wurde nicht erstellt!")
EndIf
Else
MessageRequester("Fehler", "Es muß mindestens ein Programmparameter angegeben werden!" + #EOL + "Erwartet wird der Pfad und Dateiname des umzuwandelnden PureBasic Codes.", #MB_ICONERROR)
End
EndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow: End
EndSelect
ForEver