当前课程知识点:微机原理与接口技术 >  第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周 微型计算机基础概论

-第1讲 关于本课程

--关于本课程

-第2讲 微型计算机系统

--微机系统_01

--微机系统_02

-第3讲 微型计算机一般工作过程

--微机的一般工作过程_01

--微机的一般工作过程_02

-第4讲 数制与编码

--常用计数制及其转换

--计算机中的编码

-第5讲 计算机中数的表示与运算

--数的表示

--符号数的表示

--数的表示与运算

-第6讲 基本逻辑运算与逻辑电路

--基本逻辑运算与逻辑门

--常用逻辑运算及电路

-第7讲 本周小结

--本周小结

-第1周 微型计算机基础概论--第一周单元测验

第2周 8088微处理器

-第8讲 8088微处理器

--8088 CPU_01

--8088 CPU_02

-第9讲 8088 CPU主要引线及机构

--8088 CPU主要引线

--8088 CPU内部结构

--8088 CPU内部寄存器

-第2周 8088微处理器--第二周单元测验

第3周 实模式存储器寻址与总线

-第10讲 实模式存储器寻址

--实模式存储器寻址_01

--实模式存储器寻址_02

--实模式存储器寻址_03

-第11讲 8088系统总线

--8088系统总线

-第12讲 微处理器小结

--微处理器小结

-单元测验--作业

第4周 数据传送指令

-第13讲 指令概述

--指令概述

-第14讲 寻址方式

--寻址方式

-第15讲 通用数据传送指令

--通用数据传送指令_01

--通用数据传送指令_02

--通用数据传送指令_03

-第16讲 地址传送指令

--地址传送指令

-第17讲 输入输出指令

--输入输出指令

-第4周 数据传送指令--第四周单元测验

第5周 算术运算、逻辑运算与移位操作指令

-第18讲 算术运算指令

--加法运算指令

--减法指令

--乘除运算指令

-第19讲 逻辑运算指令

--逻辑运算指令_01

--逻辑运算指令_02

-第20讲 移位操作指令

--移位操作指令

-第5周 算术运算、逻辑运算与移位操作指令--第五周单元测验

第6周 串操作指令

-第21讲 关于串操作指令的说明

--串操作指令说明

-第22讲 串传送与串比较

--串传送与串比较

-第23讲 串扫描指令

--串扫描指令

-第24讲 串装入与串存储指令

--串装入与串存储指令

-第六周单元测验--作业

第7周 程序与处理器控制

-第25讲 程序控制指令说明

--程序控制类指令说明

-第26讲 转移类指令

--无条件转移指令

--条件转移指令

-第27讲 循环控制指令

--循环控制指令

-第28讲 过程调用指令

--过程调用指令

-第29讲 中断指令

--中断指令

-第30讲 处理器控制指令

--处理器控制指令

-第31讲 指令系统小结

--指令系统小结

-第7周 程序与处理器控制--第七周单元测验

-第7周 程序与处理器控制--第七周作业

第8周 汇编语言程序设计

-第32讲 汇编语言源程序

-- 汇编语言源程序_01

-- 汇编语言源程序_02

-第33讲 伪指令

--数据定义伪指令

--符号与段定义伪指令

--汇编语言源程序结构例

--其它伪指令

-第34讲 系统功能调用

--系统功能调用_01

--系统功能调用_02

-第35讲 汇编语言程序设计示例详解

--程序设计示例1

--汇编语言程序设计示例_02

-第36讲 汇编语言程序设计小结

--汇编语言程序设计小结

-第8周 汇编语言程序设计--第八周单元测验

-第8周 汇编语言程序设计--第八周作业

第9周 半导体存储器

-第37讲 半导体存储器概述

--半导体存储器概述

-第38讲 内存单元编址

--存储单元编址

-第39讲 随机存取存储器RAM

-- RAM_01

--RAM_02

-第40讲 只读存储器ROM

--ROM_01

--ROM_02

-第九周单元测验--作业

第10周 半导体存储器扩展技术

-第41讲 半导体存储器扩展

--半导体存储器扩展_1

--存储器扩展_2

--半导体存储器扩展_3

-第42讲 半导体存储器小结

--半导体存储器小结

-第十周单元测验--作业

-第十周作业--作业

第11周 输入输出与中断技术

-第43讲 基本I/O接口

--I/O系统概述_01

--I/O系统概述_02

-第44讲 简单接口芯片

--简单接口芯片

-第45讲 基本输入输出方法

--基本I/O方法

-第46讲 简单I/O控制系统设计

--简单I/O控制系统设计1

--简单I/O控制系统设计2

-第47讲 中断技术

--中断技术1

--中断技术2

-第48讲 输入输出与中断技术小结

--本周小结

-第十一周单元测验--作业

第12周 可编程并行数字接口

-第49讲 可编程定时计数器

--可编程定时计数器8253_01

--可编程定时计数器8253_02

--可编程定时计数器8253_03

-第50讲 可编程并行接口

--可编程并接口8255_01

--可编程并行接口8255_02

--可编程并行接口8255_03

-第51讲 可编程接口小结

--本周小结_01

--本周小结_02

-第十二周单元测验

第13周 模拟量的输入输出

-第52讲 模拟量的输入输出

--模拟量的输入输出

-第53讲 D/A转换器

--D/A转换器_01

--D/A转换器_02

-第54讲 A/D转换器

-- A/D转换器_01

--A/D转换器_02

-第十三周单元测验--作业

第14周 系统综合设计示例详解

-第55讲 I/O接口系统综合设计示例详解I

--综合设计示例详解I_01

--综合设计示例详解I_02

-第56讲 综合设计示例详解II

--综合设计示例详解II_01

--综合设计示例详解II_02

-第57讲 结束语

--结束语

加法运算指令笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。