当前课程知识点:微机原理与接口技术 > 第5周 算术运算、逻辑运算与移位操作指令 > 第18讲 算术运算指令 > 乘除运算指令
大家好
这一讲我们来学习
算术运算类指令中
最后的两个小类指令
就是乘法运算
和除法运算指令
和加减运算指令
比较起来
乘除运算指令
它有一些它自己独特的一些地方
所以在正式
学习指令之前
我们先做一些
简单的说明
首先
我们在讲
加减运算指令的时候
我们
并没有
能够在指令中
直接表明
这个运算的对象
它的数的性质
也就是说到底
针对的是有符号数
还是无符号数的操作
有时候我总说
这种数的性质
到底是有符号还是无符号
实际上是程序员
自己肚子里知道的
指令中
并不能够反映出来
也就是说如果你要想做的是
两个无符号数的运算
那么
你在你的
程序中间
需要用程序语言
去反映它
也就是说
你需要去
最后去关注
比如CF的状态
而如果
你针对的是
两个有符号数的操作
那么你
可能就要去关注
SF或者OF
这种标志位的状态
而这些
对标志位状态的关注
是我们需要
在后边大家会看到
是需要用指令去
去关注的
而不是你用眼睛去关注的
但是
在乘除运算
指令里
它有
针对专门的
针对无符号数运算的指令
和针对
有符号数运算的指令
也就是说
它在指令的助记符上
它就能够反映
你操作的数据的性质
所以 这个
是和加减运算指令
不同的第一点
第二
加减运算指令
除了
加1指令INC
减1指令DEC
和那条求补运算指令NEG
其它的指令
都是双操作数格式的指令
因为
加减肯定有
被加数 加数
被减数 减数
而乘除运算
虽然也有被乘数和乘数
或者被除数除数
似乎也是
应该是两个操作数
但是在乘除运算指令里
我们都只显示的
给出了一个操作对象
也就是说
这一类指令
从指令格式上来讲
它们都是
单操作数格式的指令
最后
就这一类指令
在运算过程中
对操作数的一些要求
和加减运算指令
完全不一样
所以大家在学习的时候
也一定要关注这一点
好 下边我们先来学习
乘法运算的指令
乘法运算指令
有无符号数的
乘法指令MUL
和带符号的乘法指令
IMUL
它们在指令格式上
是一样的
但是在指令的
底层执行原理上
是不同的
请大家注意
乘法指令
采用了隐含寻址
所以
它隐含的是谁呢?
隐含了
存放被乘数的累加器AL
或者AX
以及存放结果的AX
或者AX
和DX
在二进制的运算中
两个八位二进制数相乘
它们的结果
不论大还是小
一律都是16位字长
两个十六位数相乘
结果都是32位字长
我们知道
两个字节数相乘
结果是16位
也就是双字节数
那么 可以放在
一个十六位寄存器里
在乘法运算指令里
它默认存放在AX中
但是
如果是两个16位数相乘
结果要变成32位数
那么就没有
一个32位的寄存器了
在8086系统里是这样的
所以这个时候
我们必须要
借助另外一个寄存器
就是DX
用它来存放
运算结果的高16位
无符号数的
乘法指令格式是这样
是一个
显示只给出了
一个操作对象
所以
它是一个单操作数格式的指令
因此这个操作数
不能够是立即数
它的操作原理是这样
如果显示给出的这个操作数
是字节数的话
那么
它相当于用AL的值
跟它相乘
结果
存放到AX中
如果显示给出的
这个操作数
是十六位数的话
那么 它相当于
用AX和它相乘
结果
高16位在DX中
低16位在AX中
我们来看一个
无符号乘法的例
比如执行这一条指令
这里我们又看到了
这个PTR
我们
再回忆一下
这个PTR是运算符
我们前面已经讲过
它用来说明
后边的这个
存储器操作数的字长
现在
它的前面是bit
bit大家都知道
是字节的意思
所以
这里
PTR就说明了
后边存储器操作数的字长
是一个字节长
后边的存储器操作数
采用的是
间接寻址方式
间址寄存器
选择的是BX
也就是说说明
这个存储器操作数
指向的是数据段
那么也就是说
这里的乘数
是在数据段
BX所指向单元的内容
因此这条指令的执行
就是将
BX所指向这个单元的内容
与AL相乘
结果存放到AX中
有符号数乘法指令
在格式上
跟无符号乘法指令是一样的
只是它们的指令助记符
不一样而已
这条指令的
执行原理是这样
首先对两个操作数
取补码
这个取补码的原则
跟我们第一章
所学到的
补码的
求解原则是一样的
也就是说如果它是负数的话
就按位取反加1
如果是正数的话就不变
然后
正常的进行
两个数的乘法运算
最后对乘积
再取补码
同样的
也就是说乘积
如果是正数的话
就不变
如果是负数的话
就按位取反加1
这个就是
有符号数乘法的
一个基本的原理
除法运算
也分为无符号除
和有符号除法的指令
无符号除法指令
格式是这样
有符号数除法的指令
在格式上是这样
它们只是
助记符不同而已
请大家一定要注意的是
除法运算
它要求
被除数
一定是除数的
双倍字长
也就是说如果这个
显示给出的这个
除数
是字节的话
就相当于
执行了AX除这个
除数的运算
它们的结果
商在AL中
余数在AH
如果这个
显示给出的这个除数
是一个双字节数
也就是说16位数的话
那么它的被除数
就必须是32位
同样的这个时候
我们要借助于DX
也就是说高16位在DX里
低16位在AX里
用它们合起来的这个值
来除以这个
显示给出的除数
结果
商在AX中
余数在DX中
因此
学除法运算指令的时候
请大家务必要关注的一点
就是指令要求
被除数是除数的双倍字长
好 下边我们对
算术运算指令
做一个简单的
回顾性小结
首先
首先所有
算术运算类
指令的执行
都会影响状态标志位
乘法运算指令的执行结果
是两个乘数的
双倍字长
而除法指令
要求被除数
是除数的双倍字长
这是在操作数上
它和加减运算指令
不同的地方
有关加减运算
我们已经看到过一些事例
下边我们通过一个例子
来帮助大家理解一下
乘法运算的原理
因为除法运算
就是乘法运算的逆运算
所以乘法指令的原理
理解清楚了
除法运算
也很容易就理解了
这个程序是这样
这两行指令
我们看一下
第一行指令的执行结果
没问题 SI等于1200H
第二行指令
原操作数是一个立即数
目标是一个
存储器操作数
这里我们又看到了这个PTR
它说明
它后边的这个
存储器操作数的字长
是一个WORD
也就是说
这个存储器操作数
现在是个16位的
存储器操作数
这条指令
就是将一个立即数
写入到内存单元中
内存哪个单元中呢?
偏移地址是SI的值
SI的值是1200
所以 现在
就是把这个
8765H
写入到
偏移地址为1200H
所指向的字单元里
因为间址寄存器选择了SI
所以目前这个段
属于数据段的形式
第三行指令
原操作数是
存储器寻址
那么偏移地址
还是SI的值
还是1200H
所以这条指令的
执行结果
就是将
1200H
所指向的这个单元的内容
写到AL中
所以执行结果
AL显然就等于65H
好 下边这两行
一个是修改了SI的指针
也就是使它加1
接着就是一条乘法指令
那么
这两行指令在干什么?
我们看
因为SI加1了
所以现在的这个
SI的值
就等于1201
想当于指向了
这个87H这个单元
这条指令
实际上就实现了
87H和65H相乘
它们的结果
会写入到AX中
所以结果最后等于43H
如果我们
把这条指令改成
有符号数运算的
乘法指令的话
虽然操作数的格式
还是一样
但是它们相乘的结果
完全不同了
这个时候
相乘的结果
会是D043H
这个请大家自己
去验证一下
那么如果我们
把这个程序改一下
假设我们
这个地方
MOV指令的
目标操作数变成AX
也就是说
相当于把
SI所指向的
这个字单元的内容
写到AX里了
所以这条指令的执行
AX就等于8765
那么 下边
我们完成了两个
双字节数的乘积
因为SI并没有修改
所以这两条指令
最后执行的结果
就是8765H×8765H
它们的结果是这样子
高16位在DX中
低16位在AX中
具体的值这里就不写出来了
算术运算类指令
除了我们所看到的
这些加 减 乘 除指令之外
其实还有一个小类
叫BCD码调整指令
因为这一类指令
现在在程序中用的
并不是很多
所以我们在这里
就不再介绍了
有兴趣的同学
请你们去看一下我们
教材中间后面的附录
或者是
我们整个课程的附件
这里边有整个8086
全部指令集的介绍
你们有兴趣的话
可以自己看一下
好
有关算术运算类指令
我们就学习到这里了
那么 下边我们
对这一类指令
做一个简单的小结
首先
所有算术运算类
指令的执行
对状态标志位
都会产生影响
只是其中
DEC和INC指令
它们不会影响CF的状态
也就是说
这两条指令的后边
不能够跟
那些基于CF状态
来决定
程序是不是转移的
条件转移指令
这话说的很绕
就是条件转移指令
因为我们现在还没有学
所以 现在
我们也只能这么说
等学了
这些指令之后
我们可以再把这个点
提出来
还有就是
算术运算类指令里
还有一条就是NEG指令
我们说
NEG指令
是用0去减去
那个给出的操作数
所以
这条指令的执行
除了
它显示给出的操作数是0
其它的情况下
这条指令的执行
都会对CF产生影响
所以 这样子的话
这条指令的后边
再去跟
基于CF状态决定
程序是不是转移的那种
条件转移指令的意思就不大了
意思
就是大家在学习
这一类指令的时候
就是这三条指令
对标志位的影响
相对比较特殊
请大家要注意一下
第二
就是在这类指令中间
全部的
双操作数格式的指令
对操作数的要求
与MOV指令
都是完全一样的
而所有
单操作数格式的指令
对操作数
都有两点共同的要求
而当然不同点
我们在讲指令的时候
已经提到了
这里只说它的共同点
这个共同点就是
所有单操作数格式的指令
都要求操作数
不能是立即数
如果这个操作数
是存储器操作数的话
我们说过
因为存储器操作数的字长
是不确定的
因为内存很大 对吧
不要说今天的内存
就是在8086这个时代
它的内存能够管理的内存
是一兆个字节
那么 我们
作为一兆字节长的
这样的个数
不要说8088
就是今天的计算机
也不可能在一条指令里
直接作为
指令的操作对象
所以 这个
内存的操作数的字长
是一个不确定的字长
也就是说到底
它是一字节
还是两字节
还是几字节
所以
如果在
我们单操作数格式里
这个操作对象
如果是一个
存储器操作数的话
因为它没有一个参照系
就没有一个寄存器
跟它去对应
所以
这个时候
必须用
PTR这个运算符
来说明
或者说
声明一下
这个操作数的字长
这个是大家
学所有
单操作数格式指令的时候
一定要注意这一点
这一点
我们在前面讲
堆栈操作已经讲过了
这里再一次强调一下
所有乘法运算指令
它对
它的有这样一个特点
就是它的两个字节数相乘
结果是双字节
两个双字节数相乘
结果是四字节数
也就是说
在乘法运算中
乘积
是乘数的双倍字长
而除法运算
它要求
被除数
一定是除数的双倍字长
也就是说
当你的除数
也就是显示
给出的那个操作数
是字节的话
它的被除数
就一定是双字节数
也就是AX
如果
显示给出的
这个操作数是字长的数
也就是双字节数的话
那么
它隐含的那个
被除数
就必须是
DX AX
这样32位的操作数
而另外
同时大家学习
除法运算的时候
也还要注意的就是
相除之后
它的商在哪里
余数在哪里
这些
都没有任何的道理
这些只好
都是一些规定
大家只好去记住
好
有关算术运算的指令
我们就学习到这里
-第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讲 结束语
--结束语