Assembly MASM x64调用约定-为什么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 20h——它是说为32字节分配堆栈空间,对吗

但为什么每个寄存器都有allocstack?如果有,那么为什么最后一个allocstack不是8h(因为8已经有3个allocstack,所以满足了32字节的要求)

如果你阅读,它会说:

.ALLOCSTACK允许ml64.exe用户指定帧如何运行 展开并仅允许在序言中使用,序言从 .ENDPROLOG指令的过程框架声明。这些 指令不生成代码;它们只生成.xdata和.pdata。 .ALLOCSTACK前面应该有实际执行的指令 要解开的动作


.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