对于全局变量
它的地址在编译的时候已经由编译器确定了,它的用法大家都不陌生:
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寄存器做参数
标签:汇编,addr,局部变量,mov,eax,地址,ebp From: https://www.cnblogs.com/liming19680104/p/17871193.html