指令系统(三)

目录

寻址方式(二)

转移地址的寻址方式

程序的执行顺序由CSIP的内容决定。正常情况下,CPU每执行一条指令,IP的内容自动加 1,使之指向下一条指令。当遇到转移指令时,通过自动改变 CSIP 的内容,达到改变程序执行地址的目的。

实现转移的指令:无条件转移指令 JMP,它表示转移到指定的地址。

image-20230217101820195

段内寻址表示转移在本段内完成,段间寻址表示转移在不同段之间完成。

段内寻址

程序开始转移后,只有 IP变化,通过直接寻址或间接寻址寻找偏移地址是多少,然后传送给 IP

直接寻址(相对寻址)

段内直接寻址是指直接在指令中给出转移目的地址(16位偏移地址,使用标号描述),转移在同一个段内完成

下面分析,转移指令JMP

image-20230217111738258

程序汇编后,JMP L1所占字节为,一个字节的操作码+?个字节的相对位移量

下面再看这个相对位移量是多少

image-20230217111746982

  1. 在执行完跳转前,因为程序汇编自上而下进行,IP指到上图位置,汇编会自动计算标号 L1JMP的相对位移量,当满足两个条件

    • 负向转移

    • 相对位移量 < -128

​ 此时汇编后的相对位移量占1个字节,如果 -32768 > 相对位移量 > -128,此时汇编后的相对位移量占2个字节

  1. 假设,标号 L1JMP下方,由于当程序编译到 JMP时不知道相对位移量是多少,此时汇编后的相对位移量占2个字节。

如果你知道标号 L1JMP的相对位移量不会超过 +128字节,怎么让相对位移量占1个字节呢?

解决,把代码改成:

JMP SHORT L1

SHORT型转移说明,负向转移不超过128,正向转移不超过127

总结

  1. JMP指令占2-3个字节,当相对位移量在上图红色区间时或定义为 SHORT型时,占2个字节;当相对位移量在绿色区域内占3个字节
  2. 转移到目的地的IP=当前 IP+相对位移量

8086指令系统中,所有的 条件转移指令只能是段内转移,且只能是 -128~+127。如果我只能使用条件转移,又想转移到段外怎么办呢?

解决:JMP搭桥。条件转移到段内某标号-->使用 JMP

例:8086CPU执行 JZ L1,指令时 IP=0100Hdisp=FDH,指令执行后 (IP)=?。(JZ是条件转移指令)

-----------------------------------------------------------------------分割线----------------------------------------------------------------------

分析:

  • JZ L1占2个字节,执行完后 IP=0100H+2H=0102H

  • 注意disp=FDH是一个带符号数,因为计算机中带符号数是用补码表示,因为-3的补码是 FDH,所以 disp=-3

    补码:

    • 正数的补码=原码
    • 负数的补码=原码(除符号位外)取反+1
  • (IP)=当前IP+disp=0102H+(-3)=00FFH

间接寻址

段内间接寻址是指转移目的地址(16位偏移地址)保存在寄存器或存储单中,转移也在同一个段内完成

例1:

    MOV BX, OFFSET L2
    JMP BX;(BX)-->IP,段内间接寻址
    .
    .
L2:

例2:

TABLE DW L2
    .
    .
    JMP TABLE;以TABLE变量直接寻址的段内间接寻址
    ;或
    MOV BX, OFFSET TABLE
    JMP WORD PTR [BX];以BX寄存器作间接寻址方式的段内间接寻址
    .
    .
L2:

段间寻址

直接寻址

段间直接寻址是指直接在指令中给出转移目的地址(16 位偏移地址和 16 位段地址),转移在不同段之间完成。指令中用JMP <标号>表示,当然这里的标号与该指令处在不同的段。

间接寻址

段间间接寻址是指转移目的地址(32位地址)保存在存储单元中,转移在不同的段之间完成,在指令中指出存储单元的偏移地址,可以采用以上介绍的 5 种存储器寻址方式。存储单元必须是双字型变量第一个字用于存放目的地址的段内偏移地址,第二个字用于存放目的地址的段地址

寻址方式总结

image-20230217144256480

posted @ 2023-02-17 14:00  打不死の小强丶  阅读(317)  评论(1编辑  收藏  举报