汇编语言程序设计(2)

上传人:aa****6 文档编号:54840407 上传时间:2018-09-20 格式:PPT 页数:97 大小:357KB
返回 下载 相关 举报
汇编语言程序设计(2)_第1页
第1页 / 共97页
汇编语言程序设计(2)_第2页
第2页 / 共97页
汇编语言程序设计(2)_第3页
第3页 / 共97页
汇编语言程序设计(2)_第4页
第4页 / 共97页
汇编语言程序设计(2)_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《汇编语言程序设计(2)》由会员分享,可在线阅读,更多相关《汇编语言程序设计(2)(97页珍藏版)》请在金锄头文库上搜索。

1、应用程序示例,代码转换,代码转换是程序设计中的常见问题。由于涉及到键盘输入、屏幕显示、打印机输出等I/O操作往往都是处理字符的ASCII码值; 作为对比:指令运算的对象和结果都是二进制:一串0、1代码。 输出显示的格式可能是二进制数、十进制数或者十六进制数,所以很多场合都要进行代码转换。,例把键盘上输入的一位十进制数(ASCII码)以二进制方式显示(ASCII码) 。,EXE格式程序清单DATA SEGMENT USE16 MESG1 DB Please Enter!,0DH,0AH,$ MESG2 DB -Error!$ DATA ENDSCODE SEGMENT USE16ASSUME C

2、S:CODE,DS:DATA BEG: MOV AX,DATAMOV DS,AX,MOV AH,9MOV DX,OFFSET MESG1INT 21HMOV AH,1INT 21H ;输入一个字符CMP AL,39HJA ERROR ;如果大于39H则出错CMP AL,30HJB ERROR ;或JC:如果小于30H同样出错SUB AL,30H ;或AND AL,0FHMOV BL,AL,MOV AH,2MOV DL,=INT 21HCALL DISPMOV AH,2MOV DL,BINT 21HJMP EXIT ERROR:MOV AH,9MOV DX,OFFSET MESG2INT 21H

3、 EXIT:MOV AH,4CHINT 21H,DISP PROCMOV CX,8 LAST:MOV DL,0RCL BL,1JNC NEXTMOV DL,1 NEXT:MOV AH,2INT 21HLOOP LASTRET DISP ENDP CODE ENDSEND BEG,COM格式程序清单,.486 CODE SEGMENT USE16ASSUME CS:CODEORG 100H START:JMP BEG MESG1 DB Please Enter!,0DH,0AH,$ MESG2 DB -Error!$BEG: MOV AH,9MOV DX,OFFSET MESG1INT 21HM

4、OV AH,1,INT 21HCMP AL,39HJA ERRORCMP AL,30HJB ERRORSUB AL,30HMOV BL,ALMOV AH,2MOV DL,=INT 21HCALL DISPMOV AH,2,MOV DL,BINT 21HJMP EXIT ERROR:MOV AH,9MOV DX,OFFSET MESG2INT 21H EXIT:MOV AH,4CHINT 21H ;-,DISP PROCMOV CX,8 LAST:MOV DL,0 RCL BL,1JNC NEXTMOV DL,1 NEXT:MOV AH,2INT 21HLOOP LASTRET DISP END

5、PCODE ENDSEND START,就本例而言,COM文件体积为110个字节,而EXE文件为625个字节。 显然,COM文件比EXE文件大大节省了空间。,例 把一个字单元的4位BCD码转换成二进制数。,CODE SEGMENT USE16ASSUME CS:CODEBCD_NUM DW 4567H ; 4567H = 7+10*(6+10*(5+10*(4+10*0) ) )BEG:MOV CX,4 MOV AX,0 ;存放中间结果 AGAIN:ROL BCD_NUM,4MOV BX,BCD_NUMAND BX,000FH ;依次取出BCD_NUM的千、百、十、个位的BCD码CALL MU

6、L10LOOP AGAIN,DISP:MOV BP,AXMOV CX,16LAST:MOV AL,0RCL BP,1ADC AL,0MOV AH,0EHINT 10HLOOP LAST MOV AH,4CHINT 21H,MUL10 PROCMOV DX,10MUL DXADD AX,BX ;乘积的高16位存放在DX,始终为0RET MUL10 ENDPCODE ENDSEND BEG,特例:一个不大于99的BCD数可以直接用AAD指令求出等值的二进制数。 MOV AX,0908H AAD,进制转换,进制转换过程中经常利用代码转换。,例把一个16位二进制数转换成十六进制数显示。,.486 DA

7、TA SEGMENT USE16NUM DW 0001101000101011B ;1A2BHBUF DB 4 DUP(?),H$ DATA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATABEG:MOV AX,DATAMOV DS,AXMOV SI,OFFSET BUF ;存放转换后的16进制数ASCII码,MOV DX,NUM ;取出二进制数SAL EDX,16MOV CX,4 ;一个 16位二进制数包括4位16进制数 LP:ROL EDX,4 ;图示EDX/DX/DL变化AND DL,0FH ;DL低4位二进制必定介于015CMP DL,10JB

8、NEXTNEXT:ADD DL,30H;09的ASCII介于30H39H、与数值09相差30HMOV SI,DLINC SILOOP LP,MOV DX,NUM ;取出二进制数SAL EDX,16MOV CX,4 ;一个 16位二进制数包括4位16进制数 LP:ROL EDX,4 ;图示EDX/DX/DL变化AND DL,0FH ;DL低4位二进制必定介于015CMP DL,10JB NEXTADD DL,7 ;A的ASCII与10相差:37H NEXT:ADD DL,30H;09的ASCII介于30H39H、与数值09相差30HMOV SI,DLINC SILOOP LP,MOV AH,9M

9、OV DX,OFFSET BUFINT 21HMOV AH,4CHINT 21H CODE ENDSEND BEG,例二进制数转换成十进制数显示。,二进制数转换成十进制数有多种方法,即比较法、恢复余数法和除法求余。8位二进制数转换比较法程序清单 思路:需要注意:必须事先确定:操作数的字长!,CMPDISP MACRO NNLOCAL LAST,NEXTMOV DL,0LAST:CMP BEN,NNJC NEXTINC DLSUB BEN,NNJMP LASTNEXT:ADD DL,30HMOV AH,2INT 21HENDM,CODE SEGMENT USE16ASSUME CS:CODEBE

10、N DB 10101110B ;等于十进制数174BEG:CMPDISP 100 ;求百位上的数字CMPDISP 10 ;求十位上的数字CMPDISP 1 ;求个位上的数字MOV AH,4CHINT 21H CODE ENDSEND BEG,特例:一个不大于99的二进制数,转换成十进制数显示更简单。MOV AX,01100010B;AH=0,AL=98AAM ;AH=09H,AL=08HADD AX,3030H ;AH-39H,AL=38HPUSH AXROL AX,8 ;AH=38H,AL=39HMOV AH,0EHINT 10H ;0E号10H的BIOS调用等价与2号DOS功能调用,显示一

11、个字符(其ASCII码放在AL中)POP AXMOV AH,0EHINT 10H,例把BX中的16位二进制数转换成十进制并显示在屏幕上。 (寄存器参数传递) STASG SEGMENTDW 32 DUP(?) STASG ENDSCODE SEGMENTASSUME CS:CODE MAIN PROC FARMOV BX,162EHCALL TERN MOV AX,4C00HINT 21H MAIN ENDP,TERN PROC ;二十并显示。MOV CX,10000CALL DEC_DIV ;转换万位数MOV CX,1000CALL DEC_DIV ;转换千位数MOV CX,100CALL

12、DEC_DIV ;转换百位数MOV CX,10CALL DEC_DIV ;转换十位数MOV CX,1CALL DEC_DIV ;转换个位数RET TERN ENDP,DEC_DIV PROC ;CX中为十进制的位权MOV AX,BXMOV DX,0DIV CX ;商为转换后的一位十进制数MOV BX,DXMOV DL,ALADD DL,30H ;转换成ASCII码MOV AH,2 ;显示INT 21HRET DEC_DIV ENDP CODE ENDSEND MAIN,除法求余法。把一个32位二进制数转换成十进制数、并显示在显示器上。 .486 CODE SEGMENT USE16ASSUME

13、 CS:CODENUM32 DD 3456789000BEG:MOV EAX,NUM32MOV EBX,10 ;除数是32位10,能否视为16位的10? ;注意:必须把10视为32位数!如果把除数10视为16位,则商用16位放不下。MOV CX,0 ;动态统计:对应的十进制数的位数! 高位的0无需显示,但如果32位数是全0则要显示唯一的一位0; 因此CX至少为1,LAST: MOV EDX,0 ;被除数64位、高半部分为0 DIV EBX ;除法结果的余数在EDX PUSH DX ;保存余数;余数本来存放在32位的EDX;;因为余数10,因此余数实际上就在DL中!;能否使用PUSH DL ?I

14、NC CX ;非0的位数加1,至少1位CMP EAX,0 ;EAX保存商,注意:除法结束的条件JNZ LAST ; 如果商为0,退出循环!,;根据堆栈中的余数:逆序显示 AGA:POP DX ADD DL,30H ;把每个余数转换成对应的ASCII码 MOV AH,2 INT 21H ;逐一显示余数 LOOP AGA;循环显示次数就是CX中:十进制数的位数! MOV AH,4CHINT 21H CODE ENDSEND BEG,思考:源代码中的操作数: 是否可以改为其他进制? 是否可以改为负数?类似于C语言的自动类型转换: short int a= - 3; unsigned short in

15、t b=a; b=?,数值计算,例:两个4字节组合BCD码数加法,.486DATA SEGMENT USE16XX DD 13572468HYY DD 55667788HSUM DB ?,?,?,?,? ;增加一个字节,用于存放进位值00或01DATA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATABEG:MOV AX,DATAMOV DS,AX,MOV SI,OFFSET XXMOV DI,OFFSET YYMOV BX,OFFSET SUM+4 ;为什么要加4?;低位结果先得、但后显示CLCMOV CX,4 BCD_ADD:MOV AL,SIADC AL,DIDAAMOV BX,ALINC SIINC DI ;指向高地址、高位;DEC BX LOOP BCD_ADD,ADC CL,0MOV BX,CL ;保存最高位的进位CALL DISPMOV AH,4CHINT 21H,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号