Win32汇编中addr和offset的区别联系

转载 2013年12月06日 00:34:57
一、相同点

1、addr 和 offset 操作符都是获得操作数的偏移地址;
2、addr 和 offset 的处理都是先检查处理的是全局还是局部变量,若是全局变量则把其地址放到目标文件中。

二、不同点

1、addr    伪操作符,只能用在 invoke 伪指令语句中;
2、offset 伪操作符可以用在任何可能涉及偏移地址的指令(当然包括 invoke 伪指令)并想获取操作数偏移地址的场合中;
3、addr 不能处理向前引用(即 addr 引用的操作数必须在使用 addr 前就得定义或声明),而offset 则能(不管引用的操作数是
其前或其后定义或声明);

所谓向前引用是指:标号的定义是在invoke    语句之后,比如在如下的例子:  
invoke    MessageBox,NULL,    addr    MsgBoxText,addr    MsgBoxCaption,MB_OK    //引用MsgBoxText、MsgBoxCaption 在先

......    

MsgBoxCaption    db    "Iczelion    Tutorial    No.2",0    //定义或声明 MsgBoxCaption 在 addr 后
MsgBoxText    db    "Win32    Assembly    is    Great!",0    //定义或声明 MsgBoxText 在 addr 后

如果您是用    addr    而不是    offset    的话,那    MASM    就会报

4、addr 是运行阶段在堆栈中分配内存空间,offset 是编译阶段由编译器解释。因此,addr 可以处理局部变量而 offset 则不能。

5、addr 如果检查到待处理的变量是局部变量,就在执行 invoke 语句前产生如下指令序列:    

lea    eax,operand
push    eax  

因为 lea 指令能够在运行时决定标号的有效地址,所以有了上述指令序列,就可以保证    invoke    的正确执行了。

总结:为了避免出现错误,建议除在局部变量中引用 addr 操作符外,其它场合使用 offset。

说明:某些文章中对 addr 和 offset 所引用的对象仅用了“变量或标号”,我是用“操作数”来阐述的,本人的观点是:
变量或标号感觉上包含的概念过窄,比如结构、函数等等,因此,觉得使用操作数好像感觉准确些

addr和offset指令的区别

一、相同点 1、addr 和 offset 操作符都是获得操作数的偏移地址; 2、addr 和 offset 的处理都是先检查处理的是全局还是局部变量,若是全局变量则把其地址放到目标文件中。 ...
  • u013350834
  • u013350834
  • 2014年01月01日 19:35
  • 224

Win32汇编语言学习笔记>>第二课:编写第一个Win32汇编程序

本节课主要是编译连接一段写好的代码: 程序运行如下: 代码: .386 .model flat,stdcall option casemap:none include C:\mas...
  • eldn__
  • eldn__
  • 2013年01月01日 12:33
  • 1296

win32 汇编基础

一、关于寄存器 寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会。 EA...
  • nicholas199109
  • nicholas199109
  • 2013年01月31日 22:58
  • 1657

Dalvik指令集 (smali汇编)

Dalvik虚拟机是基于寄存器架构的,数据的访问通过寄存器单间直接传递。对java的每个线程都有一个pc计数器和一个java栈。Pc计数器类似arm cpu中的PC寄存器和x86 cpu中的IP寄存器...
  • pomelozero
  • pomelozero
  • 2015年07月13日 22:25
  • 1646

WIN32汇编对话框的使用

刚开始接触windows下的对话框,第一感觉就像是一个一般的窗口一样,没有图标,只有一个框框,中间有一些提示的控件(按钮,输入的文本框等)信息,在学习使用对话框的时候,资源文件的编写我感觉比编写实现对...
  • qq_22642239
  • qq_22642239
  • 2016年03月25日 20:09
  • 749

win32汇编 钩子的编写与使用

说到钩子也许我们都很陌生(我以前从来没有接触过这个东西)
  • qq_22642239
  • qq_22642239
  • 2016年06月02日 17:36
  • 2299

win32汇编动态链接库的编写及使用

以前安装程序的时候,在安装目录下总会发现 好多的以.DLL结尾的文件,这些是什么玩意儿?有什么用?而且有时候运行程序的时候还会出现“无法定位程序输入点...与动态链接库....上”这种错误,现在想起来...
  • qq_22642239
  • qq_22642239
  • 2016年05月30日 21:53
  • 4369

WIN32汇编语言中位图的使用

说到位图,我们其实很早就接触过,从最早接触计算机,我们应该就知道有图片这个东西,然后再进一步说,图片在电脑上有好几种格式比如jpg. gif .png....
  • qq_22642239
  • qq_22642239
  • 2016年04月18日 11:12
  • 2910

使用WIN32汇编语言实现一个基本windows窗口的过程分析

一个常规的windows窗口一般都是一些一样的构造,你如果想要更改一些个性化的设置,你可以在这个一般的模板伤添砖加瓦,构造自己比较喜欢的类型,下边就分析一下一般的windows窗口的一般模板。 一...
  • qq_22642239
  • qq_22642239
  • 2016年03月07日 20:55
  • 2295

Win32汇编--使用资源—版本信息资源

转载于:http://www.cppblog.com/luqingfei/archive/2010/09/21/127239.html 有时应用程序需要确保自己运行时使用某一特定版本的DLL,以...
  • xiaotoly
  • xiaotoly
  • 2016年12月23日 15:59
  • 266
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Win32汇编中addr和offset的区别联系
举报原因:
原因补充:

(最多只允许输入30个字)