MASM x64调用约定 - 为什么allocstack需要多次在这里?

时间:2014-12-21 21:15:10

标签: assembly x86-64 masm calling-convention

我有以下代码我继承并试图理解它。

我得到.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

1 个答案:

答案 0 :(得分:0)

如果您阅读msdn,则会说:

  

.ALLOCSTACK允许ml64.exe用户指定帧功能   展开,只允许在序言中延伸   PROC FRAME声明到.ENDPROLOG指令。这些   指令不生成代码;它们只生成.xdata和.pdata。   .ALLOCSTACK之前应该有实际实现的指令   要解开的行动。

.allocstack仅描述代码所执行的操作。因此,.allocstack 8之后的push用于创建相应的展开信息(pushrsp调整为8)。最终.allocstack 20h描述了sub rsp, 20h