首页 > 解决方案 > 汇编语言中堆栈上阴影区域的大小

问题描述

我在网上某处找到了下面的示例程序。它的各种副本比比皆是,通常差异很小。但我的问题涉及从 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

标签: winapiassemblyx86-64calling-conventionmasm64

解决方案


推荐阅读