首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在汇编语言中获取Windows环境变量?

如何在汇编语言中获取Windows环境变量?
EN

Stack Overflow用户
提问于 2013-07-25 13:18:01
回答 1查看 751关注 0票数 0

我有一个汇编语言程序,它试图打印出Window Environment变量的值,即"%AppData%“。不幸的是,我的程序只会崩溃。我怀疑这个问题是由不正确的堆栈保留引起的。下面是我的代码:

代码语言:javascript
复制
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

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2013-07-25 13:37:37

MSDN指定:“调用者负责为被调用者分配参数空间,并且必须始终为4个注册参数分配足够的空间,即使被调用者没有那么多参数也是如此。”

你在第一次调用之前只分配了18h字节--也许你应该分配20h?Visual C似乎总是分配28h字节。不过,您不需要在每次函数调用之前再次分配它。

此外,GetEnvironmentVariable只接受变量的名称,没有百分号字符。

以下修改后的代码似乎可以正常工作:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17849590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档