PUSHALL/POPALL (PUSHAD/POPAD and flags for both x86 and x64)

Bare metal programming in PureBasic, for experienced users
User avatar
Keya
Addict
Addict
Posts: 1891
Joined: Thu Jun 04, 2015 7:10 am

PUSHALL/POPALL (PUSHAD/POPAD and flags for both x86 and x64)

Post by Keya »

On 64bit we dont have the PUSHAD/POPAD instructions so here is hopefully a manual solution. Im new to Purebasic so i welcome any feedback and hope i havent screwed this up!
As PUSHF/POPF are still supported perhaps its better to leave them out of this!

Code: Select all

Macro pushall       ;assumes EnableASM already set
    pushf           ;db 0x9C
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    pushad          ;db 0x60
  CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64    
    push rax        ;db 0x50
    push rcx        ;db 0x51
    push rdx        ;db 0x52               
    push rbx        ;db 0x53               
    push rbp        ;db 0x55               
    push rsi        ;db 0x56               
    push rdi        ;db 0x57               
    push r8         ;db 0x41,0x50          
    push r9         ;db 0x41,0x51          
    push r10        ;db 0x41,0x52          
    push r11        ;db 0x41,0x53          
    push r12        ;db 0x41,0x54          
    push r13        ;db 0x41,0x55          
    push r14        ;db 0x41,0x56          
    push r15        ;db 0x41,0x57            
  CompilerEndIf
EndMacro

Macro popall        ;assumes EnableASM already set
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    pop r15         ;db 0x41,0x5F          
    pop r14         ;db 0x41,0x5E          
    pop r13         ;db 0x41,0x5D          
    pop r12         ;db 0x41,0x5C          
    pop r11         ;db 0x41,0x5B          
    pop r10         ;db 0x41,0x5A          
    pop r9          ;db 0x41,0x59          
    pop r8          ;db 0x41,0x58          
    pop rdi         ;db 0x5F               
    pop rsi         ;db 0x5E               
    pop rbp         ;db 0x5D               
    pop rbx         ;db 0x5B               
    pop rdx         ;db 0x5A               
    pop rcx         ;db 0x59               
    pop rax         ;db 0x58               
  CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x86
    popad           ;db 0x61
  CompilerEndIf
    popf            ;db 0x9D               
EndMacro

MessageRequester ("PUSHAD","Ready...")
EnableASM
;db 0xCC
pushall
popall
;db 0xCC
DisableASM
MessageRequester("POPAD","Done")