10

28hから減算される (10 進数 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 であるため、減算するだけで済みます20h。では、なぜ が28h減算され、それがどのようにして 16 バイトのアラインメントになるのでしょうか?

引数が 4 つ未満の関数にはスタック領域の予約が必要ですか?も参照してください。

4

2 に答える 2

1

私も同じケースに遭遇しました。ラーカーの答えを試してみましたが、大丈夫でした。後でいくつかのコードを追加し(ちなみに、私は自分のコンパイラを使用しています)、問題が発生しました。

問題は、シャドウ スペース アドレスがスタック上で 8 で終わっていたことです。シャドウ スペース アドレスが 0 で終わっていた場合 (「16 バイトに整列されたスタック」)、呼び出しは OK でした。私の最後のケースでは、8 バイトを追加するとアプリがクラッシュします。

于 2015-01-17T09:40:00.793 に答える