如何用汇编语言获取Windows环境变量?
我有一个汇编语言程序,它试图打印出窗口环境变量的值,即“%AppData%”。不幸的是,我的程序只会崩溃。我怀疑问题是由不正确的堆栈保留引起的。这是我的密码:如何用汇编语言获取Windows环境变量?,windows,assembly,programming-languages,stack,environment-variables,Windows,Assembly,Programming Languages,Stack,Environment Variables,我有一个汇编语言程序,它试图打印出窗口环境变量的值,即“%AppData%”。不幸的是,我的程序只会崩溃。我怀疑问题是由不正确的堆栈保留引起的。这是我的密码: includelib \Masm64\Lib\Kernel32.lib includelib \Masm64\Lib\User32.lib extern GetEnvironmentVariableA : proc extern MessageBoxA : proc extern ExitProcess : proc dseg
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个寄存器参数分配足够的空间,即使被调用者没有那么多参数。”
在第一次调用之前,您只分配了18个字节-也许您应该分配20个字节?visualc似乎总是分配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
谢谢你的回复!希望这些信息能防止我最近遇到的所有非正统错误。64位Windows库的名称仍然以“32”结尾。当然,在编译32位代码时,您确实需要64位版本的库。