微机原理软件实验报告(编辑修改稿)内容摘要:

2: CMP AL,20H。 当前已经输入了一位,如果再输入空格,则出错 JZ CUOWU2 JMP GETLOOP3: CMP AL,20H JNE CUOWU4。 如果当前已经输入了两位数,却没有输入空格,则出错 XOR CX,CX。 如果当前已经输入了两位数并输入了空格,则将CX清 JMP NEXT。 进入下一次读取键盘操作GET: SUB AL,30H。 将读入的字符减去30H JL CUOWU1。 比较输入的数是否超出界限 CMP AL,9 JG CUOWU1 MOV NUM[DI],AL INC COUNT INC CX INC DI JMP NEXTCUOWU1: MOV SIG,1 MOV DX,OFFSET ERROR1 CALL SHOW JMP RETURNCUOWU2: MOV SIG,1 MOV DX,OFFSET ERROR2 CALL SHOW JMP RETURNCUOWU3: MOV SIG,1 MOV DX,OFFSET ERROR3 CALL SHOW JMP RETURNCUOWU4: MOV SIG,1 MOV DX,OFFSET ERROR4 CALL SHOW JMP RETURNEXIT: MOV BL,COUNT CMP BL,0 JZ CUOWU3。 如果输入的数字个数为0,则是第三种错误 AND BL,01H。 输入的数字是否是两位数 CMP BL,0 JNZ CUOWU2。 输入的数字不是两位的时候,是第二种错误RETURN: POP DI POP DX POP CX POP BX POP AX RETGETNUM ENDP。 寻找最小数的子程序FINDMIN PROC PUSH DI PUSH AX PUSH CX MOV DI,2 MOV CL,COUNT MOV AL,CL CBW MOV CX,AXLOOPA: ADD DI,2 CMP CX,DI JZ JIESHU MOV AH,NUM[DI] MOV AL,NUM[DI+1] CMP AH,MIN。 如果十位数比临时的最小数的高位大不改变min JA LOOPA JZ HIGH1。 如果十位数相等则进入个位数比较BIANHUA:MOV MIN,AH。 改变最小数 MOV MIN[1],AL JMP LOOPA。 继续比较下一个数HIGH1: CMP AL,MIN[1] JNB LOOPA。 比较个位数 JMP BIANHUAJIESHU: POP CX POP AX POP DI RETFINDMIN ENDPCODE ENDS END MAIN用了子程序调用的方法,大大缩短了代码的长度和复用度,写了四个PROC,主过程,显示字符串的子程序,从键盘获取输入的子程序和求最小数的子程序。 规定了每个两位数之间用空格隔开,结束符定位空格键,规定了四种错误:(1)输入数字无效,即输入的一位数字比0小,或者比9大。 (2)输入的数字不是两位的,即输入一位数之后就输入空格键了。 (3)输入的数字为空,即直接按下了空格键。 (4)两个两位数之间没有用空格隔开。 本程序比较数字大小是直接用ASCII码比较的,先将输入的减去30H,再两位分开比较,先比较十位,如果当前数字的十位ASCII比当前最小数大,则比较下一个两位数。 如果小于,则用该两位数代替当前的最小数。 如果等于,则继续比较各位的ASCII码的大小。 出现错误的时候调用SHOW子程序,提示输入的错误类型。 正确输入的时候,输出了最小数为014:一下是四种输入错误的截图:六、实验总结 通过本次实验,我掌握了ASCII码和十进制数之间的转换;熟悉了子程序的编写及调用。 子程序大大缩短了代码的长度和冗余度,不仅更加美观,也使逻辑更加清晰。 同时输入检错这一部分让我感受到了逻辑思考严密的重要性,一不小心就会出错,做实验严谨的态度显得非常重要。 再者就是理解键盘输入进的是ASCII码,而比较的时候可以分成十位,个位分别比较,需要先减去30H。 而输出的时候需要再把30H加上,分十位和个位输出才是对的。 硬件编程和软件编程的差别在本次实验里更加体现出来了,如果光用软件编程的思想去控制硬件编程会出现很多奇怪的错误。 像开始的时候,我就没有想到在硬件程序里比较两个数可以十位个位分开比较,而是把ASCII转换成十进制比较,再转回来输出,这样很麻烦,而且容易出错。 所以联系硬件实际情况和计算器内部运行原理来想编程的思路,才是硬件编程正确的方向。 实验四 子程序设计:。 DOS 功能调用.: . . .,输入学生数目不宜太多,. .: ?答:有如下两种思路:(1)抽取每个学生的成绩和其他所有学生的成绩进行比较,然后统计比其分数高的学生,得出该学生的名次;(2)冒泡法,将学生根据输入的成绩进行一次排序,成绩高的交换到前面,成绩低的交换到后面,此时学生的次序即为学生的名次。 ,采用什么方法进行比较以得到学生的名次最为简单?答:冒泡法。 每次比较相邻的两个数据,大的放在前面,这样一轮以后,最小值就移到了数据表的末尾,再次冒泡以此类推。 其实这里的“冒泡排序”是倒着的冒泡排序,因为结果是将最高分排到了开头但是基本思想是一致的。 . . 答:名次 学号 成绩四、程序设计流程图五、程序源代码及解释PRINT MACRO X。 打印字符的宏 PUSH DX MOV DL,X MOV AH,2 INT 21H POP DXENDM。 回车空格子程序ENTER MACRO MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21HENDMDATA SEGMENTBUFFER DB 100 DB ? DB 100 DUP (?)STR1 DB 39。 Please input the score of the students:39。 ,0DH,0AH,39。 $39。 STR2 DB 39。 Error,please input the score again:39。 ,0DH,0AH,39。 $39。 VAR1 DW ?VAR2 DW ? CK DB ? TAB DB 100 DUP(?)DATA ENDSSTACK SEGMENT STACK 39。 stack39。 DB 100 DUP (39。 ?39。 )STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTA PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,09H。 显示字符串,输出提示输入 INT 21HINPUT:LEA DX,BUFFER。 10号功能调用,输入字符串 MOV AH,0AH INT 21H LEA DI,TAB XOR CX,CX MOV AH,30H。 赋学号第一位的AscII码 MOV DH,31H LEA BX,BUFFER+2 CALL CHECK CMP CK,1。 若CK=1,则数据不合格 JZ INPUT CALL SORT ENTER CALL DISPY RETSTA ENDP。 检验输入是否合法的子程序CHECK PROCNEXT1: MOV CK,0 MOV [DI],AH。 将学号第一位的AscII码存入指定内存区域 INC DI MOV [DI],DH。 将学号第二位的AscII码存入指定。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。