FindMapElement

Anfängerfragen zum Programmieren mit PureBasic.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FindMapElement

Beitrag 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?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FindMapElement

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FindMapElement

Beitrag 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:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FindMapElement

Beitrag von STARGÅTE »

Hier der "Kern":

Code: Alles auswählen

For i = 1 to 10
Next i

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:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag 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
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag 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
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: FindMapElement

Beitrag 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
Bild
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag 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?
Antworten