blob: 788fe6bdfd692abd0dd8e6b5acacc66cfc0bb7f4 [file] [log] [blame]
PROC_FRAME sample
db 048h; emit a REX prefix, to enable hot-patching
push rbp
[pushreg rbp]
sub rsp, 040h
[allocstack 040h]
lea rbp, [rsp+020h]
[setframe rbp, 020h]
movdqa [rbp], xmm7
[savexmm128 xmm7, 020h];the offset is from the base of the frame
;not the scaled offset of the frame
mov [rbp+018h], rsi
[savereg rsi, 018h]
mov [rsp+010h], rdi
[savereg rdi, 010h]; you can still use RSP as the base of the frame
; or any other register you choose
END_PROLOGUE
; you can modify the stack pointer outside of the prologue (similar to alloca)
; because we have a frame pointer.
; if we didn't have a frame pointer, this would be illegal
; if we didn't make this modification,
; there would be no need for a frame pointer
sub rsp, 060h
; we can unwind from the following AV because of the frame pointer
mov rax, 0
mov rax, [rax] ; AV!
; restore the registers that weren't saved with a push
; this isn't part of the official epilog, as described in section 2.5
movdqa xmm7, [rbp]
mov rsi, [rbp+018h]
mov rdi, [rbp-010h]
; Here's the official epilog
lea rsp, [rbp-020h]
pop rbp
ret
ENDPROC_FRAME
struc kFrame
.Fill resq 1 ; fill to 8 mod 16
.SavedRdi resq 1 ; saved register RDI
.SavedRsi resq 1 ; saved register RSI
endstruc
struc sampleFrame
.Fill resq 1 ; fill to 8 mod 16
.SavedRdi resq 1 ; Saved Register RDI
.SavedRsi resq 1 ; Saved Register RSI
endstruc
PROC_FRAME sample2
alloc_stack sampleFrame_size
save_reg rdi, sampleFrame.SavedRdi
save_reg rsi, sampleFrame.SavedRsi
END_PROLOGUE
; function body
mov rsi, [rsp+sampleFrame.SavedRsi]
mov rdi, [rsp+sampleFrame.SavedRdi]
; Here's the official epilog
add rsp, sampleFrame_size
ret
ENDPROC_FRAME