Assembler-Fragen

Für allgemeine Fragen zur Programmierung mit PureBasic.
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Assembler-Fragen

Beitrag von ¯\_(ツ)_/¯ »

ccode_new hat geschrieben:

Code: Alles auswählen

;Ich finde PureBasic gut, ...
OpenConsole()
PrintN("")
EnableASM
MOV rax,l_out_str
MOV rcx,rax
CALL qword [PB_PrintN]
DisableASM
Input()
CloseConsole()
End

DataSection
  out_str:  
  !dw 0x49, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x20, 0x50, 0x42, 0x20, 0x67, 0x75, 0x74, 0x2c
  !dw 0x20, 0x77, 0x65, 0x69, 0x6c, 0x20, 0x65, 0x73, 0x20, 0x65, 0x69, 0x6e, 0x65, 0x6e, 0x20, 0x49, 0x6e
  !dw 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x72, 0x20, 0x67, 0x69
  !dw 0x62, 0x74, 0x2e, 0
EndDataSection
@ccode_new: Geiler Code
Um mein Verständnis zu ASM zu verbesssern habe ich ein paar Fragen
1. Du kopierst l_out_str in Register rax. Warum fängt es mit l_ an? Das Label heisst doch nur out_str. Warum also mit l_ ?
2. Du kopierst von rax in rcx. Dh in beiden Registern stehen beide Inhalte. Ist das notwendig zwei Register mit dem selben Inhalt zu schreiben?
3. Wie hast du herausgefunden dass man den ASM Code so schreiben muss damit es genauso funktioniert wie wenn man PrintN(..) aufruft?

__________________________________________________
Thread geteilt
Was findet ihr an PB gut ?>Assembler-Fragen
Offtopic>Allgemein
06.10.2018
RSBasic
Bild
ccode_new
Beiträge: 1074
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Was findet ihr an PB gut ?

Beitrag von ccode_new »

Hallo ¯\_(ツ)_/¯ !

(Wichtig! Der Code muss mit EAX,... für 32bit angepasst werden.)
1. Du kopierst l_out_str in Register rax. Warum fängt es mit l_ an? Das Label heisst doch nur out_str. Warum also mit l_ ?
Siehe: https://www.purebasic.com/german/docume ... edasm.html

"Sprungmarken (Labels): Die Sprungmarken müssen in Kleinbuchstaben referenziert werden, wenn der Inline-ASM verwendet wird. Wenn Sie auf eine Sprungmarke verweisen, müssen Sie das Präfix 'l_' vor dem Namen einfügen."
Du kopierst von rax in rcx. Dh in beiden Registern stehen beide Inhalte. Ist das notwendig zwei Register mit dem selben Inhalt zu schreiben?
Übergibt den Rückgabewert als 1. Ganzzahl (Die Stringadresse) als "qword" - 8 Byte (64bit)

Die ersten vier Ganzzahl- oder Zeigerparameter werden in den Registern rcx, rdx, r8 und r9 übergeben.
3. Wie hast du herausgefunden dass man den ASM Code so schreiben muss damit es genauso funktioniert wie wenn man PrintN(..) aufruft?
PureBasic interne Funktionen werden mit "PB_" -Präfix und in [] bei Assembler angegeben.

(Die verwendete Funktion muss aber schon vorher bekanntgegeben werden. (Daher bei mir: PrintN("") )

Anbei: Variablen werden so in Assembler angegeben: [v_DeineVariable] (Also mit v_ -Präfix)
Betriebssysteme: MX Linux 19 / Windows 10 / Mac OS 10.15.7 / Android 7.0 ;)

Manchmal muß das Rad neu erfunden werden.
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Re: Was findet ihr an PB gut ?

Beitrag von ¯\_(ツ)_/¯ »

Danke für deine Hilfe sehr nett von dir :)
Du sag mal kann man auch den Aufruf von OpenWindow manipulieren? Ich hab mal weil mich das total interessiert den Compiler Parameter /COMMENTED ausprobiert.
Folgender Code:

Code: Alles auswählen

; If OpenWindow(0, 0, 0, 1000, 500, "Mein Fenster", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SUB    rsp,8
  PUSH   qword 13107201
  MOV    rax,_S1
  PUSH   rax
  PUSH   qword 500
  MOV    r9,qword 1000
  MOV    r8,qword 0
  MOV    rdx,qword 0
  MOV    rcx,qword 0
  SUB    rsp,32
  CALL   PB_OpenWindow2
  ADD    rsp,64
  AND    rax,rax
  JE    _EndIf2
Da wird PB_OpenWindow2 ausgeführt und meine Werte übergeben. Besteht die Möglichkeit die Parameter von PB_OpenWindow2 zu ändern? Du fragst dich bestimt warum soll ich das tun wollen, ich möchte den Class name ändern wenn es möglich ist.
Standartmäßig ist WindowClass_0 als Class name aber mir gehts nicht darum wegen Purebasic im Classname sondern mich stört es wenn jedes von PB erstellte Fenster den selben Class name hat. Im anderen Code greife ich mit API FindWindow zu und muss immer über den Titel das Fenster finden aber möchte lieber über den Class name.
Wie auch immer, ist es möglich die ASM Funktion PB_OpenWindow2 zu manipulieren? Kommt man überhaupt an den ASM Code von PB_OpenWindow2 ? Der Code muss doch bekannt sein weil alles an fasm.exe übergeben wird oder?
Bild
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Was findet ihr an PB gut ?

Beitrag von _JON_ »

¯\_(ツ)_/¯ hat geschrieben:Danke für deine Hilfe sehr nett von dir :)
Wie auch immer, ist es möglich die ASM Funktion PB_OpenWindow2 zu manipulieren? Kommt man überhaupt an den ASM Code von PB_OpenWindow2 ? Der Code muss doch bekannt sein weil alles an fasm.exe übergeben wird oder?
Nicht wirklich der Code ist nämlich schon kompiliert als Statische Library.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
ccode_new
Beiträge: 1074
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Was findet ihr an PB gut ?

Beitrag von ccode_new »

Kann bitte jemand die letzten (und diesen, und evtl. folgende) Beiträge in einen separaten Thread verlagern.

Das ganze passt hier nicht zum Thema.

ICH HABE KEINE AHNUNG OB MAN DEN WINDOWS-KLASSENNAME NACHTRÄGLICH ÄNDERN KANN,
ABER AN DIE ASM-INFORMATION VON "CALL PB_OpenWindow2" KOMMT MAN (soweit ich informiert bin) NICHT.
(Steht alles in /PureLibraries/Window)

Du könntest ja Windows-Api direkt verwenden.
RSBasic (oder jemand anderes) hilft dir da bestimmt weiter.

Dieser Beitrag sollte auch schon weiterhelfen: viewtopic.php?f=3&t=25771
Betriebssysteme: MX Linux 19 / Windows 10 / Mac OS 10.15.7 / Android 7.0 ;)

Manchmal muß das Rad neu erfunden werden.
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Re: Was findet ihr an PB gut ?

Beitrag von ¯\_(ツ)_/¯ »

Danke _JON_
1. Eine statische Library kann man bestimt auch disassemblieren und den String "WindowClass_0" ändern oder?
2. Kann man den geänderten ASM Code wieder zu eine statische Library machen und die statische Library im PB Ordner einfügen und ersetzen?
3. Ist das diese statische Library die du meinst? C:\Program Files\PureBasic\PureLibraries\Window
4. Ist die statische Library analog zur obj-Datei die man beim bekommt wenn man einen ASM Code kompiliert?
Bild
ccode_new
Beiträge: 1074
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Was findet ihr an PB gut ?

Beitrag von ccode_new »

Bei 1. endet deine PureBasic-Lizenz.

Das dürfte illegal sein. (wenn du es irgendwie schaffen solltest)

(Kann das bitte auch mit verschoben werden.)
Betriebssysteme: MX Linux 19 / Windows 10 / Mac OS 10.15.7 / Android 7.0 ;)

Manchmal muß das Rad neu erfunden werden.
RSBasic
Admin
Beiträge: 7882
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Assembler-Fragen

Beitrag von RSBasic »

ccode_new hat geschrieben:Kann bitte jemand die letzten (und diesen, und evtl. folgende) Beiträge in einen separaten Thread verlagern.
Erledigt

\\Edit:
ccode_new hat geschrieben:(Kann das bitte auch mit verschoben werden.)
Ebenfalls erledigt. :D
BildBildBildBild BildBild
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Assembler-Fragen

Beitrag von _JON_ »

1-2 - So einfach wird das sich nicht machen lassen.
3 - Ja, das sollte die lib sein (mit PB's "Verschlüsselung" :lol: )
4 - Eine statische Library ist ein Paket aus mehreren obj_Dateinen.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
RSBasic
Admin
Beiträge: 7882
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Assembler-Fragen

Beitrag von RSBasic »

@¯\_(ツ)_/¯
Benutze einfach den Code von ts-soft und edel, der im von ccode_new verlinkten Thread vorhanden ist.
Du kannst mit einem Macro so umbiegen, dass du den Funktionsnamen OpenWindow() in allen deinen Projekten nicht ändern musst.
Ansonsten besteht auch noch die Möglichkeit, den Klassennamen mit einem Hook (SetWindowsHookEx_() mit #WH_CBT und CBTProc-Callback mit #HCBT_CREATEWND) zu ändern. Das kannst du aber nur in deiner privaten Umgebung tun.
Oder du benutzt einen Hex-Editor und ersetzt in der Library-Datei "...\PureLibraries\Window" alle Zeichenketten "W i n d o w C l a s s _" durch deinen eigenen Klassennamen. Das geht zwar, aber dann hätten alle deine Fenster wieder denselben Klassennamen.
Oder du schreibst ein kleines Tool, um den Klassennamen deiner Executable-Datei nach der Kompilierung automatisiert zu ändern.
Ich finde die CreateWindow_()-Variante eher am besten.
BildBildBildBild BildBild
Antworten