新闻中心

EEPW首页>嵌入式系统>设计应用> 8086指令系统---数据传送指令

8086指令系统---数据传送指令

作者: 时间:2016-11-27 来源:网络 收藏


  注意:
   ● 只限于在AL或AX与I/O端口之间传送信息
   ● 不影响标志位

  XLAT   ; 换码指令(translate)
  执行操作: (AL) ← ((DS)×16+(BX)+(AL))
  这条指令根据AL寄存器提供的位移量,将BX指示的字节表格中的代码换存在AL中。该指令还可写为:XLAT opr,opr为字节表格的首地址,因为opr所表示的偏移地址已存入BX寄存器,所以opr在换码指令中可有可无,有则可提高程序的可读性。

  注意:
   ● 所建字节表格的长度不能超过256字节,因为存放位移量的是8位寄存器AL;
   ● XLAT指令不影响标志位。

例 IN   AL, 61H   ; (AL) ← 端口61H的内容
         MOV   DX, 278H   ; (DX) ← 端口地址278H
          IN   AL, DX    ; (AL) ← 端口278H的内容

  例 OUT   61H, AL   ; 61H端口 ← (AL)
         MOV   DX, 279H   ; (DX) ← 端口地址279H
         OUT   DX, AX    ; 279H端口 ← (AX)

3 地址传送指令

  这组指令完成把地址送到指定寄存器的功能。

  LEA reg, src ; 有效地址送寄存器(load effective address)
  执行操作:(reg) ← offset of src
  LEA指令把源操作数的有效地址送到指定的寄存器,这个有效地址是由src选定的一种存储器寻址方式确定的。

  LDS reg, src ; 指针送寄存器和DS(load DS with point)
  执行操作: (reg) ← (src)
       (DS) ← (src+2)

  LES reg, src ; 指针送寄存器和ES(load ES with point)
  执行操作: (reg) ← (src)
       (ES) ← (src+2)

  LDS和LES指令把确定内存单元位置的偏移地址送寄存器,段地址送DS或ES。这个偏移地址和段地址(也称地址指针)是由src指定的两个相继字单元提供的。

  注意:
  ● 指令中的reg不能是段寄存器;
  ● 指令中的src必须使用存储器寻址方式;
  ● 该指令不影响标志位。

例假设某数据段定义如下:
  0000        DATA SEGMENT
  0000 0040      TABLE   DW  0040H
  0002 3000           DW  3000H
  0004        DATA ENDS

  请指出下列指令的执行结果,并说明它们之间的区别。
  ① MOV BX, TABLE
  ② LEA BX, TABLE
  ③ MOV BX, OFFSET TABLE

  答:第①条指令执行后,(BX)=0040H,
    第②条指令执行后,(BX)=0000,
    第③条指令执行后,(BX)=0000。

 比较①②两条指令,第①条MOV指令是用直接寻址方式把变量TABLE的内容送入BX,而LEA指令是把TABLE的地址送入BX。

  比较②③两条指令可以看到,LEA和用OFFSET指示符实现的功能是相同的,都是将TABLE的偏移地址0000送BX。既然功能相同,它们之间还有什么区别呢?

  首先,LEA指令可以使用各种存储器寻址方式,如,LEA BX,[DI],LEA BX,TABLE[DI],LEA SI,[BX+DI]等,这些指令都是把计算出来的有效地址送目的寄存器,而OFFSET不能使用这些寻址方式,它只作用于像TABLE这样的简单变量(或标号)。

  其次,对简单变量,OFFSET指示符比LEA执行速度快,因为MOV BX, OFFSET TABLE指令在汇编时,由汇编程序计算出了TABLE的偏移地址,并被汇编成立即数传送指令,因此效率很高,而LEA指令是在执行时才计算地址,然后再传送到指定寄存器,因此执行速度相对慢一些。

  例 对例3.17的数据定义,下列两条指令的执行结果是什么?
      ① LDS BX, TABLE
      ② LES BX, TABLE

  答:LDS指令执行后,(BX)=0040H, (DS)=3000H
    LES指令执行后,(BX)=0040H, (ES)=3000H

 4 标志寄存器传送指令

 这组指令完成和标志位有关的操作。

 LAHF 标志寄存器的低字节送AH(load AH with flags) 

 SAHF AH送标志寄存器低字节(store AH into flags)

 PUSHF 标志进栈(push the flags)

 POPF 标志出栈(pop the flags)


注意:
   ● LAHF和SAHF指令隐含的操作寄存器是AH和FLAGS
   ● LAHF和PUSH不影响标志位,SAHF和POPF则由装入的值来确定标志位的值。

LAHF 标志寄存器的低字节送AH(load AH with flags)
  执行操作:
  (AH) ← (FLAGS)0-7

SAHF AH送标志寄存器低字节(store AH into flags)
  执行操作:
  (FLAGS) 0-7 ← (AH)

PUSHF 标志进栈(push the flags)
  执行操作:
  (SP) ← (SP)-2
  ((SP)+1,(SP)) ← (FLAGS)0-15

POPF 标志出栈(pop the flags)
  执行操作:
  (FLAGS) 0-15 ← ((SP)+1,(SP))
  (SP) ← (SP)+2

上一页 1 2 下一页

评论


技术专区

关闭