你的位置: 首页 > 手机资讯 > offset指令

offset指令

更新时间:2022-06-19 15:13

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 所援用的对象仅用了“变量或标号”,我是用“操作数”来阐述的,自己的看法是:
变量或标号感受上蕴含的观点过窄,譬如构造、函数等等,因而,认为运用操作数彷佛感受正确些。 <

相关下载

相关合集

Copyright 2012-2022 掌游网 豫ICP备2021037784号-1

声明:本站所有资源均来自网络,版权归原公司及个人所有。如有版权问题,请及时与我们网站编辑在线QQ2046095005联系,我们在第一时间予以删除,谢谢!