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规定:“调用者负责为被调用者分配参数空间,并且必须始终为 4 个寄存器参数分配足够的空间,即使被调用者没有那么多参数。”

您在第一次调用之前只分配 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 回答