0

ウィンドウ環境変数の値、つまり「%AppData%」を出力しようとするアセンブリ言語プログラムがあります。残念ながら、私のプログラムはクラッシュするだけです。この問題は、スタックの予約が正しくないことが原因であると思われます。これが私のコードです:

includelib \Masm64\Lib\Kernel32.lib
includelib \Masm64\Lib\User32.lib
extern GetEnvironmentVariableA : proc
extern MessageBoxA : proc
extern ExitProcess : proc

dseg        segment para 'DATA'
capt        db      'Debug', 0
msg         db      0 dup(30h)
evar        db      '%AppData%', 0
dseg        ends

cseg        segment para 'CODE'
start       proc
            sub     rsp, 18h
            mov     r8d, 30h
            lea     rdx, [msg]
            lea     rcx, [evar]
            call    GetEnvironmentVariableA

            sub     rsp, 28h
            xor     r9d, r9d
            lea     r8, [capt]
            lea     rdx, [msg]
            xor     rcx, rcx
            call    MessageBoxA

fini:       call    ExitProcess
start       endp
cseg        ends
            end

助言がありますか?

4

1 に答える 1

1

MSDNは次のように規定しています。

最初の呼び出しの前に 18h バイトしか割り当てていません。おそらく 20h を割り当てる必要がありますか? Visual C は常に 28h バイトを割り当てるようです。ただし、各関数呼び出しの前に再度割り当てる必要はありません。

さらに、GetEnvironmentVariable は変数の名前のみを受け取り、パーセント文字は使用しません。

次の変更されたコードは機能しているようです。

includelib \Masm64\Lib\Kernel32.lib
includelib \Masm64\Lib\User32.lib
extern GetEnvironmentVariableA : proc
extern MessageBoxA : proc
extern ExitProcess : proc

dseg        segment para 'DATA'
capt        db      'Debug', 0
msg         db      0 dup(30h)
evar        db      'AppData', 0
dseg        ends

cseg        segment para 'CODE'
start       proc
            sub     rsp, 28h
            mov     r8d, 30h
            lea     rdx, [msg]
            lea     rcx, [evar]
            call    GetEnvironmentVariableA

            xor     r9d, r9d
            lea     r8, [capt]
            lea     rdx, [msg]
            xor     rcx, rcx
            call    MessageBoxA

fini:       call    ExitProcess
start       endp
cseg        ends
            end
于 2013-07-25T05:37:36.713 に答える