生活的天平本不平衡,只有通过努力改变其偏向。

@笔记:Win32汇编中取得变量地址的方法总结

2008-03-04

//转载请保留以下这段内容
//此文章为本人学习笔记和心得,仅供您学习参考,不能保证其正确性。
//您在阅读本篇文章是有什么意见或看法,需要和本人探讨或指出错误,请到本篇文章处给我留言
//来源:http://www.vcfans.com/2008/03/notes-win32-compilation-of-a-variable-address-methods.html
//By Lonkil (lonkil_at_gmail.com)
//2008-3-4

Win32汇编中取得变量地址的方法有:Offset、addr、lea。Offset和addr是伪指令,lea是汇编指令。Offset仅能取得全局变量的地址,addr取得全局变量和局部变量的地址,lea可以取全局的也可取局部变量。如以下代码:

.386
.model flat,stdcall
option casemap:none

;头文件及库文件
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib

;定义数据
.data
szCaption sz ’Welcome,Vcfans.Com!’,0
.code
Sub1 proc szpara:DWORD
;此处略去X行代码,^_^.
Sub1 endp
Test proc szCaption:DWORD
local @Name:dword
invoke Sub1,addr @Name;使用addr调用局部变量,由于@Name是局部变量所以不能用offset
;此处略去X行代码,^_^.
Test endp
start:
lea ebx,szCaption;使用lea将szCaption的地址送到ebx中。
invoke Test,offset szCaption;使用offset调用全局变量,此处也可以使用addr
invoke ExitProcess,NULL
end start

调用说明:
1.Offset只能用来调用全局变量
2.Addr可以用来调用全局变量,也可以用来调用局部变量。调用全局全量时编译器将其直接转化成Offset。调用局部变量时编译器执行两部操作,第一步:lea eax SameVar,第二步:通过eax传出地址。当调用局变量时,Addr只能和Invoke一起使用,而且Invoke在Addr参数左边是不能使用EAX的,这样会被Addr将EAX中的值给覆盖了。

作者:lonkil | 分类目录:本站原创编程开发 | 标签:

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>