Inline-Assembler - Ein paar Fragen

Anfängerfragen zum Programmieren mit PureBasic.
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Inline-Assembler - Ein paar Fragen

Beitrag von iostream »

Ich beschäftige mich seit kurzen mit Inline-Assembler in PB, habe es auch schon geschaft ne while-Schleife zu proggen :mrgreen:
Allerdings habe ich nun einige Fragen:

1. Wie sieht folgende Codes in Inline-Assembler aus?

Code: Alles auswählen

Definex x$
Define *lpsz

x$ = "Test"
*lpsz = @x$

Code: Alles auswählen

Define x$, y$, z$

x$ = "foo"
y$ = "bar"

z$ = x$ + y$

2. Ist es möglich PB-Funktionen im Inline-Assembler aufzurufen?
So a lá

Code: Alles auswählen

Define x$ = "Test"
! mov eax, Len(x$)

Mfg
iostream
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Ich glaube, dazu dürfte Dir evtl. die PB-Hilfe (F1 - Taste drücken) weiter helfen.

Beispiel: "Benutzung des Shell-Compilers"

Dort findest Du folgenden Eintrag:
PB-Hilfe hat geschrieben:/COMMENTED : erstellt eine kommentierte '.asm' Ausgabedatei beim Erstellen des Executable. Diese Datei kann später re-assembliert werden, wenn die notwendigen Modifikationen erfolgt sind. Diese Option ist nur für fortgeschrittene Programmierer bestimmt.
Bild
Win11 Pro 64-Bit, PB_6.11b1
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Beitrag von iostream »

Schon mal sehr hilfreich, thx :mrgreen:

Code: Alles auswählen

CALL   SYS_AllocateString
Sind Prozedur-Namen mit SYS_* API-Aufrufe? Weil anscheinend passiert das was ich wissen will (die eigentliche Zuweisung) irgendwie in dieser Prodzedur...oder steh ich gerade irgenwie auf dem Schlauch?
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Nein die gehoeren zu PB. Die normalen PB Funktionen haben ein "_PB_"
vor dem eigentlichen Funktionsnamen. Was genau willst du denn machen?
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Beitrag von iostream »

edel hat geschrieben:Was genau willst du denn machen?
Na ja ich entwickle gerade einen Java-Editor. Aufgrund von zu viel Zeit (Abi endlich vobei :mrgreen: ) und interesse an Assembler möchte ich gern die Prozedur,
die in meinem Scintilla-Gadget den autmatischen Zeileneinzug oganisiert, nach Inline-ASM konvertieren :roll:
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Ueber ASM kannst du die Funktionen z.b. so aufrufen.

Code: Alles auswählen

Define x.s = "Test"
Define r.l = 0

! extrn _PB_Len@4
! push dword [v_x]
! call _PB_Len@4
! mov [v_r],eax
  
Debug r
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Beitrag von iostream »

Thx erstmal, werde mich wohl noch ein wenig einarbeiten müssen ehe ich meine Prozedur nach ASM transferieren kann
:wink:
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Beitrag von iostream »

Habe mir jetzt folgenden Code zusammengeschustert:

Code: Alles auswählen

Global buffer$

! extrn _PB_Space@8

! mov eax, [_PB_StringBasePosition]
! push eax
! push eax
! push dword 25
! call _PB_Space@8
! lea ecx, [v_buffer$]
! pop edx
! call SYS_AllocateString

Debug Len(buffer$)

End
Was hat _PB_StringBasePosition für eine Bedeutung?
(Ok, ich habe es mal debuggt, es ist 0)
Warum wird zweimal eax gepusht obwohl die Aufrufgröße von _PB_Space 8 ist?

Warum gerade "pop edx"?
Und warum wird bei SYS_* Aufrufen keine Callsize angegeben?


Sorry für die vielen Fragen :roll:
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Beitrag von Vera »

Hallo,
ich hatte letzte Tage im englische Forum einen Hinweis auf einen französischen Programmierer gefunden, der auf seiner Page u.a. auch ein Assembler-Tool für die PB-IDE anbietet:

PureASM Version 2 Bêta 8
http://www.rx14.info/public/index.php?a=PureASM (DL=Telecharger)

"PureASM ist ein Assembler-Editor der speziell für PureBasic entwickelt wurde. Hiermit läßt sich die vom PBCompiler erzeugte Assembler-Datei anzeigen und auch weiterbearbeiten. Man kann es sowohl alleine benutzen, als auch als IDE-Tool intergrieren (Argument %FILE)."
Weiter heißt es dort, dass das Tool zu 80% seiner Vorstellungen entwickelt ist, man es nicht bei zu großen oder wichtigen Projekten anwenden sollte und die Weiterentwicklung nun innerhalb einer anderen Anwendung fortgeführt wird.


Es ist natürlich alles auf französisch, aber ggf. erkennt man doch durch Ausprobieren was es so macht und kann und vielleicht ist es sogar ein hilf- und lehrreiches Tool.

Gruß ~ Vera
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Beitrag von NicknameFJ »

Hallo iostream,

der Inhalt von _pb_StringBaseposition wird mit mov ins eax Register geschoben. Dieser Wert wird später nochmal benötigt und daher auf den Stack geschoben. Anschließend werden die 8 Byte die von _PB_Space benötigt werden auf den Stack geschoben.

Dass hier EAX zweimal auf dem Stack landet hat mit _PB_space nichts zu tun, sondern damit, dass der Inhalt von EAX später nochmal benötigt wird.

_PB_Space bereinigt den Stack um die 8 Byte die es ausgelesen hat, so dass nach Rückkehr von _PB_Space nur noch der Wert vom ersten PUSH EAX auf dem Stack liegt. Dieser wird mit POP EDX vom Stack geholt, da die Routine SYS_AllocateString diesen Wert in EDX erwartet.

Ich hoffe meine Erklärung ist verständlich und hilfreich.

Grüße NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Antworten