offset指令

生活百科 2022-10-29 19:15www.ai-classes.cn生活常识

offset指令是什么,怎么使用呢?不知道的小伙伴来看看小编今天的分享吧!

1、offset指令简介

伪指令offset是汇编语言中编译器处理的符号,它的功能是取得标号的偏移地址。

assu cs:code

code segnt

start: mov ax,offset start ;相当于mov ax,0

;start所标记的是代码段的第一条指令,偏移地址为0

s: mov ax,offset s  ;相当于mov ax,3

;s所标记的指令是代码段中的第二条指令,第一条指令的长度为3byte,则s的偏移地址为3

code ends

end start

2、问题

有如下程序段,填写两条指令,使改程序在运行中将s处的第一条指令复制到s0处

代码如下

;问题有如下程序段,填写两条指令,使改程序在运行中将s处的第一条指令复制到s0处

assu cs:code

code segnt

s: mov ax,bx ;mov ax,bx机器码占两个字节

mov si,offset s

mov di,offset s0

mov dx,cs:[si] ;数据从哪里来

mov cs:[di],dx ;数据到哪里去

s0: nop ;cpu遇到nop指令什么都不做,nop指令占一个字节

nop

code ends

end s

拓展资料

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

以上就是小编今天的分享了,希望可以帮助到大家。

Copyright © 2014-2025 Www.ai-classes.cn 爱句子网