指令系统(三)
寻址方式(二)
转移地址的寻址方式
程序的执行顺序由CS和IP的内容决定。正常情况下,CPU每执行一条指令,IP的内容自动加 1,使之指向下一条指令。当遇到转移指令时,通过自动改变 CS 和 IP 的内容,达到改变程序执行地址的目的。
实现转移的指令:无条件转移指令
JMP,它表示转移到指定的地址。

段内寻址表示转移在本段内完成,段间寻址表示转移在不同段之间完成。
段内寻址
程序开始转移后,只有 IP变化,通过直接寻址或间接寻址寻找偏移地址是多少,然后传送给 IP
直接寻址(相对寻址)
段内直接寻址是指直接在指令中给出转移目的地址(16位偏移地址,使用标号描述),转移在同一个段内完成
下面分析,转移指令JMP

程序汇编后,JMP L1所占字节为,一个字节的操作码+?个字节的相对位移量
下面再看这个相对位移量是多少

-
在执行完跳转前,因为程序汇编自上而下进行,
IP指到上图位置,汇编会自动计算标号L1到JMP的相对位移量,当满足两个条件-
负向转移
-
相对位移量 < -128
-
此时汇编后的相对位移量占1个字节,如果 -32768 > 相对位移量 > -128,此时汇编后的相对位移量占2个字节
- 假设,标号
L1在JMP下方,由于当程序编译到JMP时不知道相对位移量是多少,此时汇编后的相对位移量占2个字节。
如果你知道标号
L1到JMP的相对位移量不会超过+128字节,怎么让相对位移量占1个字节呢?解决,把代码改成:
JMP SHORT L1
SHORT型转移说明,负向转移不超过128,正向转移不超过127
总结:
JMP指令占2-3个字节,当相对位移量在上图红色区间时或定义为SHORT型时,占2个字节;当相对位移量在绿色区域内占3个字节- 转移到目的地的
IP=当前IP+相对位移量
8086指令系统中,所有的 条件转移指令只能是段内转移,且只能是
-128~+127。如果我只能使用条件转移,又想转移到段外怎么办呢?解决:用
JMP搭桥。条件转移到段内某标号-->使用JMP
例:8086CPU执行 JZ L1,指令时 IP=0100H,disp=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 种存储器寻址方式。存储单元必须是双字型变量,第一个字用于存放目的地址的段内偏移地址,第二个字用于存放目的地址的段地址。
寻址方式总结


浙公网安备 33010602011771号