即使没有其他必要,合法的结语是否需要包括虚拟 rsp 调整?

Bee*_*ope 6 windows exception x86-64 abi seh

该X86-64的Windows ABI有一个概念合法收尾,这是可以的功能收尾的一种特殊类型的模拟异常处理过程中,以恢复呼叫者上下文1所描述的在这里

如果 RIP 在一个结语内 [当异常发生时],那么控制正在离开函数,...并且结语的影响必须继续计算调用者函数的上下文。为了确定 RIP 是否在结语内,检查从 RIP 开始的代码流。如果该代码流可以与合法结语的尾随部分匹配,则它在结语中,结语的其余部分被模拟,上下文记录随着每条指令的处理而更新......

您可以在此处找到对合法结语 的散文描述,其中包括以下示例:

如果函数中未使用帧指针,则结语必须首先释放堆栈的固定部分,弹出非易失性寄存器,并将控制权返回给调用函数。例如,

add      RSP, fixed-allocation-size  
pop      R13  
pop      R14  
pop      R15  
ret
Run Code Online (Sandbox Code Playgroud)

它包含一个类似的示例,lea用于在使用帧指针时恢复堆栈。

但是,如果函数内根本没有固定大小的分配怎么办?函数不使用堆栈的情况并不少见。add rsp, 0在这种情况下是否需要插入一个哑元以符合合法结语的规则,还是可以省略?


1例如,恢复可能被调用者破坏的非易失性寄存器。