Identifizieren Sie eine Assembler-Anweisung. PowerBASICs
{! | ASM} { opcode | label }
{! | ASM} ALIGN boundary
Identifizieren Sie eine Assembler-Anweisung. PowerBASICs
Typ:Anweisung |Kategorie:Inline-Assembler
PBXB64-Status:TEILWEISE
PBXB64-Zertifizierung: Getestet für den unten dokumentierten PBXB64-Teilsatz; umfassende native Inline-Assembler-Abdeckung bleibt offen.
PBXB64-Hinweis: ASM ALIGN Grenze wird als Kompatibilitäts-No-Op akzeptiert. Das IR-Backend garantiert derzeit keine echte Code-Segment-Ausrichtung, daher wird kein NOP-Padding eingefügt.
Mit dieser Anweisung können Sie Assembler-Code in Ihren PowerBASIC-Quellcode einfügen. Ein Ausrufezeichen (!) dient als Abkürzung für das Schlüsselwort ASM.
Jede Gruppe von ASM-Anweisungen muss die folgenden CPU-Register beibehalten, wenn der Assemblercode zu einer Änderung führt: EBX, ESI, EDI, ESP, EBP und alle Segmentregister. Weitere Informationen finden Sie unter Register speichern.
In derselben Zeile wie eine ASM-Anweisung dürfen keine anderen Anweisungen stehen; Kommentare sind jedoch akzeptabel.
! DB 1, 2, 3, 4, 5
! TT &H45001222, &HFFFF4327
Jede Variable, auf die in einer Assembler-Anweisung verwiesen wird, muss vor der Verwendung definiert werden. Zum Beispiel:
x% = 10
! MOV AX, x%
Sie können nicht mit einer einzelnen ASM-Anweisung auf das Ziel eines Zeigers zugreifen, wie dies möglicherweise im BASIC-Quellcode der Fall wäre. Stattdessen müssen Sie die Zeigeradresse indirekt verwenden. Um die BASIC-Anweisung INCR @x zu simulieren, würden Sie schreiben:
DIM x AS INTEGER PTR
ASM MOV EAX, x ; EAX enthält einen Zeiger auf eine Ganzzahl
ASM INC WORD PTR [EAX] ; Addiere eins zum Zielwert
Im Inline-Assembler-Code können Zeichenfolgenliterale mit bis zu vier Zeichen verwendet werden:
! MOV AL, „a“ ; Verschiebe char a in reg AL
! MOV AX, „ab“ ; Verschiebe die Zeichen ab in reg AX
! ; „a“ in AL, „b“ in AH
! MOV EAX, „abcd“ ; Verschieben Sie die Zeichen abcd in reg EAX
PowerBASIC erkennt entweder ein Apostroph (') oder ein Semikolon (;), um einen Kommentar nach einer Zeile Assembler-Code anzugeben:
! PUSH EAX ; Speichern Sie das EAX-Register
! PUSH EBX ' speichert das EBX-Register
ASM ALIGN wird in kritischen Situationen eingesetzt, um maximale Effizienz aus Assembler-Codeabschnitten zu ziehen.
ASM ALIGN wird verwendet, um den Befehlsort auf eine Zweierpotenzadresse aufzurunden. Der angezeigte Grenzparameter muss eine Zweierpotenz im Bereich von 2 bis 256 sein.
PowerBASIC fügt NOP-Anweisungen in den Codeabschnitt ein, um die Anweisungsposition an die gewünschte Adresse zu bringen. Wenn sich die Anweisungsposition bereits auf einem Vielfachen der Grenze befindet, hat ALIGN keine Auswirkung.
Die #ALIGN-Metaanweisung funktioniert in derselben Hinsicht wie ASM ALIGN, die ASM ALIGN-Anweisung eignet sich jedoch besser für die Verwendung in einem PREFIX/END PREFIX-Block.
Es sollte darauf geachtet werden, dass die Register ordnungsgemäß erhalten bleiben, wenn Inline-Assembler-Code mit BASIC-Anweisungen vermischt wird. Weitere Informationen finden Sie unter Register speichern.
Assembler-Konzeptseiten sollen Registerbreite, Stack-Alignment, erhaltene Register, Flag-Nutzung und User-Mode-Gültigkeit unter Windows nennen. Inline-Schnipsel müssen mit intakter x64-Aufrufkonvention zurückkehren.
Verwenden Sie kleine Programme, die Register oder Speicher initialisieren, jeweils ein Konzept ausführen und das exakte Ergebnis vergleichen. Bei Stack-Beispielen muss gezeigt werden, dass Aufrufe nach dem Schnipsel weiter korrekt laufen.
Prüfen Sie 32-Bit-Beispiele auf ESP/EBP-Annahmen, PUSHAD/POPAD, Pointer-Trunkierung und x87/MMX-Zustandswechsel.
Validierungsbeleg: Verwenden Sie die registrierten Inline-Assembler- und Standalone-Assembler-Validierungsprogramme als Nachweis fuer konkrete unterstuetzte Instruktionsformen und nennen Sie die genaue Testdatei auf der Unterseite, wenn vorhanden.
LOCAL a&, b&, c&, z&