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

请参见

参考

MASM 的展开帮助器