指令系统(三)
寻址方式(二)
转移地址的寻址方式
程序的执行顺序由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 种存储器寻址方式。存储单元必须是双字型变量,第一个字用于存放目的地址的段内偏移地址,第二个字用于存放目的地址的段地址。