Assembly MASM x64调用约定-为什么allocstack在这里需要多次?
我继承了以下代码,并试图理解它 我得到.allocstack 20h——它是说为32字节分配堆栈空间,对吗 但为什么每个寄存器都有allocstack?如果有,那么为什么最后一个allocstack不是8h(因为8已经有3个allocstack,所以满足了32字节的要求) 如果你阅读,它会说: .ALLOCSTACK允许ml64.exe用户指定帧如何运行 展开并仅允许在序言中使用,序言从 .ENDPROLOG指令的过程框架声明。这些 指令不生成代码;它们只生成.xdata和.pdata。 .ALLOCSTACK前面应该有实际执行的指令 要解开的动作Assembly MASM x64调用约定-为什么allocstack在这里需要多次?,assembly,x86-64,masm,calling-convention,Assembly,X86 64,Masm,Calling Convention,我继承了以下代码,并试图理解它 我得到.allocstack 20h——它是说为32字节分配堆栈空间,对吗 但为什么每个寄存器都有allocstack?如果有,那么为什么最后一个allocstack不是8h(因为8已经有3个allocstack,所以满足了32字节的要求) 如果你阅读,它会说: .ALLOCSTACK允许ml64.exe用户指定帧如何运行 展开并仅允许在序言中使用,序言从 .ENDPROLOG指令的过程框架声明。这些 指令不生成代码;它们只生成.xdata和.pdata。 .AL
.allocstack
仅描述代码所执行的操作。因此,每次推送后的.allocstack 8
将创建适当的放卷信息(推送将rsp调整8)。最后一个.allocstack 20h
描述了子rsp,20h
还有一个问题--您知道PROC FRAME是否最终创建了调用堆栈帧吗?如果可能的话,我想避免它。它不会创建堆栈帧。您可以通过请求列表或反汇编结果文件来验证这一点。
; save registers
push rax
.allocstack 8
push r10
.allocstack 8
push r11
.allocstack 8
sub rsp, 20h
.allocstack 20h
.endprolog
call EnterStub
add rsp, 20h
; restore registers
pop r11
pop r10
pop rax
; return
ret