win32汇编中伪指令addr和offset指令的区别
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指令的区别相关推荐
- addr和offset指令的区别
一.相同点 1.addr 和 offset 操作符都是获得操作数的偏移地址: 2.addr 和 offset 的处理都是先检查处理的是全局还是局部变量,若是全局变量则把其地址放到目标文件中. 二.不同 ...
- 计算机汇编指令mov和mova,汇编语言中mov和lea指令的区别详解
指令(instruction)是一种语句,它在程序汇编编译时变得可执行.汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行. 一条指令有四个组成部分: 标号(可选) 指令助记符(必需) ...
- 汇编语言中MOV和OFFSET指令的两个问题?
(1)往段寄存器送段地址时要写成 MOV AX,DATA MOV DS,AX 不能写成 MOV DS,DATA 这是为什么?有人说由于段寄存只能进行16位的读写,因此需要用ax来倒一下,还有人说是因为 ...
- ARM汇编指令:LDR伪指令和LDR装载指令的区别
LDR伪指令的格式: LDR register, =expression 相当于把expression的值(其实标号可以理解为地址值)放到寄存器中: LDR装载指令的格式: LDR register ...
- 汇编中的call和ret指令
call和ret指令都是转移指令,它们都修改偏移地址或同时修改段地址和偏移地址.ret指令用栈中的数据,修改偏移地址,从而实现近转移.call可以通过位移和目的地址进行转移.下面来通过汇编代码学习一下 ...
- 学 Win32 汇编[6]: 伪指令 DUP 与数组
为什么80%的码农都做不了架构师?>>> 声明数组实例: ; Test6_1.asm .386 .model flat, stdcallinclude windows.inc ...
- 汇编中的test和cmp指令[Z]
首先看看:状态寄存器(即标志寄存器) PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成, 如下所示: 15 14 13 ...
- 【转】汇编中的test和cmp指令
看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,和大家一起把它们弄清楚. 首先看看:状态寄存器(即标志寄存器) PSW(Program F ...
- 汇编中addr和offset
汇编中addr和offset的异同点!!! 一.相同点 1.addr 和 offset 操作符都是获得操作数的偏移地址: 2.addr 和 offset 的处理都是先检查处理的是全局还是局部变量,若是 ...
最新文章
- mysql intersects_mysql gis 空间数据库 根据 经纬度查找附近 (INTERSECTS,within)
- python怎么识别拼音-python获取一组汉字拼音首字母的方法
- 如何验证自己的网络是否支持ipv6
- return 关键字 c
- 川崎焊接机器人编程实例_机器人现场编程-川崎机器人示教-综合命令.pptx
- 【NOI2018】你的名字【后缀自动机】【可持久化线段树合并】【乱搞】
- 《狂人日记》金句摘抄(一)
- 工作220:git clone的时候地址需要改成自己的用户名
- 论文浅尝 | Convolutional 2D knowledge graph embedding
- mvc+ef中比较数据
- MyBaits resultMap 返回值与对象不匹配处理
- L1-028. 判断素数-PAT团体程序设计天梯赛GPLT
- Atitit 艾提拉音频资源列表与统计 t6 六月份战果与7月份规划.docx 目录 1. 第一层次 原始资源类 采集资源类	1 1.1. K歌类采集资源 整理	1 1.2. K歌类资源初步分类
- MySQL数据库学习资料(一)
- 投票统计器用单片机c语言编写,基于51单片机的投票器毕业论文.doc
- 科技文献检索课题 计算机,科技文献检索课题.doc
- 企业人事系统 java_java企业人事管理系统
- 【Unity游戏开发】动画系统(四)Unity3d动画基础
- ## 用python 80行代码实现一个微信消息撤回捕捉功能
- Failed to load JVM DLL