当前课程知识点:微机原理与接口技术 > 第5周 算术运算、逻辑运算与移位操作指令 > 第18讲 算术运算指令 > 加法运算指令
大家好
在学习完
数据传送类指令之后
今天我们来学习
算术运算类指令
所谓算术运算
就是加减乘除
所以
这一大类指令
也分为
加减乘除这样四个小类
和数据传送类指令
不同的是
算术运算类指令
它们的执行
基本上
会对状态标志位
都会产生影响
所以
大家在学习的时候
希望关注这一点
算术运算类指令
从原理上来讲
是整个8086指令集中
最简单的一类指令
但是它们在程序中
使用频度
也又相对比较高
所以
大家还是要
多花些心思
在这一类指令上
好
下边我们先来看
加法运算指令
加法指令
一共有三条
一条叫做
普通加法指令ADD
一条是
带进位的
加法指令ADC
还有一条
是加1指令INC
第一条
普通加法指令
通常会用在
两个字节
或者两个字
相加的
这样子的一个运算环境
因为8086指令集
针对的操作数
都是16位的
或者8位的
所以
如果要想
直接完成两个字节数的运算
或者是两个字相加
那么
用一条ADD指令
就可以了
但是
就如同我们
在十进制运算的时候
我们
低位的运算
或者说个位数的运算
它的结果
如果有进位的话
高位或者说十位
相加的时候
必须要考虑这个进位
这样一样
所以
在有多字节数
相加运算的时候
我们必须要考虑
低位可能存在的向上的进位
这种时候
如果用ADD指令
就不行了
那么这个时候
我们要用到
带进位的加法指令ADC
INC指令
我们在前面的例子里
实际上我们
已经有看到过
但是 当时
因为大家没有
还没有学到这条指令
所以我们都
只做了简单的注释
就过去了
这条指令
从指令格式上来讲
它属于
单操作数格式的指令
这条指令
跟前面两条指令
比较起来
它的一个
最主要的区别
就是它对标志位的影响
和前两条不一样
前两条指令
会影响
全部的六个状态标志位
而最后这一条INC指令
它不会影响CF
它只会影响
其余五个状态标志位
所以
在学习加法指令的时候
大家一定要注意这一点
在这类指令中
前面两条指令
作为双操作数格式的指令
它们对操作数的要求
MOV指令完全一样
好 下边我们先来看
第一条加法运算指令
ADD指令
ADD指令的一般格式是这样
它的原理很简单
就是原操作数
和目标操作数按位相加
结果送到目标地址
这条指令的执行
会对全部六个状态标志位
都产生影响
我们下边来看一个例
这两条指令的执行
就是完成了78H和99H相加
并且把结果写回到AL中
我们来看一下
这两条指令执行后
六个状态标志位的
状态
为了说明
这个对标志位的影响过程
我们把它转换成二进制数
它们的和是这样
运算完了以后
六个状态标志位
会是什么样的反应呢?
最高位向前有进位
所以CF等于1
在有限的这个字长里
这是这个
八位字长的最高位
它是0
所以SF也就等于0
半加进位的标志
就是第三位
向第四位的进位状态
目前是有的
所以AF也就等于1
结果显然不为0
所以ZF等于0
这八位数中
1的个数是偶数个
请大家一定注意
不包括这个
进掉的这一位
所以
PF会等于1
那么
最高位向前
已经有进位了
次高位向前有没有进位呢?
我们看一下
还是有进位
也就是说
次高位和最高位
向前的进位状态相同
所以
OF就等于0
这就是ADD指令执行后
对六个状态标志位的
影响的情况
如果
完成两个字节数
或者两个双字节数
求和的话
用ADD指令就可以了
但是
如同我们
做十进制运算一样
就低位的运算结果
如果有进位的话
一定在高位运算的时候
要考虑
所以
如果是两个
比较长字节数相加的话
ADD指令
就难以满足了
因为如果我们
在低位的相加
如果存在进位
高位的相加
还是用ADD来完成的话
那么
ADD实际上只完成了
两个高位数的求和
而把低位
所可能
出现的这个进位
没有考虑
所以这种情况下
我们就不能用ADD
而需要用ADC指令了
所以ADC指令
它在格式
和对操作数的要求
以及对标志位的影响上
与ADD指令是完全一样的
它唯一和ADD指令的
不同点 就是
它在做
运算的时候
除了目标地址
和原操作数内容求和以外
还要再加上CF的状态
也就是说
这三者的和
最后把它们的结果
送回目标地址
ADC指令
多用于
多字节数的相加
为了保证
在第一次
相加的时候
也就是说在个位数
相加的时候
或者在我们这里说
低字节相加的时候
就不要出现
多加一个
进位位的这种情况
所以要保证
在使用ADC指令之前
CF的初始状态
是必须为0的
这个等一下
我们用事例
来具体的给大家说明
INC指令
我们已经看到好几次
它是这种
单操作数格式的指令
除了
不能
除了这个操作数
不能是立即数
以及存储器操作数
必须说明它的字长
这两点之外
INC指令
还不能够允许
这个显示给出的操作数
是段寄存器
也就是说用INC指令
不能够随便修改
段寄地址
这条指令的操作
就是将
这个地址里的内容
加1
然后再写回到这个地址里去
补充说明一下
这里的OPRD
实际上就是
操作数OPERATE的一个缩写
它是
对操作数的一个
通使的表达符号
并不表示变量的含义
与ADD和ADC指令不同的是
INC指令的执行
只会影响
五个状态标志位
而不会影响CF
即使这个OPRD
里边的值是FF
再加1
好像有进位
但是这个进位
也不会影响CF的状态
这一点很重要
这就意味着
INC指令的后边
不能够跟
基于CF状态
来决定
程序是不是转移的
那一类条件转移指令
INC指令
在程序中
经常用于
修改地址指针
好 下边我们就来看
一段有关
加法运算的这种例子
这个题目的意思是
求内存数据段中
M1为首和
M2为首的
两个20字节数的和
并且将结果
写入M2为首的区域中
这是两个
很长字节数的求和
不要说
对8086
不可能用一条加法指令
来完成
即使用今天的计算机
也不可能用
一条加法指令来实现
所以它必须要
反复的进行
多次相加
才能够
最终实现这样的功能
这就意味着
有可能这个程序
是一个循环结构
好 我们假设这两个数
已经在内存中
这样存好
按照我们
之前讲类指令
所讲的那个
程序设计的思路
我们首先要
获取这两个数的首地址
也就是说
要用类指令
将M1和M2
这两个变量的偏移地址
取出来
分别送给了
两个间址寄存器SI和DI
这样做的目的
主要就是为了
利用寄存器间接寻址
来构成一个循环结构
获取了两个数的首地址之后
再下一步
就要确定
我们要做多少次相加运算
这是两个20字节的数
我们如果
按字节运算的话
那要做20次
当然我们也可以按字运算
就是按两字节来运算
那么就做十次
先来看一下
按字节运算
它的这个程序的设计
所以这里我们就
做20
那么我们把这个20
送到CX里
其实我们
因为这个20这个数
实际上很小
完全也可以送到
CL里或者CH里
事实上
你就送到AH里也是可以的
为什么这里要选CX呢?
也可以说是一种习惯
也可以说
在某种情况下
它是一种要求
因为在
汇编里
循环控制指令
它要求
循环次数
必须由CX给出
虽然我们在这个程序段里
其实并没有用到
循环控制指令
但是按照这样子的一个
习惯吧
我们还是把它
送给了CX
好 这三条指令
就完成了一个初始化的工作
下边我们就
可以实现一个
字节数的求和了
为了方便的
构成一个循环结构
我们第一次就用到了ADC
我们已经知道
ADC指令
实现了两个数的求和
同时它还加了CF的状态
因为在
这两条
就是NEXT所指向的
这两条指令之前
前面的这三行指令
并不影响标志位
也就是说 这三行指令
执行完以后
目前标志位的状态
是一个随机状态
那么也就意味着
CF是个随机状态
随机状态
就有可能
CF是0
也有可能是1
那么 为了保证
我们第一次
做第一个字节的运算
就要多加一个1
所以在这之前
我们要确保CF是0
这个CLC
这是就是一条
使CF清零的指令
它就是
它的含义实际上是
CLEAR CF
这是8086指令集中
最后一大类的指令
我们现在虽然还没有学到
我们先拿出来用
好 完成了一个字节数
相加之后
按道理
我们要完成
第二个字节数的相加了
所以这个时候
我们的指针
一定要修改
就会说指针要加1
这个时候就用到了INC指令
分别是
SI+1 DI+1
指向下边的一个字节
当然
DEC指令
我们也还没有学过
但是我们也都已经看到过了
这条指令就是
CX-1
因为已经做了一个字节了
下面要做第二个字节
好 如果CX≠0的话
那么程序会转向NEXT
继续做下一个字节的运算
直到CX为0为止
这个
20个字节的和
就求完了
这是按字节
来运算的
一个程序设计的方法
那么
因为8086是一个16位的体系
所以它的指令集中
允许指令的操作数
可以是16位的
那么我们下边
来看一下
如果
按每一次
两字节数相加
这个程序
会有什么样的变化
或者修改
按字运算的话
开始的初始化工作
跟刚才是一样的
首先一样要
获取两个数的首地址
但是
这个时候
它的相加的次数
就减半了
因为一次就加掉两个单元了
所以这次
就只需要加10次了
之后
还是一样的要
使CF清零
然后 我们就
一次完成了两个
字节数的求和
需要请大家
务必注意的是
这个时候
一次完成了
1234H和5678H的求和
那么下边
要做的实际上是
这两个字单元的求和了
所以这个时候
指针一定要加2
当然
这里你也可以
分别用两条INC指令
来修改SI和DI的值
用ADD也一样
那么之后的
这个变形
跟前面就完全一样了
好 顺便在这里
留一个思考题给大家
我们这里用ADD指令
来修改了SI和DI的
这个值
如果用INC指令
来修改的话
刚才我们说了
其实分别用两条INC
一样的
那么 它们和
使用ADD来修改
有哪些区别?
请大家考虑
好 有关加法指令
我们就介绍到这里
-第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讲 结束语
--结束语