汇编-addr获取变量地址

 

对于全局变量

它的地址在编译的时候已经由编译器确定了,它的用法大家都不陌生:

mov 寄存器, offset 全局变量名

 

addr获取局部变量

对于局部变量,它是用ebp来做指针操作的

局部变量1的地址是ebp-4局部变量2的地址是ebp-8......

由于ebp的值随着程序的执行环境不同可能是不同的, 所以局部变量的地址值在编译的时候也是不确定的, 不可能用offset伪操作符来获取它的地址。

复制代码
.386  
.model flat,stdcall 
option casemap:none
.stack 4096

ExitProcess PROTO,dwExitCode:DWORD  
 
.data   
 
    
 
.code  
 
TestProc Proc dwParam1:DWORD,bwParam1:DWORD
        local loc1:dword ,loc2:dword   ;用local语句定义了2个局部变量:loc1和loc2
                
        mov ebx, dwParam1   
        mov loc1,ebx       
        mov ecx,bwParam1
        mov loc2,ecx

        lea eax, [ebp-4]   ;把局部变量1的地址给eax
        mov edx,[eax]      ;EDX = 10101010h
        lea eax, [ebp-8]    ;把局部变量2的地址给eax
        mov edx,[eax]      ;EDX = 00202020h

                                        
        ret
TestProc endp
   
 
main PROC   
    
    invoke TestProc,10101010h,202020h
        
 
 
    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

函数调用时局部变量地址做参数 

如果要在invoke伪指令的参数中用到一个局部变量的地址, 该怎么办呢?参数中是不可能写入lea指令的, 用offset又是不对的。MASM对此有一个专用的伪操作符addr, 其格式为:
addr 局部变量名和全局变量名

当addr后跟全局变量名的时候, 编译器自动按照offset的用法来使用;

当addr后面跟局部变量名的时候, 编译器会自动用lea指令先把地址取到eax中, 然后用eax来代替变量地址使用

要注意的是:对局部变量取地址的时候, addr伪操作符只能用在invoke的参数中,不能用在如下的mov指令中, 这种限制很好理解, 因为这种情况下, lea指令如何能被代到语句里面呢:
mov eax, addr 局部变量名      ;注意:这是错误的用法

addr 引⽤的操作数(局部变量名)必须在使⽤ addr 前就得定义或声明

addr的左边,不能使用eax寄存器做参数

 

 

 

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(218)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2021-12-02 opencv-vector转化为Mat矩阵
2021-12-02 逆矩阵
2021-12-02 方阵的行列式
点击右上角即可分享
微信分享提示

目录导航