汇编语言学习笔记之与转移地址有关的寻址方式

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

    在介绍这些寻址方式之前,先解释三个表示转移距离(称为位移量)的操作符:SHORT、NEAR、FAR。

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

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

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

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

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

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

3.1.2.1 段内直接寻址(Intrasegment direct addressing)
 
  这种寻址方式在指令中直接指出转向地址,如:

    JMP SHORT NEXT
    JMP NEAR PTR AGAIN

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

汇编语言学习笔记之与转移地址有关的寻址方式

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

            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指令开始执行,这样实现了程序的转移。

 

3.1.2.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。

汇编语言学习笔记之与转移地址有关的寻址方式  例3.10 JMP BX
        则执行该指令后(IP)= 1256H

汇编语言学习笔记之与转移地址有关的寻址方式  例3.11 JMP [BX][SI]
        则指令执行后(IP)=(16d ×(DS)+(BX)+(SI))
                 =(20000H + 1256H + 528FH)
                 =(264E5H)
                 = 2450H

 

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

  指令格式如下:
     JMP FAR PTR OUTSEG

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

汇编语言学习笔记之与转移地址有关的寻址方式

 

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

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

汇编语言学习笔记之与转移地址有关的寻址方式

  • 13
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值