offset指令
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 所引用的对象仅用了“变量或标号”,我是用“操作数”来阐述的,本人的观点是
变量或标号感觉上包含的概念过窄,比如结构、函数等等,,觉得使用操作数好像感觉准确些。
以上就是小编今天的分享了,希望可以帮助到大家。
长沙网络推广
- 平凉整站优化:提升网站竞争力的关键
- 重庆百度关键词seo怎么做网络推广
- 松原关键词优化策略:提升您网站的可见性和流
- 万国数据备案域名出售:如何为您的业务选择合
- 兰州百度SEO排名:提升网站可见性的有效策略
- 山东优化关键词排名推广如何做百度排名
- 湟中百度优化服务:提升您网站排名的最佳选择
- 马关百度关键词SEO策略与实践指南
- 陕西SEO怎么做网站推广
- 花莲SEO优化:提升您网站排名的最佳策略
- 璧山SEO网站推广:有效提升你的网站流量与曝光
- 桂林优化关键词排名推广:提升您的在线能见度
- 崇信企业网站优化:提升您在线业务的秘密武器
- 江西SEO推广怎样跟客户谈判容易签下合同
- 为什么新网备案域名玩得开心?
- 开远百度关键词排名:提升你的网站可见度