Размер области тени в стеке на языке ассемблера - PullRequest
0 голосов
/ 24 апреля 2020

Я нашел пример программы ниже где-то в Интернете. Различные его копии имеются в большом количестве, как правило, с небольшими различиями. Но мой вопрос касается размера теневой области в верхней части стека при вызове функции из 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
...