北邮微原软件实验报告.doc

上传人:仙人指路1688 文档编号:2884716 上传时间:2023-03-01 格式:DOC 页数:26 大小:361KB
返回 下载 相关 举报
北邮微原软件实验报告.doc_第1页
第1页 / 共26页
北邮微原软件实验报告.doc_第2页
第2页 / 共26页
北邮微原软件实验报告.doc_第3页
第3页 / 共26页
北邮微原软件实验报告.doc_第4页
第4页 / 共26页
北邮微原软件实验报告.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《北邮微原软件实验报告.doc》由会员分享,可在线阅读,更多相关《北邮微原软件实验报告.doc(26页珍藏版)》请在三一办公上搜索。

1、2013年微机原理软件实验报告 学 院:信息与通信工程学院班 级:2011211104姓 名: 实验二 分支,循环程序设计一.实验目的: 1.开始独立进行汇编语言程序设计; 2.掌握基本分支,循环程序设计;3.掌握最简单的 DOS 功能调用二.实验内容: 1.安排一个数据区,内存有若干个正数,负数和零.每类数的个 数都不超过 9. 2.编写一个程序统计数据区中正数,负数和零的个数.3. 将统计结果在屏幕上显示.三.预习题 1.十进制数 0 - 9 所对应的 ASCII 码是什么? 如何将十进制数 0 - 9 在屏幕上显示出来? 0-9的ACSII码为,30h,31h,32h,34h,35h,3

2、6h,37h,38h,39h, 将要显示的数加上30h,得到该数的ACSII码,再利用DOS功能调用显示单个字符 2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法? 利用cmp指令,利用TEST指令,将该数与0相与,将该数与0相减,观察标志位。四程序流程图是 开始初始化,将DATA赋给DSSI指向带处理数据,CX存入数据个数判断SI是否大于等于0否MINUS(存小于0个数)加一是判断是否等于0ZERO(存等于0个数)加一PLUS(存等于0个数)加一 SI加一 CX减一 CX=0? 显示结果返回,结束否 是否五.源程序 DATA SEGMENT ;数据段 NUM DB 1,2,-2

3、,3,-3,5,2,4,-6,-11,100,0,0,34,-55,-33,0 ;待处理数据 COUNT EQU $-NUM ;数据个数 MINUS DB 0 ;小于零的个数 ZERO DB 0 ;等于零的个数 PLUS DB 0 ;大于零的个数 RESULT DB NEGNUM=,?,0AH,0DH,ZERONUM=,?,0AH,0DH,POSNUM=,?,0AH,0DH,$ ;结果显示字符串 DATA ENDS STACK SEGMENT STACK STACK ;堆栈段 DW 50 DUP(?) STACK ENDS CODE SEGMENT ;代码段 ASSUME CS:CODE,DS

4、:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV CX,COUNT MOV SI,OFFSET NUM AGAIN: MOV AL,SI ;循环比较 CMP AL,0 JGE NEXT1 INC MINUS JMP DONE NEXT1: JZ NEXT2 INC PLUS JMP DONE NEXT2: INC ZERO DONE: INC SI LOOP AGAIN ;返回结果 MOV DI,OFFSET RESULT MOV AL,MINUS ADD AL,30H MOV BYTE PTRDI+7,AL MOV AL,ZERO ADD AL,

5、30H MOV BYTE PTRDI+18,AL MOV AL,PLUS ADD AL,30H MOV BYTE PTRDI+28,AL MOV AH,09H MOV DX,DI INT 21H MOV AX,4C00H INT 21H CODE ENDS END START 五.程序运行结果正确输出了正数,负数,零的个数七.实验心得与体会 这次实验练习了用跳转语句实现分支结构,使我更加熟悉了跳转语句在分支结构中的应用,练习了用DOS功能调用输出字符串。将课堂的理论应用于实践,体会到了汇编语言编程的特点和魅力。 实验三 代码转换程序设计一.实验目的: 1.掌握几种最基本的代码转换方法; 2.运

6、用子程序进行程序设计.二.实验内容: 1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来. 2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明. 3.对输入要有检错措施,以防止非法字符输入,并有适当的提示. 4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.三预习题 1如何将输入的两个字符(0 - 9)变为十进制或二进制数? 将输入的字符减去30H,可得到对应十进制数,将第一个数乘10,加上第二个数,即为最后结果 2如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示? 说明:输入的字符以空格间隔,以回车结束,且仅允许输

7、入两位十进制数,输入其他字符,或者输入多位,都会报错 将输入的字符串先转化成数串,选出其中的最小值,转化为对应十位和个位,分别加上30H,输出显示 3你觉得采用二进制运算还是十进制运算更适合于这个实验? 十进制四程序流程图 开始初始化,DATA赋给DS利用0AH号DOS功能调用,输入数据将字符串长度存入CX判断字符是否为空格或回车判断是否为09否是判断为十位还是个位,分别存入AH,AL是判断空格或回车前输入的书否为两位数调用TRANSFER子程序DI加一SI加一CX-1CX=0?否否是调用FINMIN,SHOWMIN子程序,显示结果结束显示输入错误 是否五模块层次图 主程序TRANSFER子程

8、序FINDMIN子程序SHOWMIN子程序 六.源程序 DATA SEGMENT;数据段 BUFFER DB 100 ;存放带输入的数据 DB 0 DB 100 DUP(0) NUM DB 100 DUP(0) ;存放将输入的数据转化为对应的数 MIN DB 100 ;存放最小数 RESULT DB 0AH,0DH,MINNUM=,?,?,0AH,0DH,$;显示结果 ERRMSG DB 0AH,0DH,INPUT ERROR,0AH,0DH,$;显示错误信息 DATA ENDS STACK SEGMENT STACK STACK;堆栈段 DW 50 DUP(?) STACK ENDS COD

9、E SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA,SS:STACK ;将两位十进制字符转化为对应数的子程序 ;入口参数:AX,AH存放十位的ACSII码,AL存放个位的ACSII ;出口参数:AL,存放转化后的数值 TRANSFER PROC NEAR PUSHF PUSH CX SUB AH,30H SUB AL,30H SHL AH,1 MOV CH,AH MOV CL,2 SHL AH,CL ADD AH,CH ADD AL,AH MOV AH,0 POP CX POPF RET TRANSFER ENDP ;找最小数的子程序 ;入口参数:DI,指向带比较数的最

10、后一个数的下一位 ;出口参数:MIN,得到最小数 FINDMIN PROC NEAR PUSHF PUSH AX LOOP1: DEC DI MOV AL,NUMDI CMP AL,MIN JAE NEXT MOV MIN,AL NEXT: CMP DI,0 JZ DONE JMP LOOP1 DONE: POP AX POPF RET FINDMIN ENDP ;显示最小数的子程序 SHOWMIN PROC NEAR PUSHF PUSH AX PUSH BX MOV AL,MIN MOV AH,0 MOV BL,10 DIV BL ADD AH,30H MOV RESULT10,AH AD

11、D AL,30H MOV RESULT9,AL MOV AH,09H MOV DX,OFFSET RESULT INT 21H POP BX POP AX POPF RET SHOWMIN ENDP START: MOV AX,DATA ;程序开始 MOV DS,AX MOV DX,OFFSET BUFFER MOV AH,0AH INT 21H MOV AX,0 MOV BX,0 MOV DI,0 MOV SI,1 MOV CL,BYTE PTR BUFFERSI MOV CH,0 INC CX INC SI AGAIN: CMP BYTE PTR BUFFERSI,20H ;处理输入的字符

12、串 JZ NEXT1 CMP BYTE PTR BUFFERSI,0DH JZ NEXT1 CMP BYTE PTR BUFFERSI,30H JB ERRSHOW CMP BYTE PTR BUFFERSI,39H JA ERRSHOW INC BL CMP BL,2 JZ SEC MOV AH,BYTE PTR BUFFERSI JMP NEXT2 SEC: MOV AL,BYTE PTR BUFFERSI JMP NEXT2 NEXT1: CMP BL,0 JZ NEXT2 CMP BL,2 JNZ ERRSHOW MOV BL,0 CALL TRANSFER ;将字符转化为数,并存入N

13、UM MOV NUMDI,AL INC DI NEXT2: INC SI LOOP AGAIN CALL FINDMIN CALL SHOWMIN JMP EXIT ERRSHOW:MOV DX,OFFSET ERRMSG MOV AH,09H INT 21H EXIT: MOV AX,4C00H INT 21H CODE ENDS END START 七.程序运行结果八.实验心得与体会 这次实验相较实验二增加了很大的难度,在ASCII码和数值之间的转化部分,花了我不少的时间来编写,也花了不少时间调试,最后能成功,觉得很有成就感,也觉得自己编程更加熟练了,也了解了几个汇编错误码的含义。 练习了

14、子程序的使用,0AH号DOS功能调用等。体会到了汇编语言粒度很难小的特点,所以实现起来比较麻烦,但也不失乐趣。实验四 子程序设计 一.实验目的: 1.进一步掌握子程序设计方法; 2.进一步掌握基本的 DOS 功能调用.二.实验内容: 1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入. 2.统计检查每个学生的名次. 3.将统计结果在屏幕上显示. 4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可 能考虑美观. 5.输入要有检错手段.三.预习题1.如何确定一个学生在这门科目中的名次?对学生的成绩进行排序,并记录对应的学号,最后得到由低到高的成绩序列

15、及对应的学号,即得到学生的排名2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单? 我认为应该采用选择排序,每次选出最高的分数,并记录学号,输出学号和分数。而后,将该同学的分数置0,再重复以上操作,直到输出所有学生的学号和成绩四程序流程图 开始初始化,DATA赋给DS利用0AH号DOS功能调用,输入成绩将字符串长度存入CX判断字符是否为空格或回车判断是否为09否是判断为百位,十位,个位分别存入BH,AH,AL是判断空格或回车前输入的书3位以内的数调用TRANSFER子程序DI加一SI加一CX-1CX=0?否否是调用SORT子程序SHOWRESULT子程序,显示结果结束显示输入错

16、误 是 五模块层次: 主程序TRANSFER子程序SORT子程序SHOWRESULT子程序SHOWNUM子程序TRANSNUM子程序六源程序 DATA SEGMENT ;数据段 BUFFER DB 200 ;存放输入的成绩 DB 0 DB 200 DUP(0) NUM DB 200 DUP(0) ;存放输入字符转化后的成绩数值 MAX DB 0 ;存放排序每次最高的成绩 MAXNUM DW -1 ;存放每次最高成绩的学生的学号 RESULT DB 0AH,0DH, R N G,0AH,0DH, ;显示结果 DB 200 DUP(10 DUP(0),0AH,0DH) ERRMSG DB 0AH,

17、0DH,INPUT ERROR,0AH,0DH,$;错误信息 DATA ENDS STACK SEGMENT STACK STACK ;堆栈段 DW 50 DUP(?) STACK ENDS CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA,SS:STACK ;将字符转化为对应数值的子程序 ;入口参数:BH,AX,分别存放百,十,个位 ;出口参数:AL,转化后的分数值 TRANSFER PROC NEAR PUSHF PUSH CX SUB BH,30H CMP BH,0 JNZ GOOD SUB AH,30H SUB AL,30H SHL AH,1 MOV C

18、H,AH MOV CL,2 SHL AH,CL ADD AH,CH ADD AL,AH JMP EXIT1 GOOD: MOV AL,100 EXIT1: MOV AH,0 POP CX POPF RET TRANSFER ENDP ;选择排序子程序 ;入口参数:DI,指向带排序数组的最后一个数的下一位 ;出口参数:显示成绩单 SORT PROC NEAR PUSHF PUSH AX PUSH BX PUSH CX PUSH DX MOV DX,0 MOV SI,13 MOV CX,DI MOV BX,DI LOOP2: MOV DI,BX LOOP1: DEC DI MOV AL,BYTE

19、PTR NUMDI CMP AL,MAX JBE NEXT MOV MAX,AL MOV MAXNUM,DI INC MAXNUM NEXT: CMP DI,0 JZ DONE JMP LOOP1 DONE: MOV DI,MAXNUM MOV BYTE PTR NUMDI-1,0 INC DX CALL SHOWNUM MOV MAX,0 MOV MAXNUM,-1 LOOP LOOP2 EXIT2: POP DX POP CX POP BX POP AX POPF RET SORT ENDP ;将数值转化为对应的ASCII码,存入RESULT待显示 TRANSNUM PROC NEAR P

20、USHF PUSH BX MOV BL,10 DIV BL ADD AL,30H MOV BYTE PTR RESULTSI, INC SI MOV RESULTSI,AL INC SI ADD AH,30H MOV RESULTSI,AH INC SI POP BX POPF RET TRANSNUM ENDP ;显示排名,学号,成绩 ;入口参数:DX,DI,MAX,分别表示排名、成绩和学号 ;出口参数:RESULT,显示结果 SHOWNUM PROC NEAR PUSHF PUSH AX MOV AX,DX CALL TRANSNUM MOV AX,DI CALL TRANSNUM CMP

21、 MAX,100 JZ GREAT MOV BYTE PTR RESULTSI, INC SI MOV AL,MAX MOV AH,0 CALL TRANSNUM JMP EXIT3 GREAT: MOV BYTE PTR RESULTSI,31H INC SI MOV BYTE PTR RESULTSI,30H INC SI MOV BYTE PTR RESULTSI,30H INC SI EXIT3: ADD SI,2 POP AX POPF RET SHOWNUM ENDP ;将结果RESULT显示出来 SHOWRESULT PROC NEAR PUSHF PUSH AX PUSH DX

22、 MOV BYTE PTR RESULTSI,0AH INC SI MOV BYTE PTR RESULTSI,0DH INC SI MOV BYTE PTR RESULTSI,$ MOV DX,OFFSET RESULT MOV AH,09H INT 21H POP DX POP AX POPF RET SHOWRESULT ENDP START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUFFER MOV AH,0AH INT 21H MOV AX,3030H MOV BX,3000H MOV DI,0 MOV SI,1 MOV CL,BYTE PTR B

23、UFFERSI MOV CH,0 INC CX INC SI AGAIN: CMP BYTE PTR BUFFERSI,20H JZ NEXT1 CMP BYTE PTR BUFFERSI,0DH JZ NEXT1 CMP BYTE PTR BUFFERSI,30H JB ERRSHOW CMP BYTE PTR BUFFERSI,39H JA ERRSHOW INC BL CMP BL,3 JZ THIRD CMP BL,2 JZ SEC MOV AL,BYTE PTR BUFFERSI JMP NEXT2 THIRD: MOV BH,AH MOV AH,AL MOV AL,BYTE PTR

24、 BUFFERSI JMP NEXT2 SEC: MOV AH,AL MOV AL,BYTE PTR BUFFERSI JMP NEXT2 NEXT1: CMP BL,0 JZ NEXT2 CMP BL,3 JA ERRSHOW CALL TRANSFER MOV NUMDI,AL MOV BX,3000H MOV AX,3030H INC DI NEXT2: INC SI LOOP AGAIN CALL SORT CALL SHOWRESULT JMP EXIT ERRSHOW:MOV DX,OFFSET ERRMSG MOV AH,09H INT 21H EXIT: MOV AX,4C00

25、H INT 21H CODE ENDS END START 七程序运行结果 八.实验心得与体会 这次实验和实验三比较类似,但又比实验三难了不少,主要是因为增加了排序的部分,在对成绩排序的同时还要保存相应的学号,增加了代码的复杂度。 但经过努力的思考和尝试,最终我还是完成了这个程序,也使得我对子程序的应用更加熟练,进一步提高了我的编程能力。 实验五 中断程序设计一.实验目的: 1.初步掌握中断程序的设计方法: 2.初步掌握修改 DOS 系统中断,以适应实际使用的方法.二.实验内容: 1.编写一个 32 位二进制数除以 16 位二进制数的除法程序.观察当除数为 0,或 超过相应寄存器范围时,程序执

26、行的结果. 2.修改零号中断服务程序,使它具有以下功能: (1)判断除数是否为 0,当除数为 0 时,显示相应的结果; (2)当除数不为 0 时,采用适当的方法完成商超过 16 位的二进制数的除法运算. 3.注意必须保护原有中断服务程序的入口地址,并在程序完毕前加以恢复.三.预习题1. 如何保护原有中断向量表中的中断服务程序的入口地址?先读取中断向量表中0号中断的地址,压入堆栈,程序结束时弹出堆栈,写回中断向量表即可。2. 如何将你的中断服务程序入口地址置入中断向量表?有两种基本方法:一是直接写入法,使用指令将中断服务程序入口地址的IP写入n4的RAM位置,中断服务程序入口的CS写入n4+2的

27、位置;二是DOS功能调用,25H用来写中断向量表,35H读中断向量表。 开始获取原始的0号中断程序地址,压入堆栈保护将新编写的0号中断程序地址存入0000H:0000H进行32位除16位的除法,商溢出,进入0号中断判断除数是否为0是除数乘8,后进行除法,最后商进行移位乘8操作,移出的高位在RESULT2中否输出错误信息DIVIDE 0中断返回,回复原始中断服务程序地址 结束四程序流程图五源程序 DATA SEGMENT NUM1 DD 65536 NUM2 DW 1 RESULT2 DW 0 RESULT DW 0 REMAIN DW 0 SHOWREU DB 0AH,0DH,32 DUP(0

28、),0AH,0DH,$ SHOWREM DB 0AH,0DH,16 DUP(0),0AH,0DH,$ ERRMSG DB 0AH,0DH,DIVIDE 0,0AH,0DH,$ DATA ENDS STACK SEGMENT STACK STACK DW 50 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK ;进行二进制结果显示的函数 SHOWNUM PROC FAR PUSHF CLC MOV CX,16 MOV AX,RESULT2 MOV SI,2 LOOP1:SHL AX,1 JC ONE1 MOV BYTE

29、PTR SHOWREUSI,0 JMP NEXT1 ONE1: MOV BYTE PTR SHOWREUSI,1 NEXT1: INC SI LOOP LOOP1 MOV CX,16 MOV AX,RESULT LOOP2:SHL AX,1 JC ONE2 MOV BYTE PTR SHOWREUSI,0 JMP NEXT2 ONE2: MOV BYTE PTR SHOWREUSI,1 NEXT2: INC SI LOOP LOOP2 MOV AX,DATA MOV DS,AX MOV DX,OFFSET SHOWREU MOV AH,09H INT 21H MOV CX,16 MOV AX,REMAIN MOV SI,2 LOOP3:SHL AX,1 JC ONE3 MOV BYTE PTR SHOWREMSI,0 JMP NEXT3 ONE3: MOV BYTE PTR SHOWREMSI,1 NEXT3: INC SI LOOP LOOP3 MOV AX,DATA

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号