我有一个汇编语言程序,它试图打印出Window Environment Variable的值,即“%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
有什么建议吗?
答案 0 :(得分:1)
MSDN指定:“调用者负责为被调用者分配参数空间,并且必须始终为4个寄存器参数分配足够的空间,即使被调用者没有那么多参数。”< / p>
你只是在第一次呼叫之前分配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