10

如何从以下计算中28h减去(十进制 40)的值:rsp

    option casemap:none

    includelib kernel32.lib
    includelib user32.lib

externdef MessageBoxA : near
externdef ExitProcess : near

    .data

text    db 'Hello world!', 0
caption db 'Hello x86-64', 0

    .code

main proc
    sub rsp, 28h        ; space for 4 arguments + 16byte aligned stack
    xor r9d, r9d        ; 4. argument: r9d = uType = 0
    lea r8, [caption]   ; 3. argument: r8  = caption
    lea rdx, [text]     ; 2. argument: edx = window text
    xor rcx, rcx        ; 1. argument: rcx = hWnd = NULL
    call MessageBoxA
    xor ecx, ecx        ; ecx = exit code
    call ExitProcess
main endp

    end

来自:http ://www.japheth.de/JWasm/Win64_1.html

据我了解,我只需要减去20h,因为我使用的每个值都需要 8 个字节到 4 is 20h。那么为什么28h要减去,这如何导致 16 字节对齐?

另请参阅是否需要为少于四个参数的函数保留堆栈空间?

4

2 回答 2

14

我相信这是因为在main调用之前,堆栈是对齐的。然后在 之后call, 的行为call是将一个 8 字节的指针(调用者内部要返回的地址,即 call 指令之后的地址)压入堆栈。所以在 的开头main,它是 16 字节对齐的 8 个字节。因此,而不是20h您需要28h,将实际总数带到28h + 8h(来自call)或30h。结盟。:)

于 2013-10-02T01:19:25.953 回答
1

我偶然发现了同样的情况。尝试了潜伏者的答案,很好。后来添加了一些代码(顺便说一下,我使用的是我自己的编译器)并遇到了问题。

问题是影子空间地址在堆栈上以 8 结尾。当影子空间地址以 0 结尾(“堆栈对齐 16 字节”)时,调用正常。在我的最后一种情况下,添加 8 个字节会使应用程序崩溃。

于 2015-01-17T09:40:00.793 回答