Von PB erzeugten asm code anzeigen lassen...

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Von PB erzeugten asm code anzeigen lassen...

Beitrag von Kurzer »

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. :shock: 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:

Code: Alles auswählen

Kommandozeile:
  C:\Programme\PureBasic\Compilers\PBCompiler.exe
Argumente:
  %TEMPFILE  /COMMENTED
Arbeitsverzeichnis:
  D:\
Name:
  Show ASM
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:
Bild

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
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.