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, ... Der Syntax entspricht dem des FAsm (http://flatassembler.net), wenn Sie also nach weiteren Informationen zum ASM Syntax suchen, lesen Sie einfach die FAsm Anleitung.

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, ebx, edx, esi, edi und ebp. 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 jeden 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 direkter Verweis auf Variablen funktioniert nicht mehr.

Beispiel:

Beispiel

AsmInline.pb