2014-12-21 33 views
1

我有下面的代碼,我已經繼承,並試圖弄清楚它。MASM x64調用約定 - 爲什麼allocstack在這裏需要多次?

我得到.allocstack 20小時 - 它是說爲32個字節分配堆棧空間,對吧?

但爲什麼每個寄存器都有allocstack?如果有,那麼爲什麼不是最後一個allocstack 8h(因爲8個已經有3個allocstack,所以滿足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

https://www.tortall.net/projects/yasm/manual/html/objfmt-win64-exception.html –

回答

0

如果你讀msdn,它說:

.ALLOCSTACK允許ml64.exe用戶指定如何幀功能 退繞,並且只能在序幕,從 的PROC擴展允許範圍內對.ENDPROLOG指令的FRAME聲明。這些 指令不生成代碼;他們只生成.xdata和.pdata。 .ALLOCSTACK之前應該有實際執行 要解除操作的指令。

.allocstack只描述了代碼做了什麼。因此,在push之後的.allocstack 8將創建適當的展開信息(push由8調整rsp)。最後的.allocstack 20h描述了sub rsp, 20h

+0

還有一個問題 - 你知道,如果PROC FRAME最終建立一個調用堆棧幀?如果可能,我想避免它。 – halivingston

+0

它不創建堆棧幀。您可以通過詢問列表或反彙編生成的文件來驗證。 – Jester

相關問題