我有一个汇编语言程序,它试图打印出Window Environment变量的值,即"%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有什么建议吗?
发布于 2013-07-25 13:37:37
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
endhttps://stackoverflow.com/questions/17849590
复制相似问题