注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Search的博客

不断学习中!

 
 
 

日志

 
 

汇编语言 LEA ,OFFSET, SEG功能有什么不同?  

2012-04-09 15:37:10|  分类: 汇编语言学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
LEA  BX,LIST MOV  BX,OFFSET  LIST 可以看出,LEA和OFFSET这两条指令在功能上是相同的,BX寄存器都可得到符号地址LIST的值,而且此时MOV指令的执行速度会比LEA指令更快。但是,OFFSET只能与简单的符号地址相连,而不能和诸如LIST[SI]或[SI]等复杂操作数相连。因此,LEA指令在取得访问变量的工具方面是很有用的。 OFFSET是将数值回送变量或标号的偏移地址值 LEA是将数值回送变量或标号的有效地址值 SEG, 汇编程序将回送变量或标号的段地址值。
操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。

比如:
assume cs:codesg
codesg segment
start:mov ax, offset start                          ;相当于mov ax, 0
s: mov ax, offset s                                    ;相当于mov ax, 3
codesg ends
end start

offset操作符取得了标号start和s的偏移地址0和3,所以指令:mov ax, offset start相当于mov ax, 0,因为start是代码段中的标号,它所标记的指令是代码段中的第一条指令,偏移地址为0;

mov ax, offset s相当于指令mov ax, 3,因为s的代码段中的标号,它所标记的指令是代码段中的第二条指令,第一条指令长度为3字节,则s的偏移地址为3。

根据如下程序段,添加2条指令,使程序在运行中将s处的一条指令复制到s0处。
assume cs:codesg
codesg segment
s:mov ax, bx                    ;(mov ax, bx的机器码占2个字节)
   mov si, offset s
   mov di, offset s0
   ?
    ?

s0: nop                              ;(nop的机器码占一个字节)
      nop

codesg ends
end s

分析:
1、s和s0处的指令所在的内存单元地址分别是:cs:offset s和cs:offset s0。
2、将s处的指令复制到s0处,就是将cs:offset s处的数据复制到cs:offset s0处;
3、段地址已知在cs中,偏移地址offset s和offset s0已经送入到si和di中;
4、要复制的数据长度为:mov ax, bx,指令的长度为2个字节,即一个字。

程序如下:
assume cs:codesg
codesg segment

s:mov ax, bx
   mov si, offset s
    mov di, offset s0
  
   mov ax, cs:[si]
   mov cs:[di], ax


s0:nop
     nop

codesg ends
end s
  评论这张
 
阅读(2211)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017