《汇编语言程序设计》第6章算术运算与代码程序设计.ppt
-
资源ID:72956841
资源大小:751.50KB
全文页数:78页
- 资源格式: PPT
下载积分:11.9金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
《汇编语言程序设计》第6章算术运算与代码程序设计.ppt
第6章算术运算与代码转换程序设计q6.1 加减法运算程序设计q6.2 乘除法运算程序设计q6.3 串操作程序设计q6.4 代码转换程序设计q6.5 排序与查找程序设计第6章算术运算与代码转换程序设计q6.1 加减法运算程序设计q6.2 乘除法运算程序设计q6.3 串操作程序设计q6.4 代码转换程序设计q6.5 排序与查找程序设计6.1 加减法运算程序设计n二进制加减运算n十进制加减运算n 二进制加减运算6.1 加减法运算程序设计n如果加减法运算的操作数是8位或16位的二进制数,而运算结果也在此范围内,那么用一条基本加减运算指令就可以完成。实际上,我们所面对的数据经常会超过8位、16位的范围,这就是多字节数的二进制加减运算。n 二进制加减运算6.1 加减法运算程序设计n例6.1 两个多字节无符号数分别存放在内存DATA1和DATA2开始的单元,数据长度存放在LEN单元,编程求两数之和,将结果存放在SUM开始的单元。n 二进制加减运算6.1 加减法运算程序设计n多字节数相加运算应考虑的问题有:(1)数据长度可存储在计算机中,也可定义成常量。(2)为简化程序,应采用循环结构作程序主体。(3)最低字节相加与其他字节相加有所不同。(4)两个无符号数相加的最高字节产生的进位应处理成结果的最高字节,两个带符号数相加可能需要做溢出处理。n 二进制加减运算6.1 加减法运算程序设计DSEG SEGMENTDSEG SEGMENTDATA1DB 0BHDATA1DB 0BH,20H20H,45H45HDATA2DB 05HDATA2DB 05H,0EH0EH,0D7H0D7HLEN DB 3 SUM DB 4 DUPLEN DB 3 SUM DB 4 DUP(0 0)DSEG ENDSDSEG ENDSSSEG SEGMENT PARA STACKSSEG SEGMENT PARA STACKSTK DB 20 DUPSTK DB 20 DUP(0 0)SSEG ENDSSSEG ENDSCSEG SEGMENTCSEG SEGMENTASSUME DS:DSEGASSUME DS:DSEG,SS:SSEGSS:SSEG,CS:CSEGCS:CSEGSTART:START:MOV AXMOV AX,DSEGDSEGMOV DSMOV DS,AXAXMOV AXMOV AX,SSEGSSEGMOV SSMOV SS,AXAXMOV SPMOV SP,LENGTH STKLENGTH STKMOV CXMOV CX,LENLENMOV SIMOV SI,0 0CLCCLC;注释注释1 1 NEXT:NEXT:MOV ALMOV AL,DATA1DATA1SISIADC ALADC AL,DATA2DATA2SISIMOV SUMMOV SUMSISI,ALALINC SIINC SI;注释注释2 2 LOOP NEXTLOOP NEXTMOV ALMOV AL,0 0ADC ALADC AL,0 0MOV SUMMOV SUMSISI,ALALMOV AHMOV AH,4CH4CHINT 21HINT 21HCSEG ENDSCSEG ENDSEND STARTEND START注释1:清除进位标志,使最低字节的加法也可以利用循环体中的ADC指令。注释2:在本次加法和下次加法间的语句都不影响进位标志,是为了保证相继高字节相加时,加入的是相应低字节产生的进位状态。如果含有影响进位标志的语句,则需要在本次加法后用LAHF保存标志,在下次加法前用SAHF恢复标志。n 十进制加减运算6.1 加减法运算程序设计n以4位二进制数对十进制数进行编码有两种情况。在一个字节中只含一个BCD码为非压缩型,其加减法调整指令分别为AAA和AAS。在一个字节中含两个BCD码为压缩型,其加减法调整指令分别为DAA和DAS。需要注意的是,调整指令要求加或减的结果一定在AL中。n 十进制加减运算6.1 加减法运算程序设计n例6.2 两个单字节非压缩BCD码数据分别存放在内存的DATA1和DATA2单元中,编程求两数的和与差,分别将结果存入SUM和DIF单元。n 十进制加减运算6.1 加减法运算程序设计DSEG SEGMENTDSEG SEGMENTDATA1DB 08HDATA1DB 08HDATA2DB 06H SUM DW 0DATA2DB 06H SUM DW 0DIF DB 0DIF DB 0DSEG ENDSDSEG ENDSSSEG SEGMENT PARA STACKSSEG SEGMENT PARA STACKSTK DB 20 DUPSTK DB 20 DUP(0 0)SSEG ENDSSSEG ENDSCSEG SEGMENTCSEG SEGMENTASSUME DS:DSEGASSUME DS:DSEG,SS:SSEGSS:SSEG,CS:CSEGCS:CSEGSTART:START:MOV AXMOV AX,DSEGDSEGMOV DSMOV DS,AXAXMOV AXMOV AX,SSEGSSEGMOV SSMOV SS,AXAXMOV SPMOV SP,LENGTH STKLENGTH STKMOV AHMOV AH,0 0MOV ALMOV AL,DATA1DATA1ADD ALADD AL,DATA2DATA2AAAAAAMOV WORD PTR SUMMOV WORD PTR SUM,AXAXMOV ALMOV AL,DATA1DATA1SUB ALSUB AL,DATA2DATA2AASAASMOV DIFMOV DIF,ALALMOV AHMOV AH,4CH4CHINT 21HINT 21HCSEG ENDSCSEG ENDSEND STARTEND STARTn 十进制加减运算6.1 加减法运算程序设计n例6.3 两个压缩BCD码数据分别存放在内存的DATA1和DATA2单元中,编程求两数之差,将结果存入DIF单元。n 十进制加减运算6.1 加减法运算程序设计第6章算术运算与代码转换程序设计q6.1 加减法运算程序设计q6.2 乘除法运算程序设计q6.3 串操作程序设计q6.4 代码转换程序设计q6.5 排序与查找程序设计6.2 乘除法运算程序设计n如果被乘数和乘数的长度不超过两个字节,或者被除数的长度不超过四个字节、除数的长度不超过两个字节,就可以直接使用8086.8088提供的乘除法指令实现乘除法运算。如果超过了这个范围,就要与其他指令配合,通过程序段实现多字节的乘除法。6.2 乘除法运算程序设计n二进制乘法运算n二进制除法运算n 二进制乘法运算6.2 乘除法运算程序设计n乘法的目的操作数必须存放在AX中(或AL中),对应的乘积存放在DX及AX中(或AX中),乘法的源操作数可以是立即数寻址之外的任何寻址方式。n 二进制乘法运算6.2 乘除法运算程序设计n例6.4 两个多字节无符号数分别存放在内存DATA1和DATA2开始的单元,数据长度分别存放在LEN1和LEN2单元中,编程求两数的乘积,将结果存放在PRDT单元。n分析:设被乘数的长度为L1,乘数的长度为L2,那么需要进行L1*L2次乘法运算,得到L1*L2个部分积,从而将多字节乘法转换成相应部分积的加法。n 二进制乘法运算6.2 乘除法运算程序设计n 二进制除法运算6.2 乘除法运算程序设计n除法的目的操作数必须存放在DX及AX中(或AX中),对应的商存放在AX中(或AL中),余数存放在DX中(或AH中),除法的源操作数可以是立即数寻址之外的任何寻址方式。无符号除法指令DIV要求被除数的高字节小于除数,否则产生溢出。n 二进制除法运算6.2 乘除法运算程序设计n例6.5 无符号被除数和除数分别存放在内存DATA1字单元和DATA2字节单元中,编程求两数的商和余数,分别存放在QUO和REM单元。n被除数为字,除数为字节的无符号除法,如果被除数的高字节不小于除数就会产生溢出。避免的方法是对被除数和除数进行前插0扩展,分别成为双字和字。n 二进制除法运算6.2 乘除法运算程序设计DSEG SEGMENTDSEG SEGMENTDATA1DW 1235HDATA1DW 1235HDATA2DB 94HDATA2DB 94HQUO DW 0QUO DW 0REM DW 0REM DW 0DSEG ENDSDSEG ENDSSSEG SEGMENT PARA STACKSSEG SEGMENT PARA STACKSTK DB 50 DUPSTK DB 50 DUP(0 0)SSEG ENDSSSEG ENDSCSEG SEGMENTCSEG SEGMENTASSUME DS:DSEGASSUME DS:DSEG,SS:SSEGSS:SSEG,CS:CSEGCS:CSEGSTART:START:MOV AXMOV AX,DSEGDSEGMOV DSMOV DS,AXAXMOV AXMOV AX,SSEGSSEGMOV SSMOV SS,AXAXMOV BPMOV BP,LENGTH STKLENGTH STKMOV AXMOV AX,DATA1 ;DATA1 ;被除数高字节与除数大小被除数高字节与除数大小MOV BLMOV BL,DATA2 ;DATA2 ;关系的处理关系的处理CMP AHCMP AH,BLBLJB BYTE1JB BYTE1 ;小于,不用扩展,后续处理小于,不用扩展,后续处理XOR DXXOR DX,DXDXXOR BHXOR BH,BHBHDIV BXDIV BXMOV QUOMOV QUO,AXAXMOV REMMOV REM,DXDXJMP OVERJMP OVERBYTE1:BYTE1:DIV BLDIV BLMOV BYTE PTR QUOMOV BYTE PTR QUO,ALALMOV BYTE PTR REMMOV BYTE PTR REM,AHAHOVER:OVER:MOV AHMOV AH,4CH4CHINT 21H INT 21H CSEG ENDSCSEG ENDSEND STARTEND START第6章算术运算与代码转换程序设计q6.1 加减法运算程序设计q6.2 乘除法运算程序设计q6.3 串操作程序设计q6.4 代码转换程序设计q6.5 排序与查找程序设计6.3 串操作程序设计n一组仅由字或字节组成的数据称为数据串。一个数据串最多可由64K字节组成。串操作指令规定源寄存器使用SI,源串隐含存放在DS段中,也可通过段跨越指出;目的寄存器使用DI,目的串隐含存放在ES段中,而且必须在ES段,不可进行段跨越。串操作指令的执行将自动修改SI、DI的值,修改方向由标志寄存器中的DF位确定。6.3 串操作程序设计n例6.6 一个字符串的长度为20,存放在数据段中STR1开始的单元,编程把它们传送到附加段中STR2开始的单元。6.3 串操作程序设计n方法1:利用LOOP指令用软件方法重复执行MOVSB的操作DSEG SEGMENTDSEG SEGMENTSTR1 DB Macro Assembler diskSTR1 DB Macro Assembler diskDSEG ENDSDSEG ENDSESEG SEGMENTESEG SEGMENTSTR2 DB 20 DUPSTR2 DB 20 DUP(0 0)ESEG ENDSESEG ENDSSSEG SEGMENT STACKSSEG SEGMENT STACKSTK DB 50 DUPSTK DB 50 DUP(0 0)SSEG ENDSSSEG ENDSCSEG SEGMENTCSEG SEGMENTASSUME DS:DSEGASSUME DS:DSEG,ES:ESEGES:ESEG,SS:SSEGSS:SSEG,CS:CSEGCS:CSEGSTART:START:MOV AXMOV AX,DSEGDSEGMOV DSMOV DS,AXAXMOV AXMOV AX,ESEGESEGMOV ESMOV ES,AXAXMOV AXMOV AX,SSEGSSEGMOV SSMOV SS,AXAXMOV SPMOV SP,LENGTH STKLENGTH STKLEA SILEA SI,STR1;STR1;初始化源寄存器初始化源寄存器LEA DILEA DI,STR2;STR2;初始化目的寄存器初始化目的寄存器MOV CXMOV CX,20 ;20 ;初始化循环计数器初始化循环计数器CLD ;CLD ;设置方向标志设置方向标志AGAIN:MOVSB LOOP AGAINAGAIN:MOVSB LOOP AGAINMOV AHMOV AH,4CH4CHINT 21HINT 21HCSEG ENDSCSEG ENDSEND STARTEND START6.3 串操作程序设计n方法2:利用REP指令实现MOVSB的操作DSEG SEGMENTDSEG SEGMENTSTR1 DB Macro Assembler diskSTR1 DB Macro Assembler diskDSEG ENDSDSEG ENDSESEG SEGMENTESEG SEGMENTSTR2 DB 20 DUPSTR2 DB 20 DUP(0 0)ESEG ENDSESEG ENDSSSEG SEGMENT STACKSSEG SEGMENT STACKSTK DB 50 DUPSTK DB 50 DUP(0 0)SSEG ENDSSSEG ENDSCSEG SEGMENTCSEG SEGMENTASSUME DS:DSEGASSUME DS:DSEG,ES:ESEGES:ESEG,SS:SSEGSS:SSEG,CS:CSEGCS:CSEGSTART:START:MOV AXMOV AX,DSEGDSEGMOV DSMOV DS,AXAXMOV AXMOV AX,ESEGESEGMOV ESMOV ES,AXAXMOV AXMOV AX,SSEGSSEGMOV SSMOV SS,AXAXMOV SPMOV SP,LENGTH STKLENGTH STKLEA SILEA SI,STR1STR1LEA DILEA DI,STR2STR2MOV CXMOV CX,2020CLDCLDREP MOVSB ;REP MOVSB ;数据串重复传送数据串重复传送MOV AHMOV AH,4CH4CHINT 21HINT 21HCSEG ENDSCSEG ENDSEND STARTEND START6.3 串操作程序设计n基本串操作指令在与重复前缀联用时,需要先做好下面的准备工作:(1)将源串首地址(若反向操作则是末地址)存放在SI中;(2)如果是与REP联用,将附加段中的目的串首地址(若反向操作则是末地址)存放在DI中;(3)将数据长度存放在CX中;(4)设置方向标志。6.3 串操作程序设计n例6.7 一个字符串以Null(00H)为结束符,存放在以ES:STR为起始地址的单元。n一个关键字存放在DS:CHAR单元,编程,在字符串中查找第一个与此关键字相同的字符。如果找到,将相应字符在ES段中的位移量存放在CX中,并将它在字符串中的序号存放在DX中,否则CX置全1。6.3 串操作程序设计Eg6_7.s第6章算术运算与代码转换程序设计q6.1 加减法运算程序设计q6.2 乘除法运算程序设计q6.3 串操作程序设计q6.4 代码转换程序设计q6.5 排序与查找程序设计6.4 代码转换程序设计n二进制编码与BCD码之间的转换n二、十、十六进制编码与ASCII码之间的转换n 二进制编码与BCD码之间的转换6.4 代码转换程序设计1.十进制数BCD码转换为二进制数2.二进制编码转换为十进制数n 二进制编码与BCD码之间的转换6.4 代码转换程序设计1.十进制数BCD码转换为二进制数n将十进制数的高位乘以10,与次高位相加,再乘以10;循环执行,直到处理完十进制数的最低位,十进制数就转换为对应的二进制编码。n 二进制编码与BCD码之间的转换6.4 代码转换程序设计n例6.8 若干正十进制整数(不大于32767)的ASCII码串存放在内存DSTR开始的单元,串间用逗号(2CH)分隔,最后以回车符(0DH)结束。编程,将每个十进制数的ASCII码串转换为二进制数存放在BIN开始的单元。n设入口条件是:SI指向ASCII码串的首地址,转换结果存放在CX中,编制实现将一个十进制ASCII码转换成相应二进制数的子程序如下。n 二进制编码与BCD码之间的转换6.4 代码转换程序设计n 二进制编码与BCD码之间的转换6.4 代码转换程序设计DASCBIN PROCDASCBIN PROCPUSH BX ;PUSH BX ;保存现场保存现场XOR CXXOR CX,CX;CX;累加寄存器置初值累加寄存器置初值0 0GETA:GETA:MOV ALMOV AL,SISICMP ALCMP AL,0;0;判断是否十进制数判断是否十进制数ASCIIASCII码码JB RETURNJB RETURNCMP ALCMP AL,99JA RETURNJA RETURNSUB ALSUB AL,0;0;转换为相应数值转换为相应数值XOR AHXOR AH,AHAHMOV BXMOV BX,CX;CX;将原累加值将原累加值*10*10SHL CXSHL CX,1SHL CX1SHL CX,1 1ADD CXADD CX,BXBXSHL CXSHL CX,1 1ADD CXADD CX,AX;AX;累加本次十进制数累加本次十进制数INC SIINC SIJMP GETAJMP GETAreturn:return:POP BXPOP BXRETRETDASCBIN ENDPDASCBIN ENDPn 二进制编码与BCD码之间的转换6.4 代码转换程序设计2.二进制编码转换为十进制数n将待转换的二进制数除以10取余,所得余数就是转换后十进制数的个位数;再把商作为被除数,除以10取余,所得余数就是转换后十进制数的十位数。依此类推,就可将二进制数转换为相应的十进制数。n 二进制编码与BCD码之间的转换6.4 代码转换程序设计n例6.9 16位无符号二进制数存放在内存BIN16开始的单元。编程,将其转换为相应十进制数的非压缩BCD码,存放在内存DEC5开始的单元。n 二进制编码与BCD码之间的转换6.4 代码转换程序设计n设二进制数为,对应的十进制数为44216Dn 二进制编码与BCD码之间的转换6.4 代码转换程序设计DSEG SEGMENTDSEG SEGMENTBIN16DW 1010110010111000BBIN16DW 1010110010111000BDEC5DB 5 DUPDEC5DB 5 DUP(0 0)DSEG ENDSDSEG ENDSSSEG SEGMENT STACKSSEG SEGMENT STACKSTK DB 10 DUPSTK DB 10 DUP(0 0)SSEG ENDSSSEG ENDSCSEG SEGMENTCSEG SEGMENTASSUME DS:DSEGASSUME DS:DSEG,SS:SSEGSS:SSEG,CS:CSEGCS:CSEGSTART:MOV AXSTART:MOV AX,DSEGDSEGMOV DSMOV DS,AXAXMOV AXMOV AX,SSEGSSEGMOV SSMOV SS,AXAXMOV SPMOV SP,LENGTH STKLENGTH STKMOV CXMOV CX,5 5LEA DILEA DI,DEC5+4 ;DEC5+4 ;指向个位指向个位BCDBCD码的位置码的位置MOV AXMOV AX,BIN16BIN16MOV BXMOV BX,1010LOP:XOR DXLOP:XOR DX,DXDXDIV BXDIV BXMOV MOV DIDI,DL;DL;保存余数,即一位保存余数,即一位BCDBCD码码DEC DIDEC DILOOP LOPLOOP LOPMOV AHMOV AH,4CH4CHINT 21HINT 21HCSEG ENDSCSEG ENDSEND STARTEND STARTn 二进制编码与BCD码之间的转换6.4 代码转换程序设计n例6.10 编写一个单字节无符号二进制整数转换为相应压缩BCD码的子程序。子程序的入口条件是:SI指向二进制数所在单元,转换后的压缩BCD码存放在DI指向的字单元n 二进制编码与BCD码之间的转换6.4 代码转换程序设计BINDEC PROCBINDEC PROCPUSH CXPUSH CXPUSH BXPUSH BXXOR AXXOR AX,AXAXMOV MOV DIDI,AXAXMOV CXMOV CX,8 8LOP1:LOP1:MOV BLMOV BL,SISISHL BLSHL BL,1 ;1 ;将待处理二进制位移入将待处理二进制位移入CFCFMOV MOV SISI,BLBLMOV BHMOV BH,2 ;2 ;转换后的字节个数转换后的字节个数LOP2:LOP2:MOV ALMOV AL,BYTE PTRBYTE PTRDIDIADC ALADC AL,AL ;AL ;注释注释1 1DAADAAMOV BYTE PTRMOV BYTE PTRDIDI,ALALINC DIINC DIDEC BHDEC BHJNZ LOP2JNZ LOP2SUB DISUB DI,2 ;DI2 ;DI指向存放转换结果的单元指向存放转换结果的单元LOOP LOP1LOOP LOP1POP BXPOP BXPOP CXPOP CXRETRETBINDEC ENDPBINDEC ENDPn 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计1.二进制数转换为二进制ASCII码串2.二进制ASCII码串转换为二进制数3.十进制数转换为十进制ASCII码串4.十进制ASCII码串转换为十进制数5.十六进制数转换为十六进制ASCII码串6.十六进制ASCII码串转换为十六进制数n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n1.二进制数转换为二进制ASCII码串n二进制数由0和1组成,转换为ASCII码的方法较为简单。将二进制位从高到低逐位移出,如果移出的是0则转换为30H(0的ASCII码),如果移出的是1则转换为31H(1的ASCII码),如此处理直到最低位,就得到相应的ASCII码串。n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n2.二进制ASCII码串转换为二进制数n二进制的ASCII码串转换为相应二进制数有两个内容:其一是将各个ASCII码转换为数字0或1,其二是要将转换后的数字逐位组合成为适合存储的字或字节。n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n例6.12 编程,将从键盘上接收到的16位二进制ASCII码转换成相应的二进制数,存放在以内存BIN16开始的单元。n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计DSEG SEGMENTDSEG SEGMENTPROMPT DB Input a number of bin16:PROMPT DB Input a number of bin16:BIN16DW?BIN16DW?DSEG ENDSDSEG ENDSSSEG SEGMENT STACKSSEG SEGMENT STACKSTK DB 50 DUPSTK DB 50 DUP(0 0)SSEG ENDSSSEG ENDSCSEG SEGMENTCSEG SEGMENTASSUME DS:DSEGASSUME DS:DSEG,SS:SSEGSS:SSEG,CS:CSEGCS:CSEGSTART:START:MOV AXMOV AX,DSEGDSEGMOV DSMOV DS,AX MOV AXAX MOV AX,SSEGSSEGMOV SSMOV SS,AXAXMOV SPMOV SP,LENGTH STKLENGTH STKLEA DXLEA DX,PROMPT;PROMPT;显示提示信息显示提示信息MOV AHMOV AH,09H09HINT 21HINT 21HMOV CXMOV CX,1616XOR BXXOR BX,BXBXLOP:MOV AHLOP:MOV AH,08H;08H;键盘输入键盘输入DOSDOS功能调用,无回显功能调用,无回显INT 21HINT 21HCMP ALCMP AL,00JZ GOJZ GO;是是0 0的的ASCIIASCII码,转处理码,转处理CMP ALCMP AL,11JNZ LOPJNZ LOP;不是二进制不是二进制ASCIIASCII码,重输码,重输GO:AND ALGO:AND AL,01H01H;转换为二进制数转换为二进制数SHL BXSHL BX,1 1;BX;BX寄存器左移一位寄存器左移一位OR BLOR BL,ALAL;与原二进制数组合在一起与原二进制数组合在一起LOOP LOPLOOP LOPMOV BIN16MOV BIN16,BXBXMOV AHMOV AH,4CH4CHINT 21HINT 21HCSEG ENDSCSEG ENDSEND STARTEND STARTn 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n3.十进制数转换为十进制ASCII码串n十进制数由09组成,ASCII码是30H39H,到ASCII码的转换只要在数字的基础上加30H(0的ASCII码)即可。n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n例6.13 十进制数的压缩BCD码存放在以内存DEC5开始的单元,字节数存放在LEN单元。编程,将此十进制数转换为ASCII码串,存放在以内存DASC6开始的单元,并在显示器上显示出来。n压缩BCD码的一个字节存放两个十进制位,而一次只能将一个十进制位转换为相应的ASCII码,因此需要将一个字节的高低两部分拆开分别存放在两个字节中。n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计设待拆分的字节存放在DL中,拆分后高半部分存放在DH,低半部分存放在DL,子程序编制如下:DISC PROCPUSH CXMOV DH,DL ;在DH中保存副本AND DH,0F0H ;高半部分放在DHMOV CL,4SHR DH,CLAND DL,0FH ;低半部分放在DLPOP CXRETDISC ENDPEg6_13.sn 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n4.十进制ASCII码串转换为十进制数n十进制ASCII码减去30H(0的ASCII码)就得到相应的BCD码。n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n例6.14 编程,将从键盘上接收到的四位十进制ASCII码转换成相应的非压缩BCD码,存放在以内存DEC4开始的单元。Eg6_14.sn 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n5.十六进制数转换为十六进制ASCII码串(1)查表法(2)运算法n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n(1)查表法n例6.15 十六进制数的ASCII码表存放在数据段TAB开始的单元,如图所示。编程实现将DX中的4位十六进制数转换为相应的4个ASCII码字符,从高位开始顺序存放在DI所指单元开始的空间。n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计DSEG SEGMENTDSEG SEGMENTPROMPT DB Input a number of bin16:PROMPT DB Input a number of bin16:BIN16DW?BIN16DW?DSEG ENDSDSEG ENDSSSEG SEGMENT STACKSSEG SEGMENT STACKSTK DB 50 DUPSTK DB 50 DUP(0 0)SSEG ENDSSSEG ENDSCSEG SEGMENTCSEG SEGMENTASSUME DS:DSEGASSUME DS:DSEG,SS:SSEGSS:SSEG,CS:CSEGCS:CSEGSTART:START:MOV AXMOV AX,DSEGDSEGMOV DSMOV DS,AX MOV AXAX MOV AX,SSEGSSEGMOV SSMOV SS,AXAXMOV SPMOV SP,LENGTH STKLENGTH STKLEA DXLEA DX,PROMPT;PROMPT;显示提示信息显示提示信息MOV AHMOV AH,09H09HINT 21HINT 21HMOV CXMOV CX,1616XOR BXXOR BX,BXBXLOP:MOV AHLOP:MOV AH,08H;08H;键盘输入键盘输入DOSDOS功能调用,无回显功能调用,无回显INT 21HINT 21HCMP ALCMP AL,00JZ GOJZ GO;是是0 0的的ASCIIASCII码,转处理码,转处理CMP ALCMP AL,11JNZ LOPJNZ LOP;不是二进制不是二进制ASCIIASCII码,重输码,重输GO:AND ALGO:AND AL,01H01H;转换为二进制数转换为二进制数SHL BXSHL BX,1 1;BX;BX寄存器左移一位寄存器左移一位OR BLOR BL,ALAL;与原二进制数组合在一起与原二进制数组合在一起LOOP LOPLOOP LOPMOV BIN16MOV BIN16,BXBXMOV AHMOV AH,4CH4CHINT 21HINT 21HCSEG ENDSCSEG ENDSEND STARTEND STARTn 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n(2)运算法n数字09的ASCII码为30H39H,可以直接加上30H;字母AF的ASCII码为41H46H,在直接加上30H后作一次判断,如果是字母就还要加上07H。也可以先作判断,是数字就加30H转换,是字母就加37H转换。n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n例6.16 编程,将BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计HTOA2 PROCHTOA2 PROCPUSH CXPUSH CXPUSH DXPUSH DXXOR ALXOR AL,ALALMOV CHMOV CH,4 ;4 ;十六进制位数十六进制位数LOP:LOP:MOV CLMOV CL,4 ;4 ;获得十六进制位获得十六进制位ROL BXROL BX,CLCLMOV ALMOV AL,BLBLAND ALAND AL,0FH0FHADD ALADD AL,30H30HCMP ALCMP AL,3AH3AHJL PRN ;JL PRN ;是是0 09 9,转输出,转输出ADD ALADD AL,07H;07H;是是A AF F,再加,再加07H07HPRN:PRN:MOV DLMOV DL,ALALMOV AHMOV AH,02H;02H;屏幕显示屏幕显示DOSDOS功能调用功能调用INT 21HINT 21HDEC CHDEC CHJNZ LOPJNZ LOPPOP DXPOP DXPOP CXPOP CXRETRETHTOA2 ENDPHTOA2 ENDPn 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n6.十六进制ASCII码串转换为十六进制数n十六进制ASCII码转换为十六进制数,同样还需要根据对输入字符的判断做出不同的处理。数字的ASCII码减去30H,字母AF的ASCII码减去37H,字母af的ASCII码减去57H。n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计n例6.17 编程,将从键盘上接收的四位十六进制数ASCII码转换为相应的十六进制数存放在以内存HEX4开始的单元中。n 二、十、十六进制编码与ASCII码之间的转换6.4 代码转换程序设计Eg6_17.s第6章算术运算与代码转换程序设计q6.1 加减法运算程序设计q6.2 乘除法运算程序设计q6.3 串操作程序设计q6.4 代码转换程序设计q6.5 排序与查找程序设计6.5 排序与查找程序设计n排序n查找n 排序6.2 排序与查找程序设计1.起泡排序2.插入排序n 排序起泡排序6.2 排序与查找程序设计n起泡排序的过程是:n首先将第一项与第二项进行比较,若为逆序(a1 a2),则将两项互换,然后比较第二项和第三项,依此类推,直至第n-1个元素和第n个元素比较过为止。上述过程称为第一趟起泡排序,其结果是最大值元素被放在表的最后,即第n个位置。然后进行第二趟起泡排序,对前n-1个元素进行同样的操作,结果是将次大值元素放在第n-1个位置。n 排序起泡排序6.2 排序与查找程序设计n 排序起泡排序6.2 排序与查找程序设计n例6.18 数据表存放在以内存TABLE开始的单元。用起泡法编程,将其按递减顺序排序,排序后仍存放在以TABLE开始的单元。n 排序起泡排序6.2 排序与查找程序设计Eg6_18.sn 排序插入排序6.2 排序与查找程序设计n插入排序的基本操作是:n将一个元素插入到已进行过排序处理的有序表中,从而得到一个新的、元素个数增1的有序表。初始状态是把第一个元素作为有序子表,取第二个元素插入后得到一个含有两个元素的有序子表,再取第三个元素插入后得到一个含有三个元素的有序子表,依此类推,将表中所有元素插入有序子表,排序完成。n 排序插入排序6.2 排序与查找程序设计n 排序插入排序6.2 排序与查找程序设计n例6.19 数据表存放在以内存TABLE开始的单元。用插入法编程,将其按升序排序。Eg6_19.sn 查找6.2 排序与查找程序设计n1.顺序查找n2.折半查找n 查找6.2 排序与查找程序设计n1.顺序查找n顺序查找是无序表查找的惟一方法。待查找关键字从表首开始逐个与表中元素进行比较,如果相同,查找成功;否则进行下一次比较,依此类推。如果与最后一个元素也不相同,则查找失败。n 查找顺序查找6.2 排序与查找程序设计n例6.20 一个字数据存放在内存KEY单元,无序字数据表存放在以内存LIST开始的单元。编程,在表中查找该数,如果找到,将匹配元素在表中的序号存放在BL中,并提示查找成功;如果表中没有该数,将BL置全1,并提示查找失败。Eg6_20.sn 查找6.2 排序与查找程序设计n1.折半查找n折半查找又称二分查找,它仅适用于对有序表的查找。假定有序表为升序,待查找数据为x,查找过程是:x首先与表首、表尾元素进行比较,若相等,查找成功;若不等,并且x的值位于首尾元素之间,则x与中间项进行比较。x如果与中间项相等,则查找成功;x如果大于中间项,则查找在后半进行;x如果小于中间项,则查找在前半进行,这样就将查找范围缩小了一半。然后,x再与缩小了一半的有序表的中间项进行比较。若相等,查找成功;否则,又将查找范围缩小一半,依此类推,直到查找成功或确定表中不含与x值相同的元素。每次查找都将范围缩小一半,折半查找由此得名。n 查找折半查找6.2 排序与查找程序设计n例6.21 一个字数据存放在内存KEY单元,无符号升序字数据表存放在以内存LIST开始的单元。用折半查找法编程,在表中查找该数,如果找到,将表中匹配元素的地址存放在内存ADR单元,如果表中没有该数,则将ADR单元置全1。n 查找折半查找6.2 排序与查找程序设计Eg6_21.s