我有以下代码我继承并试图理解它。
我得到.allocstack 20h - 它说的是为32字节分配堆栈空间,对吗?
但为什么每个寄存器都有allocstack?如果有,那么为什么不是最后一个allocstack 8h(因为已经有3个allocstacks为8,所以满足了32个字节的要求)?
; 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
答案 0 :(得分:0)
如果您阅读msdn,则会说:
.ALLOCSTACK允许ml64.exe用户指定帧功能 展开,只允许在序言中延伸 PROC FRAME声明到.ENDPROLOG指令。这些 指令不生成代码;它们只生成.xdata和.pdata。 .ALLOCSTACK之前应该有实际实现的指令 要解开的行动。
.allocstack
仅描述代码所执行的操作。因此,.allocstack 8
之后的push
用于创建相应的展开信息(push
将rsp
调整为8)。最终.allocstack 20h
描述了sub rsp, 20h
。