微机原理程序设计考题.doc

上传人:枫** 文档编号:557639802 上传时间:2023-03-10 格式:DOC 页数:4 大小:34.50KB
返回 下载 相关 举报
微机原理程序设计考题.doc_第1页
第1页 / 共4页
微机原理程序设计考题.doc_第2页
第2页 / 共4页
微机原理程序设计考题.doc_第3页
第3页 / 共4页
微机原理程序设计考题.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《微机原理程序设计考题.doc》由会员分享,可在线阅读,更多相关《微机原理程序设计考题.doc(4页珍藏版)》请在金锄头文库上搜索。

1、一 两个多位十进制数相加将两个多位十进制数相加,要求加数均以ASCII码形式各自顺序存放在以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。分析:整个程序分为4个部分:显示加数、转换、相加、输出结果。我们可以分别用子程序来完成各个部分的功能。1. 显示加数。可以利用DOS功能的显示单个字符的功能(02H),在主程序中让SI寄存器间指需要显示的内容。注意:在内存中存放的顺序是低位在前,而显示的时候要高位在前。子程序如下:DISPLAY PROC MOV CX , 5NEXT: MOV DL, SI ;取要显示的字符 MOV AH, 02H INT 21H DEC S

2、I LOOP NEXT RETDISPLAY ENDP2. 转换。转换的目的是将以ASCII码形式表示的各位变成实际的大小。也就是将ASCII码的形式转换为BCD码的形式,一个字节表示一位。在主程序中让SI寄存器间指需要显示的内容。由于加数都是十进制的,所以只有数字09,因此只要让每个字符减去30H就得到了相应位的大小。子程序如下:CHANGE PROC ;转换子程序 MOV CX , 5 ;取字符串长度放CX中NEXT1: MOV AL , SI SUB AL , 30H MOV SI ,AL INC SI LOOP NEXT1 RETCHANGE ENDP3. 加法。可以利用带进位的加法A

3、DC按位相加,再进行十进制调整。注意从最低位开始加起。在主程序中让SI间指被加数,DI间指加数。子程序如下:ADDC PROC CLC ;清进位位 MOV CX, 5 ;设置循环次数 P1: MOV AL, SI ADC AL, DI AAA MOV SI,AL ;保存结果 INC SI INC DI LOOP P1 RETADDC ENDP4. 显示结果。结果在内存中是以BCD码的形式存放,在显示之前需要先转换成ASCII码,直接加上30H就可以,和显示加数一样,还是单个字符显示。注意先显示最高位.子程序如下:RESULT PROC MOV CX,5 LEA SI, data1+4 P2:

4、MOV BL, SI ADD BL, 30H MOV DL, BL MOV AH, 02H INT 21H DEC SI LOOP P2 RETRESULT ENDP5. 主程序。在主程序中要定义数据段用以存放加数和结果;完成程序的初始化;调用各个子程序;等等。主程序如下:DATA SEGMENTSTR1 DB 0DH,0AH,$ ;回车换行data1 DB 32H,34H,35H,36H,38H ;被加数86542data2 DB 35H,38H,34H,32H,31H ;加数12485code SEGMENT ASSUME CS: CODE,DS:DATAstart: MOV AX, DA

5、TA ;置缓冲区地址于DS:DX MOV DS, AX LEA SI, data1+4 ;从最高位开始显示 CALL DISPLAY ;显示被加数 MOV DL ,+ ;显示“”号 MOV AH ,02H INT 21H LEA SI, data2+4 ;显示加数 CALL DISPLAY MOV DL ,= ;显示“”号 MOV AH ,02H INT 21HLEA SI , data1 ;取被加数首址于SI中 CALL CHANGE ;被加数转换为BCD码 LEA SI , data2 ;取加数首址于SI中 CALL CHANGE ;加数转换为BCD码 LEA DX, STR1 ;回车换行

6、 MOV AH, 09H INT 21H LEA SI, data1 ;取被加数 LEA DI,data2 ;取加数 CALL ADDC ;加 CALL RESULT ;结果的转换和显示 MOV AH, 4CH ;返回DOS INT 21H ;各个子程序code ENDS END start ;程序结束上述程序只能实现对内存中的两个数的加法,可以修改一下,实现计算从键盘上输入两个数,求它们的和。DATA SEGMENTSTR1 DB PLEASE INPUT THE FIRST ADDER,0DH,0AH, $STR2 DB PLEASE INPUT THE SECOND ADDER,0DH,

7、0AH,$data1 DB 10,10 DUP(?)data2 DB 10,10 DUP(?)code SEGMENT ASSUME CS: CODE,DS:DATAstart: MOV AX, DATA ;置缓冲区地址于DS:DX MOV DS, AX LEA DX, STR1 MOV AH, 09H;显示PLEASE INPUT THE FIRST ADDER INT 21H LEA DX , data1 MOV AH , 0AH INT 21H ;输入被加数 MOV CH , 0 二3求某个数据区内负数的个数 设数据区的第一单元存放区内数据的个数,从第二单元开始存放数据,在区内最后一个单

8、元存放结果。为统计数据区内负数的个数,需要逐个判断区内的每一个数据,然后将所有数据中凡是符号位为 1 的数据的个数累加起来,即得区内所包含负数的个数。DATA SEGMENT SHU DB 88H,12H,82H,90H,22H,23HNUM EQU 6DATA ENDSSTACK SEGMENT PARA STACK STACK DB 100 DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN:MOV AX,DATA MOV DS,AX MOV DI,OFFSET SHU MOV CL,NUM MOV CH,0 MOV BL,0LOOP1:MOV DL,DI AND DL,80H JZ GO INC BL GO:INC DI DEC CX JNZ LOOP1 MOV AX,4C00H INT 21H CODE ENDS END MAIN如何判断是负数我用了AND DL,80H和JZ,也就是判断最高位是否为1。调试过程如下:因为我已经在程序中用SHU DB 88H,12H,82H,90H,22H,23H输入了6个数以供判断,而且已经设定NUM EQU 6,即循环次数为6,就是判断6个数,所以只要一直执行就可以了:将数据段初始化之后,可以看到我输入的6个数:

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

当前位置:首页 > 生活休闲 > 社会民生

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