《汇编语言程序设计》第6章算术运算与代码程序设计.ppt

上传人:小飞机 文档编号:5900899 上传时间:2023-09-01 格式:PPT 页数:78 大小:751.50KB
返回 下载 相关 举报
《汇编语言程序设计》第6章算术运算与代码程序设计.ppt_第1页
第1页 / 共78页
《汇编语言程序设计》第6章算术运算与代码程序设计.ppt_第2页
第2页 / 共78页
《汇编语言程序设计》第6章算术运算与代码程序设计.ppt_第3页
第3页 / 共78页
《汇编语言程序设计》第6章算术运算与代码程序设计.ppt_第4页
第4页 / 共78页
《汇编语言程序设计》第6章算术运算与代码程序设计.ppt_第5页
第5页 / 共78页
点击查看更多>>
资源描述

《《汇编语言程序设计》第6章算术运算与代码程序设计.ppt》由会员分享,可在线阅读,更多相关《《汇编语言程序设计》第6章算术运算与代码程序设计.ppt(78页珍藏版)》请在三一办公上搜索。

1、第六章,算术运算与代码转换程序设计,第6章算术运算与代码转换程序设计,6.1 加减法运算程序设计6.2 乘除法运算程序设计6.3 串操作程序设计6.4 代码转换程序设计6.5 排序与查找程序设计,第6章算术运算与代码转换程序设计,6.1 加减法运算程序设计6.2 乘除法运算程序设计6.3 串操作程序设计6.4 代码转换程序设计6.5 排序与查找程序设计,6.1 加减法运算程序设计,二进制加减运算十进制加减运算,二进制加减运算,6.1 加减法运算程序设计,如果加减法运算的操作数是8位或16位的二进制数,而运算结果也在此范围内,那么用一条基本加减运算指令就可以完成。实际上,我们所面对的数据经常会超

2、过8位、16位的范围,这就是多字节数的二进制加减运算。,二进制加减运算,6.1 加减法运算程序设计,例6.1 两个多字节无符号数分别存放在内存DATA1和DATA2开始的单元,数据长度存放在LEN单元,编程求两数之和,将结果存放在SUM开始的单元。,二进制加减运算,6.1 加减法运算程序设计,多字节数相加运算应考虑的问题有:(1)数据长度可存储在计算机中,也可定义成常量。(2)为简化程序,应采用循环结构作程序主体。(3)最低字节相加与其他字节相加有所不同。(4)两个无符号数相加的最高字节产生的进位应处理成结果的最高字节,两个带符号数相加可能需要做溢出处理。,二进制加减运算,6.1 加减法运算程

3、序设计,注释1:清除进位标志,使最低字节的加法也可以利用循环体中的ADC指令。,注释2:在本次加法和下次加法间的语句都不影响进位标志,是为了保证相继高字节相加时,加入的是相应低字节产生的进位状态。如果含有影响进位标志的语句,则需要在本次加法后用LAHF保存标志,在下次加法前用SAHF恢复标志。,十进制加减运算,6.1 加减法运算程序设计,以4位二进制数对十进制数进行编码有两种情况。在一个字节中只含一个BCD码为非压缩型,其加减法调整指令分别为AAA和AAS。在一个字节中含两个BCD码为压缩型,其加减法调整指令分别为DAA和DAS。需要注意的是,调整指令要求加或减的结果一定在AL中。,十进制加减

4、运算,6.1 加减法运算程序设计,例6.2 两个单字节非压缩BCD码数据分别存放在内存的DATA1和DATA2单元中,编程求两数的和与差,分别将结果存入SUM和DIF单元。,十进制加减运算,6.1 加减法运算程序设计,十进制加减运算,6.1 加减法运算程序设计,例6.3 两个压缩BCD码数据分别存放在内存的DATA1和DATA2单元中,编程求两数之差,将结果存入DIF单元。,十进制加减运算,6.1 加减法运算程序设计,第6章算术运算与代码转换程序设计,6.1 加减法运算程序设计6.2 乘除法运算程序设计6.3 串操作程序设计6.4 代码转换程序设计6.5 排序与查找程序设计,6.2 乘除法运算

5、程序设计,如果被乘数和乘数的长度不超过两个字节,或者被除数的长度不超过四个字节、除数的长度不超过两个字节,就可以直接使用8086.8088提供的乘除法指令实现乘除法运算。如果超过了这个范围,就要与其他指令配合,通过程序段实现多字节的乘除法。,6.2 乘除法运算程序设计,二进制乘法运算二进制除法运算,二进制乘法运算,6.2 乘除法运算程序设计,乘法的目的操作数必须存放在AX中(或AL中),对应的乘积存放在DX及AX中(或AX中),乘法的源操作数可以是立即数寻址之外的任何寻址方式。,二进制乘法运算,6.2 乘除法运算程序设计,例6.4 两个多字节无符号数分别存放在内存DATA1和DATA2开始的单

6、元,数据长度分别存放在LEN1和LEN2单元中,编程求两数的乘积,将结果存放在PRDT单元。分析:设被乘数的长度为L1,乘数的长度为L2,那么需要进行L1*L2次乘法运算,得到L1*L2个部分积,从而将多字节乘法转换成相应部分积的加法。,二进制乘法运算,6.2 乘除法运算程序设计,二进制除法运算,6.2 乘除法运算程序设计,除法的目的操作数必须存放在DX及AX中(或AX中),对应的商存放在AX中(或AL中),余数存放在DX中(或AH中),除法的源操作数可以是立即数寻址之外的任何寻址方式。无符号除法指令DIV要求被除数的高字节小于除数,否则产生溢出。,二进制除法运算,6.2 乘除法运算程序设计,

7、例6.5 无符号被除数和除数分别存放在内存DATA1字单元和DATA2字节单元中,编程求两数的商和余数,分别存放在QUO和REM单元。被除数为字,除数为字节的无符号除法,如果被除数的高字节不小于除数就会产生溢出。避免的方法是对被除数和除数进行前插0扩展,分别成为双字和字。,二进制除法运算,6.2 乘除法运算程序设计,第6章算术运算与代码转换程序设计,6.1 加减法运算程序设计6.2 乘除法运算程序设计6.3 串操作程序设计6.4 代码转换程序设计6.5 排序与查找程序设计,6.3 串操作程序设计,一组仅由字或字节组成的数据称为数据串。一个数据串最多可由64K字节组成。串操作指令规定源寄存器使用

8、SI,源串隐含存放在DS段中,也可通过段跨越指出;目的寄存器使用DI,目的串隐含存放在ES段中,而且必须在ES段,不可进行段跨越。串操作指令的执行将自动修改SI、DI的值,修改方向由标志寄存器中的DF位确定。,6.3 串操作程序设计,例6.6 一个字符串的长度为20,存放在数据段中STR1开始的单元,编程把它们传送到附加段中STR2开始的单元。,6.3 串操作程序设计,方法1:利用LOOP指令用软件方法重复执行MOVSB的操作,6.3 串操作程序设计,方法2:利用REP指令实现MOVSB的操作,6.3 串操作程序设计,基本串操作指令在与重复前缀联用时,需要先做好下面的准备工作:(1)将源串首地

9、址(若反向操作则是末地址)存放在SI中;(2)如果是与REP联用,将附加段中的目的串首地址(若反向操作则是末地址)存放在DI中;(3)将数据长度存放在CX中;(4)设置方向标志。,6.3 串操作程序设计,例6.7 一个字符串以Null(00H)为结束符,存放在以ES:STR为起始地址的单元。一个关键字存放在DS:CHAR单元,编程,在字符串中查找第一个与此关键字相同的字符。如果找到,将相应字符在ES段中的位移量存放在CX中,并将它在字符串中的序号存放在DX中,否则CX置全1。,6.3 串操作程序设计,Eg6_7.s,第6章算术运算与代码转换程序设计,6.1 加减法运算程序设计6.2 乘除法运算

10、程序设计6.3 串操作程序设计6.4 代码转换程序设计6.5 排序与查找程序设计,6.4 代码转换程序设计,二进制编码与BCD码之间的转换二、十、十六进制编码与ASCII码之间的转换,二进制编码与BCD码之间的转换,6.4 代码转换程序设计,1.十进制数BCD码转换为二进制数2.二进制编码转换为十进制数,二进制编码与BCD码之间的转换,6.4 代码转换程序设计,1.十进制数BCD码转换为二进制数将十进制数的高位乘以10,与次高位相加,再乘以10;循环执行,直到处理完十进制数的最低位,十进制数就转换为对应的二进制编码。,二进制编码与BCD码之间的转换,6.4 代码转换程序设计,例6.8 若干正十

11、进制整数(不大于32767)的ASCII码串存放在内存DSTR开始的单元,串间用逗号(2CH)分隔,最后以回车符(0DH)结束。编程,将每个十进制数的ASCII码串转换为二进制数存放在BIN开始的单元。设入口条件是:SI指向ASCII码串的首地址,转换结果存放在CX中,编制实现将一个十进制ASCII码转换成相应二进制数的子程序如下。,二进制编码与BCD码之间的转换,6.4 代码转换程序设计,二进制编码与BCD码之间的转换,6.4 代码转换程序设计,二进制编码与BCD码之间的转换,6.4 代码转换程序设计,2.二进制编码转换为十进制数将待转换的二进制数除以10取余,所得余数就是转换后十进制数的个

12、位数;再把商作为被除数,除以10取余,所得余数就是转换后十进制数的十位数。依此类推,就可将二进制数转换为相应的十进制数。,二进制编码与BCD码之间的转换,6.4 代码转换程序设计,例6.9 16位无符号二进制数存放在内存BIN16开始的单元。编程,将其转换为相应十进制数的非压缩BCD码,存放在内存DEC5开始的单元。,二进制编码与BCD码之间的转换,6.4 代码转换程序设计,设二进制数为,对应的十进制数为44216D,二进制编码与BCD码之间的转换,6.4 代码转换程序设计,二进制编码与BCD码之间的转换,6.4 代码转换程序设计,例6.10 编写一个单字节无符号二进制整数转换为相应压缩BCD

13、码的子程序。子程序的入口条件是:SI指向二进制数所在单元,转换后的压缩BCD码存放在DI指向的字单元,二进制编码与BCD码之间的转换,6.4 代码转换程序设计,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,1.二进制数转换为二进制ASCII码串2.二进制ASCII码串转换为二进制数3.十进制数转换为十进制ASCII码串4.十进制ASCII码串转换为十进制数5.十六进制数转换为十六进制ASCII码串6.十六进制ASCII码串转换为十六进制数,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,1.二进制数转换为二进制ASCII码串二进制数由0和1组成

14、,转换为ASCII码的方法较为简单。将二进制位从高到低逐位移出,如果移出的是0则转换为30H(0的ASCII码),如果移出的是1则转换为31H(1的ASCII码),如此处理直到最低位,就得到相应的ASCII码串。,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,2.二进制ASCII码串转换为二进制数二进制的ASCII码串转换为相应二进制数有两个内容:其一是将各个ASCII码转换为数字0或1,其二是要将转换后的数字逐位组合成为适合存储的字或字节。,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,例6.12 编程,将从键盘上接收到的16位二进制ASC

15、II码转换成相应的二进制数,存放在以内存BIN16开始的单元。,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,3.十进制数转换为十进制ASCII码串十进制数由09组成,ASCII码是30H39H,到ASCII码的转换只要在数字的基础上加30H(0的ASCII码)即可。,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,例6.13 十进制数的压缩BCD码存放在以内存DEC5开始的单元,字节数存放在LEN单元。编程,将此十进制数转换为ASCII码串,存放在以内存DASC6开始的单

16、元,并在显示器上显示出来。压缩BCD码的一个字节存放两个十进制位,而一次只能将一个十进制位转换为相应的ASCII码,因此需要将一个字节的高低两部分拆开分别存放在两个字节中。,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,设待拆分的字节存放在DL中,拆分后高半部分存放在DH,低半部分存放在DL,子程序编制如下:DISC PROCPUSH CXMOV DH,DL;在DH中保存副本AND DH,0F0H;高半部分放在DHMOV CL,4SHR DH,CLAND DL,0FH;低半部分放在DLPOP CXRETDISC ENDP,Eg6_13.s,二、十、十六进制编码与ASC

17、II码之间的转换,6.4 代码转换程序设计,4.十进制ASCII码串转换为十进制数十进制ASCII码减去30H(0的ASCII码)就得到相应的BCD码。,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,例6.14 编程,将从键盘上接收到的四位十进制ASCII码转换成相应的非压缩BCD码,存放在以内存DEC4开始的单元。,Eg6_14.s,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,5.十六进制数转换为十六进制ASCII码串(1)查表法(2)运算法,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,(1)查表法例6.15

18、十六进制数的ASCII码表存放在数据段TAB开始的单元,如图所示。编程实现将DX中的4位十六进制数转换为相应的4个ASCII码字符,从高位开始顺序存放在DI所指单元开始的空间。,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,(2)运算法数字09的ASCII码为30H39H,可以直接加上30H;字母AF的ASCII码为41H46H,在直接加上30H后作一次判断,如果是字母就还要加上07H。也可以先作判断,是数字就加30H转换,是字母就加37H转换。,二、十、十六进制编码与ASCII码之间的转换,6.

19、4 代码转换程序设计,例6.16 编程,将BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,6.十六进制ASCII码串转换为十六进制数十六进制ASCII码转换为十六进制数,同样还需要根据对输入字符的判断做出不同的处理。数字的ASCII码减去30H,字母AF的ASCII码减去37H,字母af的ASCII码减去57H。,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,例6.17 编程,将从键盘上接收的四位十六进制数ASCI

20、I码转换为相应的十六进制数存放在以内存HEX4开始的单元中。,二、十、十六进制编码与ASCII码之间的转换,6.4 代码转换程序设计,Eg6_17.s,第6章算术运算与代码转换程序设计,6.1 加减法运算程序设计6.2 乘除法运算程序设计6.3 串操作程序设计6.4 代码转换程序设计6.5 排序与查找程序设计,6.5 排序与查找程序设计,排序查找,排序,6.2 排序与查找程序设计,1.起泡排序2.插入排序,排序起泡排序,6.2 排序与查找程序设计,起泡排序的过程是:首先将第一项与第二项进行比较,若为逆序(a1 a2),则将两项互换,然后比较第二项和第三项,依此类推,直至第n-1个元素和第n个元

21、素比较过为止。上述过程称为第一趟起泡排序,其结果是最大值元素被放在表的最后,即第n个位置。然后进行第二趟起泡排序,对前n-1个元素进行同样的操作,结果是将次大值元素放在第n-1个位置。,排序起泡排序,6.2 排序与查找程序设计,排序起泡排序,6.2 排序与查找程序设计,例6.18 数据表存放在以内存TABLE开始的单元。用起泡法编程,将其按递减顺序排序,排序后仍存放在以TABLE开始的单元。,排序起泡排序,6.2 排序与查找程序设计,Eg6_18.s,排序插入排序,6.2 排序与查找程序设计,插入排序的基本操作是:将一个元素插入到已进行过排序处理的有序表中,从而得到一个新的、元素个数增1的有序

22、表。初始状态是把第一个元素作为有序子表,取第二个元素插入后得到一个含有两个元素的有序子表,再取第三个元素插入后得到一个含有三个元素的有序子表,依此类推,将表中所有元素插入有序子表,排序完成。,排序插入排序,6.2 排序与查找程序设计,排序插入排序,6.2 排序与查找程序设计,例6.19 数据表存放在以内存TABLE开始的单元。用插入法编程,将其按升序排序。,Eg6_19.s,查找,6.2 排序与查找程序设计,1.顺序查找2.折半查找,查找,6.2 排序与查找程序设计,1.顺序查找顺序查找是无序表查找的惟一方法。待查找关键字从表首开始逐个与表中元素进行比较,如果相同,查找成功;否则进行下一次比较

23、,依此类推。如果与最后一个元素也不相同,则查找失败。,查找顺序查找,6.2 排序与查找程序设计,例6.20 一个字数据存放在内存KEY单元,无序字数据表存放在以内存LIST开始的单元。编程,在表中查找该数,如果找到,将匹配元素在表中的序号存放在BL中,并提示查找成功;如果表中没有该数,将BL置全1,并提示查找失败。,Eg6_20.s,查找,6.2 排序与查找程序设计,1.折半查找折半查找又称二分查找,它仅适用于对有序表的查找。假定有序表为升序,待查找数据为x,查找过程是:x首先与表首、表尾元素进行比较,若相等,查找成功;若不等,并且x的值位于首尾元素之间,则x与中间项进行比较。x如果与中间项相

24、等,则查找成功;x如果大于中间项,则查找在后半进行;x如果小于中间项,则查找在前半进行,这样就将查找范围缩小了一半。然后,x再与缩小了一半的有序表的中间项进行比较。若相等,查找成功;否则,又将查找范围缩小一半,依此类推,直到查找成功或确定表中不含与x值相同的元素。每次查找都将范围缩小一半,折半查找由此得名。,查找折半查找,6.2 排序与查找程序设计,例6.21 一个字数据存放在内存KEY单元,无符号升序字数据表存放在以内存LIST开始的单元。用折半查找法编程,在表中查找该数,如果找到,将表中匹配元素的地址存放在内存ADR单元,如果表中没有该数,则将ADR单元置全1。,查找折半查找,6.2 排序与查找程序设计,Eg6_21.s,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号