offset指令是甚么,怎样运用呢?不知道的小伙伴来看看小编今日的分享吧!
1、offset指令简介:
伪指令offset是汇编言语中编译器解决的标记,它的作用是取得标号的偏移地点。
assume cs:code
code segment
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处:
assume cs:code
code segment
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 所援用的对象仅用了“变量或标号”,我是用“操作数”来阐述的,自己的看法是:
变量或标号感受上蕴含的观点过窄,譬如构造、函数等等,因而,认为运用操作数彷佛感受正确些。 <