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 所引用的对象仅用了“变量或标号”,我是用“操作数”来阐述的,本人的观点是:
变量或标号感觉上包含的概念过窄,比如结构、函数等等,因此,觉得使用操作数好像感觉准确些

相关文章推荐

win32汇编中伪指令addr和offset指令的区别

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

学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS

PTR: 指定要操作的数据尺寸 ; Test12_1.asm .386 .model flat, stdcall include windows.inc include kerne...

Win32汇编的 PTR, OFFSET, ADDR

http://tech.ddvip.com/2010-04/1270705496150170.html PTR: 指定要操作的数据尺寸 OFFSET: 获取全局变量或标号的偏移地址 ADDR: ...
  • cay22
  • cay22
  • 2012-03-12 20:18
  • 1392

学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS

PTR: 指定要操作的数据尺寸 ; Test12_1.asm .386 .model flat, stdcall include windows.inc include kerne...

MFC与Win32编程的区别与联系

楼主:    win32和mfc的开发的大概区别知道,我只想知道其主要的方向的区别。两个都是开发在windows平台上运行的程序,能用mfc开发的,为什么要用win32api来开发呢,象一些wind...

Win32 汇编语句模板

Win32 汇编语句模板 一 变量 ;句柄 hInstance dd 0 hWnd dd 0 hPen dd 0 hPend ...

Win32汇编——文件操作

一、创建和读写文件 打开、创建文件:CreateFile  (文件名需全路径) 关闭: CloseHandle 调整文件指针: SetFilePointer         无GetF...

Win32汇编学习笔记(罗云彬)(二)

1.代码段的属性是由PE头部中的属性位决定的,通过编辑exe文件,把代码段的属性位改为可写,程序就允许修改自己的代码段。典型的应用如:这对可执行文件的压缩软件和加壳软件。 2.堆栈段的内存属性是可读...

Win32 汇编: 常用寄存器的常规功能

通用寄存器 EAX 累加(Accumulator)寄存器 AX(AH、AL) 常用于乘、除法和函数返回值 EBX 基址(Base)寄存器 BX(BH、BL) 常做内存数据的指针 ECX 计数器(...

win32汇编 多线程编程与事件

时间片的概念大家应该都了解过,windows为每个进程分配时间片,当一个程序的时间片结束时,就会轮到下一个程序执行,当轮流速度比较快的时候,就好像多个进程同时执行一样,这就是windows多任务的方式...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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