第六章 算术运算 6.1 十进制数加减运算 在计算机中采用BCD码来表示十进制数。BCD码就是使用四位二进制数表示一位十进制数。

Slides:



Advertisements
Similar presentations
BCD码运算的十进制调整指令 专用于对BCD码运算的结果进行调整 包括:AAA、DAA、AAS、DAS、AAM、AAD
Advertisements

输入输出程序设计 输入输出的基本概念 无条件方式输入输出 查询方式输入输出 中断方式输入输出.
微型计算机技术 教 学 指 导(七) 太原广播电视大学 郭建勇.
第10章 DOS功能调用与BIOS中断调用.
第7章 8086/8088汇编语言程序设计 7.1 引言 7.2 顺序程序设计 7.3 分支结构程序设计 7.4 循环结构程序设计
第四章 汇编语言 程序设计 任课教师:王晓甜
发展心理学 王 荣 山.
课标版 政治 第一课 美好生活的向导.
本周实验安排 实验内容:(P231)人名排序的例子。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月30日.
第七章 财务报告 主讲老师:王琼 上周知识回顾.
第3章 80x86汇编语言程序设计(下).
第3章 80x86汇编语言程序设计(中) 时间不够的情况下只讲16位汇编.
4.1 汇编语言 4.2 顺序结构程序 4.3 分支程序设计 4.4 循环程序设计 4.5 子程序设计
第3章 80x86汇编语言程序设计(上) 16位汇编版本 时间不够的情况下只讲16位汇编.
9.1 可编程并行输入/输出接口芯片8255A 9.2 可编程计数器/定时器 可编程串行输入/输出接口芯片8251A
3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月26日.
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
第八章 代码转换 8.1 概述 代码转换是在计算机程序设计中经常碰到的问题。如二进制数与十进制数的转换,ASCII码表示的十进制数与十六进制数之间的转换等等。 代码转换可以用硬件快速实现,但更常用的方法还是用软件的方法来实现。用软件处理代码转换的方法通常有以下两种方法: 1、用查表的办法:这种方法主要用于代码之间的转换关系比较复杂的情况。但码元的数量必须是有限的。
汇编语言程序设计 Assembly Language Programming
第三章 寻址方式与指令系统 3.1 寻址方式 一条指令通常由两大部分构成: 操作码 操作数
第7章 并行接口 7.1 简单并行接口 7.2 可编程并行接口8255A 7.3 键盘接口 7.4 LED显示器接口.
第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第四节 Intel 8253在IBM PC机上的应用.
Assembly Language Programming
复 习 一. 计算机中的数和编码 1. 2,10,16进制数及其之间的转换(整数) 按权展开,除x取余 2
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月10日.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月05日.
输入输出与中断 主要内容 CPU与外设之间数据传送方式 中断技术 8086中断系统和中断处理.
第八章 输入输出程序设计 总线 CPU MEM I/O接口 I/O设备.
第4章 8086汇编语言程序设计 几个概念 8086汇编语言的语句 8086汇编中的伪指令 8086汇编中的运算符 汇编语言程序设计
第3章 IA-32指令系统 3.1 基本数据类型 3.2 IA-32的指令格式 3.3 IA-32指令的操作数寻址方式
汇编语言程序设计 吴 向 军 中山大学计算机科学系
第8章 寻址方式与指令系统.
第4章 汇编语言程序设计 4.1 程序设计语言概述 4.2 汇编语言的程序结构与语句格式 4.3 汇编语言的伪指令
走进编程 程序的顺序结构(二).
第一章 8086程序设计 第二章 MCS-51程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
汇编语言程序设计课程设计 第二次实验 DEBUG基本命令与算术运算指令
微型计算机原理及应用.
第3章 微型计算机输入输出接口 3.1 输入/输出接口 3.2 输入输出数据传输的控制方式 3.3 开关量输入输出接口 欢迎辞.
第六章 子程序结构 §6.1 子程序的设计方法 §6.2 嵌套与递归子程序 §6.3 子程序举例 §6.4 DOS系统功能调用.
第 13 章 中断系统.
條件處理.
第九章 高级宏汇编语言 9.1 结构 结构就是将逻辑上有一定关系的一组数据,以某种方式组合在一起所形成的数据形式。
第5章 循环与分支程序设计 学习目标: 了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。掌握起泡排序算法这种多重循环程序设计中的常用方法。交换标志位的设置在此算法中更能提高效率。学会在数组排序算法中采用折半查找法来提高查找效率。学会使用跳跃表法实现CASE结构。
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
3.4.5 控制转移指令(Control transfer instructions) (一)、控制转移指令概述
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月19日.
第五章:输入输出基本技术 主讲教师:范新民.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程.
第10章 可编程外围接口芯片8255A及其应用 10.1 概述 A的工作原理 A的应用举例.
习题3 1、 分别说明下列指令的原操作数和目的操作数各采用什么寻址方式。 设定如下: ①立即寻址 ② ① ②寄存器寻址
3.4.2 算术运算指令(Arithmetic) 算术运算指令内容: 8086/8088提供加、减、乘、除等六种基本算术操作
乘法公式 (1) 乘法分配律 (2) 和的平方公式 (3) 差的平方公式 (4) 平方差公式.
4.4 实用程序举例 延时 在程序设计过程中,有时需要程序“等待”一会儿再去处理某些事情,称之为延时。计算机延时实际就是让计算机反复执行一些空操作,这样就能起到拖延时间的作用。需要执行空操作次数的多少,取决于延时时间的长短。
第九章 BIOS和DOS中断 在存储器系统中,从地址0FE000H开始的8K ROM(只读存储器)中装有BIOS(Basic Iuput /output System)例行程序。驻留在ROM中的BIOS给PC系列的不同微处理器提供了兼容的系统加电自检,引导装入,主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大方便,程序员不必了解硬件操作的具体细节,直接用指令设置参数,然后中断调用BIOS中的子功能,所以利用BIOS功能编写的程序简洁,可读性好,
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月13日.
《微型计算机原理与接口技术》 第4版 王良 宁德师范学院 吴宁 乔亚男 编著 清华大学出版社 出版
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月17日.
实验三 16位算术逻辑运算实验 不带进位控制的算术运算 置AR=1: 设置开关CN 1 不带进位 0 带进位运算;
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月06日.
第3章 80x86的指令系统和寻址方式 § x86的寻址方式 § x86的指令系统
第6章 子程序结构 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。 2019/7/20 ch6.
微机原理与接口技术 第5章 汇编语言程序设计 西安邮电大学计算机学院 王 钰.
大数据搜索挖掘实验室 第五章 子程序设计 张华平 副教授 博士 Website: 大数据搜索挖掘实验室
微机原理与接口技术 西安邮电大学计算机学院 董 梁.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程
第三章 8086的指令系统 8086指令特点 8086的寻址方式 8086的指令格式及数据类型 8086的指令集.
跟我一起学编程系列课程: 第一篇汇编语言 16位汇编.
Presentation transcript:

第六章 算术运算 6.1 十进制数加减运算 在计算机中采用BCD码来表示十进制数。BCD码就是使用四位二进制数表示一位十进制数。 第六章 算术运算 6.1 十进制数加减运算 在计算机中采用BCD码来表示十进制数。BCD码就是使用四位二进制数表示一位十进制数。 在8086/8088系统中,将BCD码分为两种格式: 组合型(压缩型、装配型、PACKED) 非组合型(非压缩型、拆散型、UNPACKED) 组合型:一个字节表示两个BCD码,即两位十进制数。 例如:0010 0011 表示十进制数的23

非组合型:一个字节的低四位表示一个BCD码,而高四位对所表示的十进制数没有影响。常为0000B或0011B。 在计算机中直接实现十进制数的运算有两种方法: 1. 数制转换: 先把十进制数转换为二进制数,然后用计算机中的二进制运算指令进行运算。最后将结果由二进制数转换为十进制数。 2. 直接进行十进制数运算:使用计算机中的BCD码指令进行运算。

在计算机内部实现BCD码运算的方法有两种: (2)用二进制数的加、减、乘、除运算指令对BCD码运算,使用BCD码校正指令对结果校正。在8086/8088系统中就是使用这种方法。

一、BCD码校正指令 8086/8088系统共有六条BCD码校正指令。首先介绍加减运算的校正指令。 1、非组合型加法校正指令AAA 在AAA指令执行前,必须是使用ADD或ADC指令完成了加法,且结果是在AL中。AAA指令对AL中内容进行校正。 校正过程为: 当AL中的低4位>9或者AF=1, 则AL<=(AL)+6, AH<=(AH)+1,AL中高4位清0,AF和CF置1。

例如:从键盘输入两个一位数的十进制数,然后相加,结果放在AH和AL中。 MOV AH,1 INT 21H MOV BL,AL ;BL中为输入的一位十进制数的ASCII码,低4位为该数的BCD码 INT 21H ; AL中为输入的另一位十进制数的ASCII码 MOV AH,0 ADD AL,BL AAA

2、组合型加法校正指令DAA DAA指令实现对二位十进制数进行校正。 在执行DAA指令前,必须是用ADD或ADC完成了加法操作,且加的结果放在AL中。 其校正过程为: 若AL中低4位>9或AF=1,则 AL<=(AL)+6, AF<=1 若AL中高4位>9或CF=1,则AL<=(AL)+60H, CF<=1

例:实现两个4位十进制数的加法4678+2556 NUM1 DB 78H,46H NUM2 DB 56H,25H SUM DB ?,? ...... MOV AL,NUM1 ADD AL,NUM2 ;低字节BCD码相加 DAA ;结果低字节校正 MOV SUM,AL MOV AL,NUM1+1 ADC AL,NUM2+1;高字节BCD码相加 DAA ;结果高字节校正 MOV SUM+1,AL

3、非组合型减法校正指令AAS 执行AAS指令前,必须是用SUB或SBB完成了减法操作,且结果放在AL中。 其校正过程为: 若AL中低4位>9或AF=1,则AL<= (AL)-6 , AH<= (AH)-1,同时将AL中高4位清零,CF和AF置1。 4、组合型减法校正指令DAS 执行DAS指令前,必须是用SUB或SBB完成了减法操作,且结果放在AL中。其校正过程为: * 若AL中低4位>9或AF=1,则AL <=(AL)-6,AF置1; * 若AL中高4位>9或CF=1,则AL<=(AL)-60H,CF置1。

二、十进制数运算程序设计举例 例1 试编制一程序,实现非组合型BCD码减法并显示结果。 设数据段有两个4位十进制数(非组合型BCD码)A1和A2。分别放在以DA1和DA2为首址的存储单元中(低字节放低位,高字节放高位)。 结果存放在以DA3为首址的存储单元中。为了显示方便,结果采用低字节放高位,高字节放低位。 为了表示A1和A2的相对大小,若A1≥ A2,则结果前加‘+’号,否则加‘-’号。 结果的显示使用9号DOS功能调用。

源程序的数据段和堆栈安排如下: DATA SEGMENT DA1 DB 1,2,3,4 DA2 DB 0,1,2,3 DA3 DB 5 DUP(0),'$' DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS

MOV SI,0 LEA DI, DA3+4 MOV CX,4 MOV AL, DA1[SI] SBB AL, DA2[SI] AAS MOV AL, ‘+’ CLC LAHF JNC NEXT AND AL, 0FH OR AL, 30H MOV AL, ‘-’ MOV [DI], AL SAHF INC SI DEC DI MOV [DI], AL MOV DX, OFFSET DA3 MOV AH, 09H INT 21H LOOP LOP

CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX MOV SI,0 LEA DI,DA3+4 ;存结果单元末址送DI MOV CX,4 ;十进制位数送CX CLC LOP: MOV AL,DA1[SI] SBB AL,DA2[SI] ;两数相减 AAS ;校正 LAHF ;暂存向高位的借位 AND AL,0FH ;转换成ASCII码 OR AL,30H MOV [DI],AL ;存结果 SAHF ;恢复向高位的借位 INC SI

DEC DI LOOP LOP MOV AL,‘+ ’ JNC NEXT MOV AL,‘-’ ;有向更高位的借位, 存‘-’号 NEXT: MOV [DI],AL MOV DX,OFFSET DA3 MOV AH,9 ;9号功能调用显示结果 INT 21H MOV AH,4CH CODE ENDS END START

6. 2 乘除法运算 一. 乘除法指令 1、无符号数乘法指令MUL 指令格式:MUL OPRD 6. 2 乘除法运算 一. 乘除法指令 1、无符号数乘法指令MUL 指令格式:MUL OPRD 其中:OPRD提供乘法运算的一个操作数,它只能是寄存器或存储器操作数。另一操作数隐含使用AL或AX寄存器。 运算结果存放在AX(字节运算)或DX:AX(字乘法)中。 字节运算:AX<=(AL) ×(OPRD) 字运算 :DX:AX<= (AX)×(OPRD)

MUL只影响CF和OF标志。若结果的AH(字节运算)或DX(字运算)为全0,CF=0、OF=0,否则 CF=1、OF=1。 2、带符号数乘法指令IMUL 指令格式:IMUL OPRD 该指令的功能除了操作数是带符号外,其余与MUL指令相同。 对标志位的影响:若乘积的高半部AH(字节乘法)或DX(字乘法)是低半部的符号扩展(不是有效数值),则CF=0、OF=0 。否则CF=1、OF=1 。

例如,对字节乘法有: 若乘积的(AH)=11111111,且AL最高为1,则表示符号扩展, 则CF=0、OF=0; 若乘积的(AH)=00000000,且AL最高为0,则表示符号扩展, 则CF=0、OF=0; 若乘积的(AH)=11111110,不是符号扩展, 则CF=1、OF=1; 若乘积的(AH)=00000010,不是符号扩展, 则CF=1、OF=1。

3、无符号数除法指令DIV 指令格式:DIV OPRD 其中OPRD是除法运算中的除数,它可以是字节(字节除法)或字(字除法)操作数,只能是寄存器或存储器操作数。被除数和结果隐含使用以下的寄存器: 字节除法:AL<=(AX)/(OPRD) ,AH<= 余数 字除法:AX<=(DX:AX)/(OPRD), DX<=余数 对标志影响:该指令对标志各位无有效标志影响。 下面两种情况将产生0型中断,转入除法出错处理: (OPRD)=0 商>0FFH(字节运算)或商>0FFFFH(字运算)

4、带符号数除法指令IDIV 除操作数是带符号数外,该指令的功能与DIV指令相同。 当结果商的值超过-127~+127(字节运算)或 -32767~+32767(字运算)范围时,将产生0型中断。 5、字节/字扩展指令CBW/CWD 这两条指令主要用于除法指令前,形成双倍长度的被除数。它们都是无操作数指令,隐含使用AX或DX。 指令功能: CBW:扩展AL中符号位到AH中 CWD:扩展AX中符号位到DX中 两条指令对标志都无影响。

二、乘除运算程序设计举例 例1 设数据段有X、Y两变量(无符号数),且XY不超过一个字的表示范围(65535),试编制一计算XY的程序。 由于没有乘方指令,因此需要将乘方转换为乘法运算。即: XY=X×X………. × X Y

源程序的数据段和堆栈安排如下: DATA SEGMENT VARX DW 5 VARY DW 6 POWER DW ? DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS

MOV AX,VARX MOV CX,VARY JCXZ EXIT2 DEC CX JE EXIT1 MOV DX,0 LOP 开始 MOV AX,VARX MOV CX,VARY 初始化:AX<=VARX CX<=VARY JCXZ EXIT2 N DEC CX (CX)=0? Y CX<=(CX) - 1 Y JE EXIT1 (CX)=0? N MOV DX,0 LOP DX<=0 MUL VARX AX<=(AX)*X CX<=(CX) - 1 MOV POWER,1 LOOP LOP N (CX)=0? EXIT2 EXIT1 Y 存结果:POWER<=1 存结果:POWER<=(AX) MOV POWER,AX 结 束

CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 MATH: MOV AX,DATA MOV DS,AX MOV AX,VARX MOV CX,VARY JCXZ EXIT2 DEC CX JE EXIT1 MOV DX,0 ;乘积的高位清0 LOP: MUL VARX LOOP LOP EXIT1: MOV POWER, AX;存结果 JMP RESULT EXIT2: MOV POWER, 1 ;X0=1 RESULT:MOV AH,4CH INT 21H CODE ENDS END MATH

6.4 多精度数运算 8086/8088微处理器的每条指令只能处理8位或16位二进制数,其表示的数值范围有限,有时不能满足需要。为了提高运算精度,常用多字节或多字来表示一个完整的数据。 例1 试编写对一个多精度数求补的子程序。 设多精度数的首址放在SI中(低字节放低地址,高字节放高地址),多精度数的字节数在CL中。程序中,求补采用的是“变反加1”的方法。

COMP PROC MOV CS:RESV,SI ;暂存多精度数首址 XOR CH,CH MOV AL,CL ;暂存多精度字节数 LOP1: NOT BYTE PTR [SI] ;变反 INC SI LOOP LOP1 MOV SI,CS:RESV ;恢复多精度数首址 MOV CL,AL ;恢复字节数 STC ;置CF为1 LOP2: ADC BYTE PTR [SI],0 ;完成最低位加1 LOOP LOP2 RET RESV DW 0 COMP ENDP

例2 编制一个多精度数的循环左移子程序。 1单元 2单元 N单元 为了将最后一个单元(N单元)的最高位移入第一个单元(1单元)的最低位,先测试N单元的最高位,将测试的结果记录在CF中,在1单元做循环左移时,将其移入最低位。 设多精度数的首址在SI中,字节数在CL中。

ROTATE PROC XOR CH,CH MOV BX,CX TEST BYTE PTR [BX-1][SI],80H ;测试最后单元的最高位,并清CF JNS LOP ;最高位=0,保持CF=0 STC ;最高位=1,CF<=1 LOP: RCL BYTE PTR [SI],1 ;循环左移一位 INC SI LOOP LOP RET ROTATE ENDP

例3 用乘法指令实现32位(双字长)二进制数的乘法 设被乘数两个字用a、b表示,乘数两个字用c、d表示。乘积则为64位(4个字长)。由于乘法指令只能完成单字乘法,对于双字乘法的处理过程如下图所示。 a b × c d b*d a*d b*c a*c R0 R1 R2 R3 乘积高字 乘积低字 设乘数和乘积存放为:低字存于高地址单元,高字存于低地址单元。

TITLE 32-BIT MULTIPLICATION DATA SEGMENT NUM1 DW 1220H,48A2H NUM2 DW 2398H,0AE41H PRODU DW 4 DUP(0) DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX XOR DX,DX MOV AX,NUM2+2 MUL NUM1+2 ;完成b*d MOV PRODU+6,AX ;存R0 MOV PRODU+4,DX ;暂存R1的部分 a b × c d b*d a*d b*c a*c R3 R2 R1 R0 PRODU PRODU+4 PRODU+2 PRODU+6 乘积高字 乘积低字

INT 21H CODE ENDS END START MOV AX,NUM2+2 MUL NUM1 ;完成a*d ADD PRODU+4,AX; ADC PRODU+2,DX ADC PRODU,0 ;将进位送PRODU中 MOV AX,NUM2 MUL NUM1+2 ;完成b*c ADD PRODU+4,AX;完成R1存放 ADC PRODU,0 MUL NUM1 ;完成a*c ADD PRODU+2,AX ;完成R2存放 ADC PRODU,DX ;完成R3存放 MOV AH,4CH INT 21H CODE ENDS END START a b × c d b*d a*d b*c a*c R3 R2 R1 R0 PRODU PRODU+4 PRODU+2 PRODU+6 乘积高字 乘积低字