《汇编语言程序设计》第6章算术运算与代码程序设计.ppt
《《汇编语言程序设计》第6章算术运算与代码程序设计.ppt》由会员分享,可在线阅读,更多相关《《汇编语言程序设计》第6章算术运算与代码程序设计.ppt(78页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第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位的范围,
2、这就是多字节数的二进制加减运算。n 二进制加减运算6.1 加减法运算程序设计n例6.1 两个多字节无符号数分别存放在内存DATA1和DATA2开始的单元,数据长度存放在LEN单元,编程求两数之和,将结果存放在SUM开始的单元。n 二进制加减运算6.1 加减法运算程序设计n多字节数相加运算应考虑的问题有:(1)数据长度可存储在计算机中,也可定义成常量。(2)为简化程序,应采用循环结构作程序主体。(3)最低字节相加与其他字节相加有所不同。(4)两个无符号数相加的最高字节产生的进位应处理成结果的最高字节,两个带符号数相加可能需要做溢出处理。n 二进制加减运算6.1 加减法运算程序设计DSEG SEG
3、MENTDSEG 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:DS
4、EG,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
5、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、加减运算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 0
7、8HDATA2DB 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,A
8、XAXMOV 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 END
9、SEND 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提供的乘除法指令实现乘除法运算。如果
10、超过了这个范围,就要与其他指令配合,通过程序段实现多字节的乘除法。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次乘法运算,
11、得到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被除数为字,除数为字节的无符号除法,
12、如果被除数的高字节不小于除数就会产生溢出。避免的方法是对被除数和除数进行前插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 SEGME
13、NTCSEG 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 B
14、YTE1JB 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 ENDSE
15、ND 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,存放在数据段
16、中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
17、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
18、,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
19、 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:SS
20、EGSS: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,4CH
21、4CHINT 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单元,编程,在字符串中查找第一个与此关键字相同的字符。如果找到,将相应字
22、符在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码转换为二进制
23、数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 代码转换程序设计
24、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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言程序设计 汇编语言 程序设计 算术 运算 代码
限制150内