Der Assembler von PBXB64 unterstützt eine Reihe von Anweisungen zur Steuerung der Ausrichtung, Datenemission und SEH-Abwicklungsinformationen (Structured Exception Handling). Im Inneren werden Direktiven verwendet#ASM / #ENDASMBlöcke.
Der Assembler von PBXB64 unterstützt eine Reihe von Anweisungen zur Steuerung der Ausrichtung, Datenemission und SEH-Abwicklungsinformationen (Structured Exception Handling). Im Inneren werden Direktiven verwendet#ASM / #ENDASMBlöcke.
#ALIGNSteuert die Ausrichtung der Strukturelemente innerhalb von PBTYPE / UNIONBlöcke. Steuert außerdem die allgemeine Abschnittsausrichtung in Baugruppenblöcken.
#ALIGN 16 ' align to 16-byte boundary
Bei Verwendung in einemTYPE/UNIONKontext,#ALIGNsteuert die Packungsausrichtung nachfolgender Elemente. Die Standardausrichtung ist die natürliche Ausrichtung jedes Elementtyps.
.p2alignFüllen Sie den aktuellen Abschnitt mit NOP-Anweisungen auf, um die angegebene Ausrichtungsgrenze zu erreichen. Die Direktive benötigt einen Zweierpotenz-Exponenten.
#ASM
.p2align 4 ; align to 16-byte boundary (2^4)
.p2align 5, 0x90, 8 ; align to 32-byte, pad with NOPs, max 8 bytes
#ENDASM
Parameter:
| Parameter | Beschreibung |
|---|---|
align | Zweierpotenz-Ausrichtung (z. B. 4 = 16 Bytes, 5 = 32 Bytes) |
fill | Optionales Füllbyte (Standard: 0x90 = NOP) |
max | Optionale maximale Anzahl einzufügender Bytes |
.zeroGibt einen Block mit null initialisiertem Speicher aus. Wird häufig zum Auffüllen der Ausrichtung oder zur Datenreservierung verwendet.
#ASM
.zero 32 ; emit 32 zero bytes
#ENDASM
Diese Anweisungen geben Abwicklungsinformationen an die aus.pdataUnd.xdataPE-Abschnitte, die es dem Windows x64-Ausnahmehandler ermöglichen, den Stapel ordnungsgemäß abzuwickeln.
.seh_procMarkiert den Beginn einer Funktion mit SEH-Abwicklungsinformationen. Erforderlich vor allen anderen SEH-Richtlinien.
.seh_proc MyFunction
.seh_endprologueMarkiert das Ende des Funktionsprologs. Ab diesem Zeitpunkt ist der Stapelrahmen vollständig aufgebaut und die Abwickelcodes wurden aufgezeichnet.
.seh_endprologue
.seh_pushregZeichnet auf, dass ein nichtflüchtiges Register auf den Stapel verschoben wurde. Beim Abwickeln wird das Register wiederhergestellt.
.seh_pushreg rbx .seh_pushreg rsi .seh_pushreg rdi
.seh_setframeErstellt ein Frame-Pointer-Register mit optionalem skaliertem Offset. Der Rahmenzeiger wird verwendet, um während des Abwickelns auf lokale Variablen und Parameter zuzugreifen.
.seh_setframe rbp, 0 ; rbp is frame pointer, no scaled offset
.seh_stackallocZeichnet auf, dass eine angegebene Anzahl von Bytes auf dem Stapel zugewiesen wurde (normalerweise über).sub rsp, X).
.seh_stackalloc 64 ; 64 bytes of local stack allocated
.seh_saveregZeichnet auf, dass ein nichtflüchtiges Register in einem bestimmten Stapelversatz vom Framezeiger oder Stapelzeiger gespeichert wurde.
.seh_savereg rbx, 32 ; rbx saved at [rbp+32] or [rsp+32]
.seh_savexmmZeichnet auf, dass ein nichtflüchtiges XMM-Register in einem bestimmten Stapeloffset gespeichert wurde.
.seh_savexmm xmm6, 16 ; xmm6 saved at [rbp+16]
.seh_pushframeZeichnet auf, dass ein Frame gepusht wurde (wird zur Ausnahmebehandlung von Kettenframes verwendet). Die Wahl[code]Flag zeigt an, ob eine Absenderadresse übertragen wurde.
.seh_pushframe ; push frame without return address .seh_pushframe code ; push frame with return address on stack
.seh_handlerOrdnet der aktuellen Prozedur eine Ausnahmehandlerfunktion zu. Verwendet fürTRY/CATCH/FINALLYUnterstützung.
.seh_handler ExceptionHandler, @except .seh_handler FinallyHandler, @finally
.seh_endprocMarkiert das Ende der SEH-Abwicklungsinformationen einer Funktion. Muss nach allen anderen SEH-Anweisungen für die Funktion erscheinen.
.seh_endproc
; Standard x64 function prologue with SEH
#ASM
.seh_proc MyFunc
push rbp
.seh_pushreg rbp
mov rbp, rsp
.seh_setframe rbp, 0
sub rsp, 48
.seh_stackalloc 48
.seh_endprologue
; function body
mov DWORD PTR [rbp-4], 42
mov eax, DWORD PTR [rbp-4]
; epilogue
add rsp, 48
pop rbp
ret
.seh_endproc
#ENDASM
.byteGeben Sie rohe Bytewerte in den Codestream aus.
.byte 0x90, 0x90, 0xCC ; NOP, NOP, INT3
.word16-Bit-Wortwerte ausgeben.
.word 0x1234, 0x5678
.long32-Bit lange Werte ausgeben.
.long 0x12345678
.quad64-Bit-Quadword-Werte ausgeben.
.quad 0x1234567890ABCDEF
.sectionWechseln Sie zu einem benannten Abschnitt. Standardabschnitte umfassen.text, .data, .bss, .rdata.
.section .data
.section .rdata, "rd" ; read-only data section
.section .text
; code follows
.text / .data / .bssPraktische Aliase für allgemeine Abschnitte.
.data
myVar: .quad 42
.text
mov rax, QWORD PTR [myVar]
Category: Assembly
PBXB64 Status: Referenzthema fuer Assembler-Syntax und Familienhinweise; untergeordnete Instruktionsseiten und registrierte Tests liefern den endgueltigen Support-Nachweis.
Dieses Assembler-Thema gruppiert PBXB64-x64-Assembler-Syntax, Direktiven, Adressierungsregeln oder Mnemonik-Familien. Behandeln Sie es als Navigation plus Nutzungshinweis, sofern keine Unterseite oder kein registrierter Test eine konkrete Instruktionsform belegt.
Verwenden Sie diese Mnemonik-Übersichten als Einstieg in fokussierte Assembler-Tests. Eine vollständige Prüfung nennt CPU-Feature-Bit, Operandenbreite, Register- oder Speicherform, Flag-Auswirkungen und ob die Instruktion im Windows-x64-User-Mode gültig ist.
Inline-Assembler muss die Windows-x64-Aufrufkonvention erhalten, wenn die Kontrolle zu compilererzeugtem Code zurückkehrt. Sichern Sie nichtflüchtige Register, halten Sie Stack-Alignment bei Aufrufen ein und dokumentieren Sie absichtlich veränderte Flags oder Register.