一、相同点

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

二、不同点

1、addr    伪操作符,只能用在 invoke 伪指令语句中;(本来就是为了在invoke指令中,使用局部变量的地址
      在其他例如mov指令中,可以先使用lea指令,来取得局部变量的地址
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 所引用的对象仅用了“变量或标号”,我是用“操作数”来阐述的,本人的观点是:
变量或标号感觉上包含的概念过窄,比如结构、函数等等,因此,觉得使用操作数好像感觉准确些。

原文:http://hi.baidu.com/%C1%D4%BB%A7%CC%EF/blog/item/f95aeccafbb06517bf09e6f5.html

win32汇编中伪指令addr和offset指令的区别相关推荐

  1. addr和offset指令的区别

    一.相同点 1.addr 和 offset 操作符都是获得操作数的偏移地址: 2.addr 和 offset 的处理都是先检查处理的是全局还是局部变量,若是全局变量则把其地址放到目标文件中. 二.不同 ...

  2. 计算机汇编指令mov和mova,汇编语言中mov和lea指令的区别详解

    指令(instruction)是一种语句,它在程序汇编编译时变得可执行.汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行. 一条指令有四个组成部分: 标号(可选) 指令助记符(必需) ...

  3. 汇编语言中MOV和OFFSET指令的两个问题?

    (1)往段寄存器送段地址时要写成 MOV AX,DATA MOV DS,AX 不能写成 MOV DS,DATA 这是为什么?有人说由于段寄存只能进行16位的读写,因此需要用ax来倒一下,还有人说是因为 ...

  4. ARM汇编指令:LDR伪指令和LDR装载指令的区别

    LDR伪指令的格式: LDR  register, =expression 相当于把expression的值(其实标号可以理解为地址值)放到寄存器中: LDR装载指令的格式: LDR register ...

  5. 汇编中的call和ret指令

    call和ret指令都是转移指令,它们都修改偏移地址或同时修改段地址和偏移地址.ret指令用栈中的数据,修改偏移地址,从而实现近转移.call可以通过位移和目的地址进行转移.下面来通过汇编代码学习一下 ...

  6. 学 Win32 汇编[6]: 伪指令 DUP 与数组

    为什么80%的码农都做不了架构师?>>>    声明数组实例: ; Test6_1.asm .386 .model flat, stdcallinclude windows.inc ...

  7. 汇编中的test和cmp指令[Z]

    首先看看:状态寄存器(即标志寄存器) PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成, 如下所示: 15   14    13 ...

  8. 【转】汇编中的test和cmp指令

    看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,和大家一起把它们弄清楚. 首先看看:状态寄存器(即标志寄存器) PSW(Program F ...

  9. 汇编中addr和offset

    汇编中addr和offset的异同点!!! 一.相同点 1.addr 和 offset 操作符都是获得操作数的偏移地址: 2.addr 和 offset 的处理都是先检查处理的是全局还是局部变量,若是 ...

最新文章

  1. mysql intersects_mysql gis 空间数据库 根据 经纬度查找附近 (INTERSECTS,within)
  2. python怎么识别拼音-python获取一组汉字拼音首字母的方法
  3. 如何验证自己的网络是否支持ipv6
  4. return 关键字 c
  5. 川崎焊接机器人编程实例_机器人现场编程-川崎机器人示教-综合命令.pptx
  6. 【NOI2018】你的名字【后缀自动机】【可持久化线段树合并】【乱搞】
  7. 《狂人日记》金句摘抄(一)
  8. 工作220:git clone的时候地址需要改成自己的用户名
  9. 论文浅尝 | Convolutional 2D knowledge graph embedding
  10. mvc+ef中比较数据
  11. MyBaits resultMap 返回值与对象不匹配处理
  12. L1-028. 判断素数-PAT团体程序设计天梯赛GPLT
  13. Atitit 艾提拉音频资源列表与统计 t6 六月份战果与7月份规划.docx 目录 1. 第一层次 原始资源类 采集资源类 1 1.1. K歌类采集资源 整理 1 1.2. K歌类资源初步分类
  14. MySQL数据库学习资料(一)
  15. 投票统计器用单片机c语言编写,基于51单片机的投票器毕业论文.doc
  16. 科技文献检索课题 计算机,科技文献检索课题.doc
  17. 企业人事系统 java_java企业人事管理系统
  18. 【Unity游戏开发】动画系统(四)Unity3d动画基础
  19. ## 用python 80行代码实现一个微信消息撤回捕捉功能
  20. Failed to load JVM DLL

热门文章

  1. loopback地址问题
  2. 基于Opencv 的 粗糙 美颜 人眼放大
  3. PC端微信内置浏览器兼容问题
  4. Java 平台中的增补字符
  5. 【win7】NtWaitForKeyedEvent
  6. 《小说阅读》txt小说浏览器、小说阅读、小说语音阅读
  7. unity 刘海屏适配问题
  8. 高性能跨全端图表组件--uCharts
  9. 《炬丰科技-半导体工艺》硅片超声清洗方法及配置
  10. File.Create(zipFilePath)时对路径XX的访问被拒绝