Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用汇编语言获取Windows环境变量?_Windows_Assembly_Programming Languages_Stack_Environment Variables - Fatal编程技术网

如何用汇编语言获取Windows环境变量?

如何用汇编语言获取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

我有一个汇编语言程序,它试图打印出窗口环境变量的值,即“%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个寄存器参数分配足够的空间,即使被调用者没有那么多参数。”

在第一次调用之前,您只分配了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位版本的库。