Inline x86 ASM
Einführung
PureBasic erlaubt das direkte Einfügen von allen x86 Assembler Befehlen (einschließlich MMX- und FPU-Befehlen) in den Sourcecode, so als wäre es ein echter Assembler. Und es bietet noch mehr: Sie können direkt alle Variablen oder Zeiger in den Assembler Schlüsselwörtern benutzen, Sie können beliebige Assembler Befehle auf derselben Zeile verwenden, ... Die Syntax entspricht dem des FAsm (http://flatassembler.net), wenn Sie also nach weiteren Informationen zum ASM Syntax suchen, lesen Sie die FAsm-Anleitung.
Es gibt mehrere Möglichkeiten zum Aktivieren des Inline-Assemblers:
- Abhaken der "Inline Assembler" Compiler-Option in der IDE
- Verwendung der /INLINEASM Befehlszeilen-Compileroption
- Verwendung der Compiler-Direktiven EnableASM und DisableASM
Regeln
Sie müssen einige Regeln genau beachten, wenn Sie ASM im Basic Code einbinden möchten:
- Die benutzten Variablen oder Zeiger müssen vor ihrer Benutzung in einem Assembler Schlüsselwort deklariert werden.
- Wenn Sie auf eine Sprungmarke verweisen, müssen Sie das Zeichen 'l_' vor dem Namen einfügen. Dies erfolgt, weil PureBasic ein 'l_' vor einer BASIC Sprungmarke einfügt, um Konflikte mit internen Sprungmarken zu vermeiden. Bei Verwendung des Inline-ASM muss der Verweis auf die Sprungmarke in Kleinschreibung erfolgen.Beispiel:
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.
- Eine ASM Hilfe-Datei kann hier geladen werden. Wenn Sie die 'ASM.HLP' ins 'Help/' Verzeichnis von PureBasic verschieben, können Sie nach Drücken von F1 auch Hilfe zu ASM Schlüsselwörtern erhalten. (Hinweis: Dieses Feature ist nur bei aktiviertem InlineASM eingeschalten.)
Bei Benutzung des Assemblers in einer Prozedur müssen Sie auf verschiedene wichtige Dinge achten:
- Um den Inhalt des 'eax' Registers direkt zurückzugeben, benutzen Sie einfach ProcedureReturn ohne einen weiteren Ausdruck. Dies lässt den Inhalt des 'eax' Registers unangetastet und benutzt ihn als Rückgabewert.Beispiel:
Procedure.l MyTest() MOV eax, 45 ProcedureReturn ; Der zurückgegebene Wert wird 45 sein EndProcedure- Lokale Variablen in PureBasic werden direkt durch den Stack-Pointer indexiert, was bedeutet: wenn der Stack-Pointer durch eine ASM Anweisung (wie PUSH, POP etc.) verändert wird, dann wird der Variablen-Index fehlerhaft sein und ein direkter Verweis auf Variablen funktioniert nicht mehr.
- Durch die Verwendung des '!' Zeichens am Zeilenbeginn ist es möglich, dem Assembler eine Zeile Assembler-Code direkt zu übergeben, ohne dass diese erst durch den Compiler verarbeitet wird. Dies ermöglicht vollen Zugriff auf die Assembler-Direktiven. Bei der Nutzung dieses Features kann auf lokale Variablen durch die Verwendung der Schreibweise 'p.v_Variablenname' für eine reguläre Variable oder 'p.p_Variablenname' für einen Zeiger verwiesen werden.Beispiel:
Procedure Test(*Pointer, Variable) ! MOV dword [p.p_Pointer], 20 ! MOV dword [p.v_Variable], 30 Debug *Pointer Debug Variable EndProcedure Test(0, 0)Beispiel
AsmInline.pb