新闻中心

8086寻址方式

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


  这种寻址方式也为堆栈处理提供了方便。
  一般(BP)可指向栈顶,从栈顶到数组的首址可用位移量表示,变址寄存器可用来访问数组中的某个元素。

  综上所述,有效地址可以由以下三种成分组成:
  · 位移量(Displacement)是存放在指令中的一个8位或16位数,但它不是立即数,而是一个地址。
  · 基址(Base)是存放在基址寄存器(BX或BP)中的内容。它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址。
  · 变址(Index)是存放在变址寄存器(SI或DI)中的内容。它通常用来访问数组中的某个元素或字符串中的某个字符。

  有效地址的计算可用下式表示:
  EA = 基址 + 变址 + 位移量

  这三种成分都可正可负,以保证指针移动的灵活性。它们任意组合使用,可得到不同的寻址方式。

例 MOV AX, MASK[BX][SI]
      (或 MOV AX, MASK[BX+SI],或 MOV AX, [MASK+BX+SI])
      如(DS)= 3000H,(BX)= 2000H,(SI)= 1000H,MASK = 0250H,
      则物理地址 = 30000H + 2000H + 1000H + 0250H = 33250H
      指令执行情况如图3.6所示,最后的执行结果是(AX)= 1234H。

与转移地址有关的寻址方式

  前面的与数据有关的寻址方式最终确定的是一个数据的地址,而这里的与转移地址有关的寻址方式最终确定一条指令的地址。顺序执行的指令地址是由指令指针寄存器IP自动增量形成的,而程序转移的地址必须由转移类指令和CALL指令指出,这类指令表示转向地址的寻址方式包括:段内直接寻址、段内间接寻址、段间直接寻址、段间间接寻址。

三个表示转移距离(称为位移量)的操作符:SHORT、NEA*、**R。

  SHORT表示位移量在-128~127字节之间。

  NEA*表示在同一段内转移,位移量在-32768~32767字节范围内。

  **R表示转移距离超过±32K字节,或是在不同段之间转移。
  因为CS:IP寄存器总是指向下一条将要执行的指令的首地址(称为IP当前值),当转移指令执行后,必须修改IP或CS、IP的值。当转移指令给出位移量时,用IP当前值加上位移量即为新的IP的值。

  SHORT转移,称为短转移,位移量用一个字节(8位)来表示。

  NEAR转移,称为近转移,位移量用16位表示,因为程序控制仍然在当前代码段,所以只修改IP的值,CS的值不变。

  FAR转移,称为远转移,因为程序控制超出了当前代码段,所以CS和IP都必须修改为新的值。

  与转移地址有关的4种寻址方式就是告诉CPU如何修改CS和IP的值,以达到控制程序转移的目的。

1 段内直接寻址(Intrasegment direct addressing)

  这种寻址方式在指令中直接指出转向地址,如:

    JMP SHORT NEXT
    JMP NEAR PTR AGAIN

  其中,NEXT和AGAIN均为转向的符号地址。在机器指令中,操作码之后给出的是相对于当前IP值的位移量(转移距离),所以,转向的有效地址是当前IP值与指令中给出的位移量(8位或16位)之和。  

  注意:这种寻址方式适用于条件转移及无条件转移指令,当用于条件转移指令时,位移量只允许8位。

例 段内直接寻址方式

            1060:000D EB04 JMP SHORT NEXT
      IP当前值→ 1060:000F … …
            1060:0011 … …
            1060:0013 0207 NEXT: ADD AL,[BX]

  CPU在执行JMP指令时,IP指向了下一条指令,其值为000F,JMP SHORT NEXT指令的机器语言为EB04,EB为操作码,04为位移量,所以转向的有效地址应为:
            000F + 0004 = 0013

  0013正是标号NEXT的地址。JMP指令执行后,将IP寄存器修改为0013,代码段寄存器CS不变。紧接着CPU根据CS:IP的指示,取出1060:0013中的ADD指令开始执行,这样实现了程序的转移。

2 段内间接寻址(Intrasegment indirect addressing)

  这种寻址方式在指令中用数据寻址方式(除立即寻址方式外)间接地指出转向地址,如:

    JMP BX
    JMP NEAR PTR [BX]
    JMP TABLE[SI]

  根据指令中的寻址方式,确定一个寄存器或一个存储单元,其内容就是指定转向的有效地址。因为程序的转移仍在同一段内进行,所以只需将IP修改成新的转向地址,CS不变。段内转移指令中的NEAR PTR是可以缺省的。

  注意:这种寻址方式以及以下的两种段间寻址方式都不能用于条件转移指令。

  条件转移指令只能使用段内直接寻址的8位位移量,而JMP和CALL指令则可用四种寻址方式中的任何一种。

  假设: (DS)= 2000H,(BX)= 1256H,(SI)= 528FH,
      位移量 = 20A1H,(232F7H)= 3280H,(264E5H)= 2450H。

  例 JMP BX
        则执行该指令后(IP)= 1256H

  例 JMP [BX][SI]
        则指令执行后(IP)=(16d ×(DS)+(BX)+(SI))
                 =(20000H + 1256H + 528FH)
                 =(264E5H)
                 = 2450H

3 段间直接寻址(Intersegment direct addressing)

  段间直接寻址和段内直接寻址类似,指令中直接给出转向地址,不同的是,在符号地址之前要加上表示段间远转移的 操作符FAR PTR。

  指令格式如下:
     JMP FAR PTR OUTSEG

   因为是段间转移,CS和IP都要更新,这个新的段地址和偏移地址由指令操作码之后的连续两个字提供,所以只要将指令中提供的转向偏移地址装入IP,转向段地址装入CS,就完成了从一个段到另一个段转移的工作。

4 段间间接寻址(Intersegment indirect addressing)

  这种寻址方式仍然是用相继两个字的内容装入IP和CS来达到段间的转移目的的,但这两个字的存储器地址是通过指令中的数据寻址方式(除立即寻址方式和寄存器寻址方式外)来取得的。

  为了说明寻址两个字单元,指令中必须加上双字操作符DWORD。指令格式如下:
    JMP DWORD PTR [SI]
    JMP DWORD PTR[TABLE+BX]

上一页 1 2 下一页

关键词:8086寻址方

评论


技术专区

关闭