Seite 8 von 9
Re: FindMapElement
Verfasst: 29.06.2014 20:19
von Martin66119
Hallo nochmals,
muss doch noch was nachfragen wegen ASM. Ich habe einen Disassembler hier gefunden. Nun wollte ich den kompletten Code mal rauscopieren und in den InlineAssembler des PB aufnehmen und wieder compilieren. Doch ich finde keine Funktion im Disassember um den Code rauszukopieren. Gibt es da eine Möglichkeit?
Danke schonmal
Re: FindMapElement
Verfasst: 29.06.2014 21:30
von NicTheQuick
Du kompilierst das mit PB, disassemblierst es wieder, und willst es wieder in PB stecken? Was erhoffst du dir davon? Und warum reicht dir der ASM-Output vom PB-Compiler nicht?
Re: FindMapElement
Verfasst: 29.06.2014 23:43
von STARGÅTE
NicTheQuick hat geschrieben:Du kompilierst das mit PB, disassemblierst es wieder, und willst es wieder in PB stecken?
Mensch Nic, das ist doch eine bewehrte Methode um seinen Code immer um 25% schneller zu machen.
Das kennst du doch vom komprimieren von Dateien. Du musst deine Zip-Dateien nur immer wieder in weitere Zip-Dateien packen, und kannst so jede Datei auf nur wenige Bytes komprimieren.
(*Sarkasmusschild hochhalt*)
@Martin:
Du kannst den ASM-Code den du disassembled hast nicht als PB-ASM code kompilieren.
Der ASM-Code enthält bereits feste offsets, sodass es zu kollisionen kommt, wenn du ihn mit PB wieder kompilieren willst.
Du kannst ihn dir natürlich angucken und studieren.
Re: FindMapElement
Verfasst: 30.06.2014 10:32
von Martin66119
Guten Morgen,
das was ihr schreibt habe ich nicht vor. Das weiß ich dass das nicht geht und nichts bringt. Ich möchte nur den disassemblierten Code mal sehen. Und das was ich vorhabe ist was ganz anderes.
z.B.
For i = 1 to 10
next i
Wie schaut das nach dem compilieren und disassemblieren aus. Das interessiert mich. Sonst nichts.
Grüße
Martin
Re: FindMapElement
Verfasst: 30.06.2014 10:43
von NicTheQuick
Schau mal in der Hilfe nach den Parametern für den Compiler. Mit dem Flag /COMMENTED kannst du dir den ASM-Code ausgeben lassen. Oder du suchst hier im Forum.
Aus deiner For-Next-Schleife wird dann z.B. folgendes:
Code: Alles auswählen
;
; PureBasic 5.30 Beta 4 (Linux - x64) - generated code
;
; (c) 2014 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; :System
; :Import
;
format ELF64
;
extrn memset
extrn exit
;
public PB_MemoryBase
public PB_ArgC
public PB_ArgV
macro pb_public symbol
{
public symbol
_#symbol:
symbol:
}
extrn SYS_InitPureBasic
section '.text' executable align 4096
public main
main:
MOV [PB_InitialStackValue],rsp
SUB rsp,40
MOV [PB_ArgC],edi
MOV [PB_ArgV],rsi
CALL SYS_InitPureBasic
; For i = 1 To 10
MOV qword [v_i],1
_For1:
MOV rax,10
CMP rax,qword [v_i]
JL _Next2
; Next i
_NextContinue2:
INC qword [v_i]
JNO _For1
_Next2:
_PB_EOP:
_PB_EOP_NoValue:
CALL PB_EndFunctions
MOV rsp,[PB_InitialStackValue]
MOV rdi,[PB_ExitCode]
CALL exit
PB_EndFunctions:
SUB rsp,40
ADD rsp,40
RET
section '.data' writeable
pb_public PB_DEBUGGER_LineNumber
dd -1
pb_public PB_DEBUGGER_IncludedFiles
dd 0
pb_public PB_DEBUGGER_FileName
db 0
pb_public PB_Compiler_Unicode
dd 0
pb_public PB_Compiler_Thread
dd 0
pb_public PB_Compiler_Purifier
dd 0
pb_public PB_Compiler_Debugger
dd 0
align 8
align 8
align 8
s_s:
dq 0
dq -1
align 8
_PB_BSSSection:
align 8
I_BSSStart:
PB_MemoryBase: rq 1
PB_ArgC: rd 1
PB_ArgV: rq 1
PB_ExitCode: rq 1
PB_InitialStackValue: rq 1
align 8
PB_DataPointer rq 1
v_i rq 1
align 8
align 8
align 8
align 8
I_BSSEnd:
section '.text' executable align 4096
section '.data' writeable
SYS_EndDataSection:
Re: FindMapElement
Verfasst: 30.06.2014 13:19
von STARGÅTE
Hier der "Kern":
Code: Alles auswählen
MOV qword [v_i], 1 ; Setze Variable i auf 1
_For1:
MOV rax, 10 ; Schiebe 10 in Register RAX
CMP rax, qword [v_i] ; Vergleiche Register RAX mit Variable i
JL _Next2 ; Wenn kleiner, springe zum ende der Schleife
_NextContinue2:
INC qword [v_i] ; Erhöhe Variable i um 1
JNO _For1 ; Springe bei keinem Überlauf zum Anfang der Schleife
_Next2:
Re: FindMapElement
Verfasst: 30.06.2014 16:12
von Martin66119
Herzlichen Dank!
Genau das habe ich gesucht. Werde heute Abend mal schauen was bei dem ein oder anderen Beispielcode als ASM herauskommt.
Grüße
Martin
Re: FindMapElement
Verfasst: 04.07.2014 23:57
von Martin66119
Guten Abend,
nun wollte ich weitermachen, doch etwas geht nicht. Folgendes habe ich im Forum gefunden, damit der ASM-Code erzeugt wird.
Tools:
Kommandozeile:
C:\Program Files\PureBasic\Compilers\pbcompiler.exe
Argumente:
"%FILE" /COMMENTED /INLINEASM
Arbeitsverzeichnis:
C:\Program Files\PureBasic\Compilers\
Name:
ASM-Output
Ereignis zum Auslösen des Werkzeugs:
Before Compile/Run
Wenn ich das eingetrahen habe, ist unter Tools der ASM-Output heißt.
Beim betätigen dieses Eintrages bzw. bei Compile/Run sieht man ganz kurz einen schwarzen Bildschirm. Doch die ASM-Datei finde ich nicht. Wo kann ich diese finden.
Grüße
Martin
Re: FindMapElement
Verfasst: 05.07.2014 07:16
von Danilo
Ich habe das so gemacht, dass ich ein Menü "Commented ASM" habe, und dann wird
der ASM-Output mit Notepad++ geöffnet. Für einen schnellen Blick auf den generierten
Source reicht mir das.
Das Tool:
Code: Alles auswählen
EnableExplicit
;COMPILER_OPTIONS$ = "/XP /USER"
#EDITOR$ = "D:\EDIT\Notepad++\notepad++.exe"
Procedure Main()
Protected pb_file$ = ProgramParameter(0)
Protected pb_file_dir$ = GetPathPart(pb_file$)
Protected asm_file$ = pb_file_dir$ + "PureBasic.asm"
Protected compiler_exe$ = GetEnvironmentVariable("PB_TOOL_Compiler")
Protected temp$ = GetEnvironmentVariable("TEMP")
Protected editor_exe$ = #EDITOR$
Protected compiler
Protected options$
If GetEnvironmentVariable("PB_TOOL_Debugger")="1"
options$ + " /DEBUGGER"
EndIf
If GetEnvironmentVariable("PB_TOOL_InlineASM")="1"
options$ + " /INLINEASM"
EndIf
If GetEnvironmentVariable("PB_TOOL_Unicode")="1"
options$ + " /UNICODE"
EndIf
If GetEnvironmentVariable("PB_TOOL_Thread")="1"
options$ + " /THREAD"
EndIf
If GetEnvironmentVariable("PB_TOOL_XPSkin")="1"
options$ + " /XP"
EndIf
If GetEnvironmentVariable("PB_TOOL_OnError")="1"
options$ + " /LINENUMBERING"
EndIf
If GetEnvironmentVariable("PB_TOOL_SubSystem")<>""
options$ + " /SUBSYSTEM " + GetEnvironmentVariable("PB_TOOL_SubSystem")
EndIf
;options$ + " /DLL"
DeleteFile(asm_file$)
DeleteFile(temp$ + "\PB_Commented.exe")
If (Len(pb_file$) > 0 And FileSize(pb_file$) > 0)
; the asm file is created in the working dir
compiler = RunProgram(compiler_exe$, Chr(34) + pb_file$ + Chr(34)+" /COMMENTED /EXE " + temp$ + "\PB_Commented.exe " + options$, pb_file_dir$, #PB_Program_Hide | #PB_Program_Wait)
If compiler
If FileSize(asm_file$) >= 0
RunProgram(editor_exe$, asm_file$,"")
Else
MessageRequester("ASM source not found !", Chr(34) + asm_file$ + Chr(34) + " not found.")
EndIf
EndIf
DeleteFile(temp$ + "\PB_Commented.exe")
Else
MessageRequester("PB source not found !", Chr(34) + pb_file$ + Chr(34) + " not found.")
EndIf
EndProcedure
Main()
; IDE Options = PureBasic 5.11 (Windows - x86)
; CursorPosition = 41
; Folding = -
; EnableUnicode
; EnableXP
; Executable = CommentedASM.exe
; CPU = 5
; DisableDebugger
; CompileSourceDirectory

Re: FindMapElement
Verfasst: 05.07.2014 23:39
von Martin66119
Guten Abend.
irgendwas klappt nicht. Den PB-Code habe ich nun in das Vereichnis kopiert, in dem pbcompiler.exe liegt (Der PB-Code hat den Namen m.pb). Aslo da, wo nach der Installation alles liegt. Nun habe ich mittels cmd
in den Ordner bewegt, in dem der code liegt und folgendes eingebenen.
pbcompiler /commented m.pb
Folges wird dann angezegt:
compiling m.pb
loading external libraries
Starting compilation
58 lines processed
Creating and launching executables
Error: Linker
POLINK: fatal error: Zugriff verweigert
Was mache ich denn falsch?