2014-12-21 2 views
1

У меня есть следующий код, который я унаследовал и пытаюсь понять.Соглашение о назначении MASM x64 - зачем здесь allocstack нужно несколько раз?

Я получаю .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

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

ответ

0

Если вы читали msdn, он говорит:

.ALLOCSTACK позволяет ml64.exe пользователям определить, как функция рамки раскручивается и допускается только в прологе, который простирается от ргос FRAME в директиве .ENDPROLOG. Эти директивы не генерируют код; они генерируют только .xdata и .pdata. .ALLOCSTACK должны предшествовать инструкции, которые фактически реализуют действия, которые необходимо разматывать.

.allocstack описывает только то, что делается по коду. Таким образом, .allocstack 8 после каждого push должен создать соответствующую информацию для размотки (a push регулирует rsp на 8). Финал .allocstack 20h описывает sub rsp, 20h.

+0

Еще один вопрос - знаете ли вы, что если PROC FRAME создает фрейм стека вызовов? Я хотел бы избежать этого, если это возможно. – halivingston

+0

Он не создает фрейм стека. Вы можете проверить это, попросив листинг или дизассемблируя полученный файл. – Jester