当前课程知识点:微机原理与接口技术 >  第5周 算术运算、逻辑运算与移位操作指令 >  第18讲 算术运算指令 >  乘除运算指令

返回《微机原理与接口技术》慕课在线视频课程列表

乘除运算指令在线视频

乘除运算指令

下一节:逻辑运算指令_01

返回《微机原理与接口技术》慕课在线视频列表

乘除运算指令课程教案、知识点、字幕

大家好

这一讲我们来学习

算术运算类指令中

最后的两个小类指令

就是乘法运算

和除法运算指令

和加减运算指令

比较起来

乘除运算指令

它有一些它自己独特的一些地方

所以在正式

学习指令之前

我们先做一些

简单的说明

首先

我们在讲

加减运算指令的时候

我们

并没有

能够在指令中

直接表明

这个运算的对象

它的数的性质

也就是说到底

针对的是有符号数

还是无符号数的操作

有时候我总说

这种数的性质

到底是有符号还是无符号

实际上是程序员

自己肚子里知道的

指令中

并不能够反映出来

也就是说如果你要想做的是

两个无符号数的运算

那么

你在你的

程序中间

需要用程序语言

去反映它

也就是说

你需要去

最后去关注

比如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周 微型计算机基础概论

-第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讲 结束语

--结束语

乘除运算指令笔记与讨论

也许你还感兴趣的课程:

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