Размер теневой области в стеке на языке ассемблера
Я нашел приведенный ниже пример программы где-то в Интернете. Есть множество его копий, обычно с небольшими отличиями. Но мой вопрос касается размера теневой области наверху стека при вызове функции из Windows API. Эта программа работает отлично, как показано, с десятичным числом 40, вычтенным из указателя стека, чтобы оставить место для 4 параметров, которые передаются в регистры, плюс еще один. Однако в этом случае нет 5-го параметра, а еслиsub rsp, 40
изменен на sub rsp, 32
, и никаких других изменений не производится, окно "Hello world" больше не отображается! Есть ли какая-то причина, по которой, когда задействовано только 4 параметра, все из которых передаются в регистрах, все же необходимо зарезервировать 40 (5*8) байтов наверху стека, а не только 32 (4*8)?
; Sample x64 Assembly Program
; Chris Lomont 2009 www.lomont.org
; command to assemble is:
; ml64 hello.asm /link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib /entry:Start
extrn ExitProcess: PROC ; in kernel32.lib
extrn MessageBoxA: PROC ; in user32.lib
.data
caption db '64-bit hello!', 0
message db 'Hello World!', 0
.code
Start PROC
sub rsp, 40 ; shadow space, aligns stack
mov rcx, 0 ; hWnd = HWND_DESKTOP
lea rdx, message ; LPCSTR lpText
lea r8, caption ; LPCSTR lpCaption
mov r9d, 0 ; uType = MB_OK
call MessageBoxA ; call MessageBox API function
mov ecx, eax ; uExitCode = MessageBox(...)
call ExitProcess
Start ENDP
End