MASM 宏
为了简化 原始伪操作 的使用,在 ksamd64.inc 中定义了一组宏,可以使用这些宏创建典型的过程 Prolog 和 Epilog。
备注
宏 |
说明 |
---|---|
alloc_stack(n) |
分配 n 字节堆栈帧(使用“sub rsp, n”),并发出合适的展开信息 (.allocstack n) |
save_reg reg, loc |
将非易失寄存器 reg 保存到堆栈的 RSP 偏移量 loc 处,并发出合适的展开信息。 (.savereg reg, loc) |
push_reg reg |
将非易失寄存器 reg 推送到堆栈上,并发出合适的展开信息。 (.pushreg reg) |
rex_push_reg reg |
通过使用 2 字节推送操作将非易失寄存器保存到堆栈上,并发出合适的展开信息 (.pushreg reg)。如果该推送操作是函数中的第一个指令,则应使用此操作以确保函数为可热修补。 |
save_xmm128 reg, loc |
将非易失 XMM 寄存器 reg 保存到堆栈的 RSP 偏移量 loc 处,并发出合适的展开信息 (.savexmm128 reg, loc) |
set_frame reg, offset |
将帧寄存器 reg 设置为 RSP + 偏移量(通过使用 mov 或 lea),并发出合适的展开信息 (.set_frame reg, offset) |
push_eflags |
使用 pushfq 指令推送 eflag,并发出合适的展开信息 (.alloc_stack 8) |
此处为示例函数 Prolog,演示了这些宏的正确用法:
SkFrame struct
Fill dq ?; fill to 8 mod 16
SavedRdi dq ?; saved register RDI
SavedRsi dq ?; saved register RSI
SkFrame ends
sampleFrame struct
Filldq?; fill to 8 mod 16
SavedRdidq?; Saved Register RDI
SavedRsi dq?; Saved Register RSI
sampleFrame ends
sample2 PROC FRAME
alloc_stack(sizeof sampleFrame)
save_reg rdi, sampleFrame.SavedRdi
save_reg rsi, sampleFrame.SavedRsi
.end_prolog
; function body
mov rsi, sampleFrame.SavedRsi[rsp]
mov rdi, sampleFrame.SavedRdi[rsp]
; Here’s the official epilog
add rsp, (sizeof sampleFrame)
ret
sample2 ENDP