当前课程知识点:微机原理与接口技术 > 第7周 程序与处理器控制 > 第26讲 转移类指令 > 无条件转移指令
好 现在我们来学习转移类指令
转移类指令是通过修改指令的偏移地址
或者是指令的段基地址加偏移地址
来实现程序的转移
转移类指令一共有两个小小类
一类称为无条件转移指令
还有一类称为条件转移指令
那么 顾名思义
所谓无条件转移指令
就是在不设定任何条件的情况下
就控制程序转移到目标地址
而条件转移指令
那是需要在一定条件满足的情况下
才能实现程序的转移
在这里 这里的一定条件我们通常是指状态标志位
因此 状态标志位它的不同状态的含义
就是它是0还是1它的含义
是希望大家一定要记住的
我们先来看无条件转移指令
无条件转移指令的格式是这样的
这是一条单操作数格式的指令
在指令助记符JMP后边
是下一条要执行的那条指令在内存中的地址
所以我们也称它为程序转移的目标地址
这个目标地址有可能和JMP指令在同一个代码段中
也就是说JMP指令执行完以后
下边要执行的那条指令
跟JMP在同一个代码段
这种转移我们叫段内转移
另外 就是说它的目标地址可能在另外一个逻辑段里
这就是段间的转移
因此 无条件转移指令
它可以实现在同一个代码段内的转移
它也可以实现从一个代码段转移到另外一个代码段
也就是说 段间的转移
段内的转移就像我们在一层楼上
从这样一个房间转到另外一个房间一样
也就是说楼层地址并没有变
这样它的转移范围是比较短 比较近的
那么这种情况下我们并不需要改变楼层号
而只是需要改变这个楼上的等于是不同房间的编号
而段间转移就相当于
我们从这一层楼搬到其他的楼层上了
这样不仅是改变了房间的编号
而且还改变了楼层号
下面我们先来看无条件的段内转移
因为段内转移刚才我们说
相当于在一层楼上房间的调整
所以这个时候它转移的目标地址
不再涉及段基地址而仅仅涉及了偏移地址
偏移地址我们已经知道它是个16位的
因此在这里转移的目标地址就只是16位的地址了
这种时候转移的目标地址可以由指令中直接给出
这种转移方式我们称为段内的直接转移
我们也可以将这个转移的目标地址
事先存放在某个16位的寄存器
或者内存两个单元里
由它们来给出转移的目标
这种转移的方式称为段间转移
下边我们先来看段内直接转移的指令格式
所谓段内的直接转移
就是转移的目标地址由指令直接给出来
这个时候指令的格式是这样
JMP指令后边是一个标号
这个标号的起名规则我们在第四章中
会再给大家介绍
通常情况下就是不要超过32个字符
首字母不能是数字等等
但是建议大家这个标号最好能有一个具体的含义
在这里这个标号和助记符JMP之间
没有给出任何的说明
表示这个Label也就是这个标号
是一个近地址标号
近地址标号的意思就是段内直接转移的意思
如果用这个图来表示的话
就是说这个时候执行完JMP之后
程序不会转移到其他的代码段
而是在当前代码段中
编译器在看到这条指令之后
它一看到这个Label是近地址标号
它就会在JMP指令当前的代码段中去找这个Label
找到这个Label以后
它计算Label到JMP之间的距离 也就是位移量
然后把这个位移量
和JMP所在的这个单元的偏移地址
也就是说IP的值
相加 然后再结果送给IP
这样的话等于就算是修改了IP寄存器的内容
我们说一旦修改了IP的值
那就意味着下边一条指令不再会是加1了
而是会转到新的IP这个地方去执行
这样也就实现了程序的转移
而段内间接转移
是将转移的目标地址放在某个16位的寄存器中
或者存储器的某两个单元中
我们用一个例子来说明一下
假设这两条指令的执行
第一条指令执行完BX等于1200H
下边这条指令 JMP指令的后边请大家永远记住
就是下一条要取的那条指令的地址
现在JMP后边是个BX
表示下边要取的那条指令
它的偏移地址是BX的值
因此 这条指令执行完以后IP就会等于1200H
也就是相当于把BX的值赋给了IP
那么我们程序就实现转移了
下边我们来看段内间接转移的另外一种表现形式
大家看这个时候这条JMP指令的后边
是一个存储器操作数
而这个存储器操作数
采用的寻址方式是寄存器间接寻址
间指寄存器用的是BX
说明什么呢?
说明我们要找的那个数据在内存数据段中
我们说过JMP指令后边不论是什么样的表现形式
总而言之它是转移的目标地址
因此现在也就是说
我们这个目标地址是放在当前数据段
偏移地址为BX所指向的这个地方
BX等于多少?等于1200
请大家注意这个1200后面没有H 这是十进制数
所以就1200和1201号单元中的内容
就是转移的目标地址
因为这个时候这个存储器操作数的前面是WORD
用PTR说明了它的字长只有一个16位字长
说明这是段内转移
因此这条JMP指令执行完之后
1200和1201这两个单元中的内容
会被拿出来送给IP寄存器
因为IP被修改了
所以下边执行完JMP指令之后
就会走向新的这个地方去执行这条指令
这就是两种不同的段内转移
相对于段内转移
无条件的段间转移它的转移范围会比较大
或者说它的转移的目标地址比较远
这个时候不仅修改了目标的偏移地址
还要修改转移的段基地址
因此这个时候的目标地址
就是一个32位的目标地址了
其中16位是段基地址 16位是偏移地址
跟段内转移一样
无条件段间转移这个目标地址
也同样有两种方式可以给出
一种就是由指令直接给出的方式
这种方式我们称为段间的直接转移
另外一种就是通过间接地方式来给出
当然这个时候因为目标地址是32位了
不可能由一个寄存器来描述
所以这个时候作为段间转移
这个32位的目标地址只能存放在内存中
由四个单元来表示
下边我们先来看无条件段间直接转移的转移方式
和段内直接转移一样
段间转移的目标地址也是由指令直接给出的
这个时候指令的格式是这样
在助记符JMP和它后边Label中间
有了一个修饰符FAR
一旦有了这个FAR表示这个Label是一个远地址标号
也就是说这个时候
程序在执行完JMP指令之后
会转向另外一个代码段
Label所指向的地方继续执行
那么段间间接转移呢?
因为这个时候转移的目标地址成了一个32位的地址
那么这个32位的地址就不可能在一个寄存器里放
而必须放在内存中了
这32位地址包括了16位的段基地址
和16位的偏移地址
比如我们来看这样一条指令
在这条指令中助记符JMP后边是一个存储器操作数
我们永远记住
请大家永远记住
JMP后边不论那个操作数是什么形式
它都是转移的目标地址
那么这个时候JMP后边是一个
寄存器间接寻址的存储器操作数
表示转移的目标地址在内存中
在内存的什么地方呢?
现在由PTR这个运算符
说明了这个存储器操作数
是一个DWORD类型的操作数
DWORD代表着DOUBLE WORD的意思
也就是说这个时候这个存储器操作数
是一个32位的存储器操作数
那么因为间指寄存器选择的是BX
所以这个转移的目标地址在数据段
BX所指向的地方
因为这里已经说明了这个存储器操作数是32位的
所以它占了四个字节
那么其中低地址单元的内容
就是转移目标的偏移地址
而高地址单元的内容就是转移目标的段基地址
CS和IP的值改变了
那么程序就会转向另外一个代码段
由CS和IP所指向的地方继续执行
好 我们下边来看一些无条件转移指令的例
比如这两行指令它们的段基地址都是2000
偏移地址 第一条指令的偏移地址是0100H
请大家注意这里的CS和IP的值
都默认是十六进制表示的
我们这里为了简单起见把H省略掉了
那么第二行指令执行完JMP NEXT之后
程序会转向标号为NEXT的地方
NEXT在哪里呢?假设就在这个地方
所以执行完第二行JMP指令之后
下边第三条程序要执行的指令
就是MOV BX,1200H
如果在这条MOV指令之后是一条JMP指令
那么这条JMP指令后边的转移目标地址在哪里呢?
在BX里头
因为BX是一个16位寄存器
说明它是一个段内转移
转移的目标地址就是BX的值也就是1200H
因此这条指令执行完程序会转向当前代码段
也就是说段基地址并不改变
但是偏移地址为1200的这个地方继续执行
好下面我们再来看一段无条件转移的例
这几行指令中第一行指令执行完SI等于1122H
第二行指令是将一个立即数0120H写入到内存中
内存的什么地方?
显然是在数据段偏移地址是1122所指向的单元
那么第三行是SI加2
第四行又将一个立即数写进了SI加2这个单元
也就是写进了1124这个单元 这个字单元
因此这四行指令执行完以后
内存数据段中会是现在这个图中这样的分布情况
那么如果继续执行一条JMP指令的话
我们来看这条JMP指令
因为它后边的操作对象是一个存储器操作数
并且是一个16位的存储器操作数
说明它是段内转移
转移的目标地址放在了内存中
所以这是段内间接转移
转移目标地址在哪呢?
在SI所指向的这个字单元里存放
因为SI现在是1124
所以现在这条指令执行完以后
IP的值就是0122H
好如果我们把这条指令换一下
换成这样一条指令
那么因为这个时候JMP后面的这个操作对象
已经变成了一个DWORD类型的存储器操作数
也就是说是一个四字节的存储器操作数
那么这个四字节的存储器操作数的偏移地址在哪呢?
在SI减2
因为SI现在是1124 所以减2又回到了1122
因此这个转移的目标地址
就是1122H所指向的这四个单元里头的内容
跟刚才我们分析的一样
低地址单元的内容是转移目标的偏移地址
高地址单元的内容是转移目标的段基地址
所以这一条JMP指令执行完CS就等于0122
IP等于0120
-第1讲 关于本课程
--关于本课程
-第2讲 微型计算机系统
--微机系统_01
--微机系统_02
-第3讲 微型计算机一般工作过程
-第4讲 数制与编码
--计算机中的编码
-第5讲 计算机中数的表示与运算
--数的表示
--符号数的表示
--数的表示与运算
-第6讲 基本逻辑运算与逻辑电路
-第7讲 本周小结
--本周小结
-第1周 微型计算机基础概论--第一周单元测验
-第8讲 8088微处理器
-第9讲 8088 CPU主要引线及机构
-第2周 8088微处理器--第二周单元测验
-第10讲 实模式存储器寻址
-第11讲 8088系统总线
--8088系统总线
-第12讲 微处理器小结
--微处理器小结
-单元测验--作业
-第13讲 指令概述
--指令概述
-第14讲 寻址方式
--寻址方式
-第15讲 通用数据传送指令
-第16讲 地址传送指令
--地址传送指令
-第17讲 输入输出指令
--输入输出指令
-第4周 数据传送指令--第四周单元测验
-第18讲 算术运算指令
--加法运算指令
--减法指令
--乘除运算指令
-第19讲 逻辑运算指令
-第20讲 移位操作指令
--移位操作指令
-第5周 算术运算、逻辑运算与移位操作指令--第五周单元测验
-第21讲 关于串操作指令的说明
--串操作指令说明
-第22讲 串传送与串比较
--串传送与串比较
-第23讲 串扫描指令
--串扫描指令
-第24讲 串装入与串存储指令
-第六周单元测验--作业
-第25讲 程序控制指令说明
-第26讲 转移类指令
--无条件转移指令
--条件转移指令
-第27讲 循环控制指令
--循环控制指令
-第28讲 过程调用指令
--过程调用指令
-第29讲 中断指令
--中断指令
-第30讲 处理器控制指令
--处理器控制指令
-第31讲 指令系统小结
--指令系统小结
-第7周 程序与处理器控制--第七周单元测验
-第7周 程序与处理器控制--第七周作业
-第32讲 汇编语言源程序
-- 汇编语言源程序_01
-- 汇编语言源程序_02
-第33讲 伪指令
--数据定义伪指令
--其它伪指令
-第34讲 系统功能调用
-第35讲 汇编语言程序设计示例详解
--程序设计示例1
-第36讲 汇编语言程序设计小结
-第8周 汇编语言程序设计--第八周单元测验
-第8周 汇编语言程序设计--第八周作业
-第37讲 半导体存储器概述
--半导体存储器概述
-第38讲 内存单元编址
--存储单元编址
-第39讲 随机存取存储器RAM
-- RAM_01
--RAM_02
-第40讲 只读存储器ROM
--ROM_01
--ROM_02
-第九周单元测验--作业
-第41讲 半导体存储器扩展
--存储器扩展_2
-第42讲 半导体存储器小结
--半导体存储器小结
-第十周单元测验--作业
-第十周作业--作业
-第43讲 基本I/O接口
-第44讲 简单接口芯片
--简单接口芯片
-第45讲 基本输入输出方法
--基本I/O方法
-第46讲 简单I/O控制系统设计
-第47讲 中断技术
--中断技术1
--中断技术2
-第48讲 输入输出与中断技术小结
--本周小结
-第十一周单元测验--作业
-第49讲 可编程定时计数器
-第50讲 可编程并行接口
-第51讲 可编程接口小结
--本周小结_01
--本周小结_02
-第十二周单元测验
-第52讲 模拟量的输入输出
--模拟量的输入输出
-第53讲 D/A转换器
-第54讲 A/D转换器
-- A/D转换器_01
-第十三周单元测验--作业
-第55讲 I/O接口系统综合设计示例详解I
-第56讲 综合设计示例详解II
-第57讲 结束语
--结束语