Seite 1 von 2
ASM - Code
Verfasst: 17.02.2011 15:20
von hth
1. Kann mal jemand erklären, wie Purebasic aus diesem Assembler-Code
diesen Maschinencode erzeugt?
68 D0 26 00 00 E8 4D 30 00 00 B8 FF FF FF FF 68 E0 26 00 00 E8 3E 30 00 00 FF E0
2. Welche Register darf man denn nun verwenden?
Auszug aus der PB-Hilfe
MOV
ebx,l_myLabel
...
MyLabel:
- Die Fehler in einem ASM Programmteil werden nicht von PureBasic gemeldet, jedoch von FAsm. Überprüfen Sie einfach Ihren Programmcode, wenn ein solcher Fehler auftritt.
- Bei eingeschaltetem InlineASM können Sie keine ASM Schlüsselwörter als Namen für Sprungmarken benutzen.
- Die verwendbaren Register sind:
eax, edx und ecx. Alle anderen müssen immer reserviert bleiben.
hth
Re: ASM - Code
Verfasst: 18.02.2011 08:28
von Thorium
hth hat geschrieben:1. Kann mal jemand erklären, wie Purebasic aus diesem Assembler-Code
diesen Maschinencode erzeugt?
68 D0 26 00 00 E8 4D 30 00 00 B8 FF FF FF FF 68 E0 26 00 00 E8 3E 30 00 00 FF E0
Indem der Compiler es von FASM assemblieren lässt, verstehe die Frage jetzt nicht so wirklich.
hth hat geschrieben:
2. Welche Register darf man denn nun verwenden?
Vergiss den Inline Kram. Setze einfach ein Ausrufezeichen vor eine Assemblerzeile und sie wird ohne vom Compiler verarbeitet zu werden an FASM zum assemblieren weitergegeben. Somit hast du keine Einschränkungen und kannst alle Register verwenden und alle Befehlsatzerweiterungen.
Achte nur drauf das es Register gibt, die man sichern muss. Also auf den Stack pushen und am Ende des ASM Codes wieder vom Stack poppen.
Hier ein Beispiel:
http://www.purebasic.fr/german/viewtopi ... =8&t=21165
Dort wird mittels SSE 4.2 eine CRC32 berechnet.
Re: ASM - Code
Verfasst: 18.02.2011 08:50
von Nino
Thorium hat geschrieben:hth hat geschrieben:
2. Welche Register darf man denn nun verwenden?
Vergiss den Inline Kram. Setze einfach ein Ausrufezeichen vor eine Assemblerzeile und sie wird ohne vom Compiler verarbeitet zu werden an FASM zum assemblieren weitergegeben. Somit hast du keine Einschränkungen und kannst alle Register verwenden und alle Befehlsatzerweiterungen.
Achte nur drauf das es Register gibt, die man sichern muss. Also auf den Stack pushen und am Ende des ASM Codes wieder vom Stack poppen.
Ich glaube seine Frage war eben,
welche Register man sichern muss, da der von ihm zitierte Ausschnitt aus der Hilfe in diesem Punkt nicht eindeutig ist.
Grüße, Nino
Re: ASM - Code
Verfasst: 18.02.2011 09:03
von Thorium
Nino hat geschrieben:
Ich glaube seine Frage war eben, welche Register man sichern muss, da der von ihm zitierte Ausschnitt aus der Hilfe in diesem Punkt nicht eindeutig ist.
Wieso soll das nicht eindeutig sein: "Die verwendbaren Register sind: eax, edx und ecx. Alle anderen müssen immer reserviert bleiben."
Also muss man alle sichern ausser EAX, EDX und ECX.
Re: ASM - Code
Verfasst: 18.02.2011 09:49
von Thorium
Hier gibt es eine genaue Auflistung:
http://msdn.microsoft.com/en-us/library/9z1stfyw.aspx
Ist zwar für x64 aber unter x86 sollte es gleich sein. Einfach das führende R im Registernamen durch ein E austauschen und die Register R8 bis R15 gibt es nur unter x64.
Unter Linux könnte die ABI anders sein, davon hab ich keine Ahnung.
Re: ASM - Code
Verfasst: 18.02.2011 11:18
von hth
zu 1.)
68 D0 26 00 00 E8 4D 30 00 00 B8 FF FF FF FF 68 E0 26 00 00 E8 3E 30 00 00 FF E0
-----------------------------------MOV eax, ffffffffh------------------------------------
Ich würde einfach gern wissen, was die anderen bytes bewirken (und warum). Aber danke für den Hinweis mit dem Ausrufezeichen.
Hiermit erhalte ich tatsächlich nur: B8 FF FF FF FF FF E0
Ich hatte das mit dem ! zwar auch schon gelesen, war aber der Ansicht, dass dies für Purebasic das gleiche wäre.
zu 2.) Ich dachte durch die farbliche Markierung das Problem eindeutig beschrieben zu haben.
Also nochmals: Im Text werden eax, edx und ecx genannt, im darüber liegenden Beispiel wird hingegen ebx verwendet.
Bitte nicht antworten, dass ich dann ebx eben sichern muss. Falls das wirklich so wäre, ist das Beispiel unangebracht!
hth
Re: ASM - Code
Verfasst: 18.02.2011 12:13
von Helle
Zu 1.: Die Bytes ergeben (als neue Datei in PB):
Code: Alles auswählen
$0040103F 68 D0 26 00 00 PUSH 00 00 26 D0
$00401044 E8 4D 30 00 00 CALL 00 40 40 96
$00401049 B8 FF FF FF FF MOV EAX , FF FF FF FF
$0040104E 68 E0 26 00 00 PUSH 00 00 26 E0
$00401053 E8 3E 30 00 00 CALL 00 40 40 96
$00401058 FF E0 JMP EAX ( near )
PUSH/CALL dürften von Einstellungen in Deinen Compiler-Optionen herrühren.
Zu 2.: Vergiss das in der PB-"Hilfe" zu Inline-ASM Geschriebene. Gemeldete Fehler usw. werden leider nicht korrigiert.
Gruß
Helle
P.S.: Wann wird in den Compiler-Optionen endlich mal die CPU-Auswahl zum Leben erweckt?
Re: ASM - Code
Verfasst: 18.02.2011 17:03
von Thorium
hth hat geschrieben:
zu 2.) Ich dachte durch die farbliche Markierung das Problem eindeutig beschrieben zu haben.
Also nochmals: Im Text werden eax, edx und ecx genannt, im darüber liegenden Beispiel wird hingegen ebx verwendet.
Bitte nicht antworten, dass ich dann ebx eben sichern muss. Falls das wirklich so wäre, ist das Beispiel unangebracht!
Ah, verstehe. Da hast du tatsächlich einen Fehler in der Hilfe gefunden. Ist sicherlich ein Typo, sollte garantiert edx sein.
Re: ASM - Code
Verfasst: 18.02.2011 17:37
von ts-soft
Helle hat geschrieben:P.S.: Wann wird in den Compiler-Optionen endlich mal die CPU-Auswahl zum Leben erweckt?
Die Funktioniert doch schon ewige Zeiten?
Es gibt aber bisher keine Libs und keine UserLibs, die das unterstützen, schreib mal eine, wie man
den CPU-Support nutzt steht im SDK.
Readme.txt hat geschrieben: Since PureBasic 3.60, it's possible to creates specialized executables (or dynamic executables)
which can use optimized commands for MMX, 3DNOW, SSE and SSE2 processor. It's done at compile time
or at runtime, depending of the executable type (Normal or Dynamic CPU). Implements an optimized
function is very easy, just put _EXTENSION below the name.
Example (in C) to support MMX and 3DNOW format:
PB_CrossFading (int Rate) // Base function, working on all processors
PB_CrossFading_MMX (int Rate) // MMX optimized
PB_CrossFading_3DNOW (int Rate) // 3DNOW optimized
Now, you have to add in the .desc which optimized functions are available. The following
flags are available: MMX, 3DNOW, SSE and SSE2
Example for a MMX and 3DNOW optimized function:
CrossFading, Long, (Rate)
Long | MMX | 3DNOW
Re: ASM - Code
Verfasst: 18.02.2011 18:19
von Nino
hth hat geschrieben:zu 2.) Ich dachte durch die farbliche Markierung das Problem eindeutig beschrieben zu haben.
Das hast Du auch getan.