实验四子程序设计

上传人:xian****hua 文档编号:142336086 上传时间:2022-08-24 格式:DOCX 页数:11 大小:82.11KB
返回 下载 相关 举报
实验四子程序设计_第1页
第1页 / 共11页
实验四子程序设计_第2页
第2页 / 共11页
实验四子程序设计_第3页
第3页 / 共11页
点击查看更多>>
资源描述
实验四 子程序设计一.实验目的: 1.进一步掌握子程序设计方法; 2.进一步掌握基本的 DOS 功能调用.二.实验内容: 1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入. 2.统计检查每个学生的名次. 3.将统计结果在屏幕上显示. 4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可 能考虑美观. 5.输入要有检错手段.三、创新功能:1、监测不合法输入,当输入字符不为数字时,报错Input illegal!。且允许用户从将当前错误数据重新输入,不必整体重新输入。2、根据实际情况按百分制换算,当输入为3位数时自动结束读取,且最高分可限定为100分,例如输入999,排名时按照100分计算。3、允许相同成绩的同学存在,不会影响排名。4、允许输入的学生数任意,只要不超过堆栈空间均可。5、输入输出界面友好,用户可以直观地看到名次表,对应学生学号和成绩。6、利用堆栈空间,存储结构优越7、程序采用模块化设计,将实现相同功能的代码聚为宏块或子函数四.预习题: 1.如何确定一个学生在这门科目中的名次?答:对成绩降序排序,同时记录学号 2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:每次查找出当前最小成绩和其所对应学号入栈,这样形成的栈栈顶为最高分,弹栈时可依次降序输出成绩和对应学号,即为名次表。 3.准备好模块层次图.答:见下面流程图 4.给出输出显示的形式. 按顺序输入12个学生成绩:100、67、88、89、93、50、6、21、77、77、56、95,按ctrl+z 输入结束 运行结果为:五、代码分析CHG MACRO X;将数字转换成ASCII码的宏块PUSH AXPUSH BXMOV AX,XMOV BL,10DIV BLADD AL,0ADD AH,0MOV BH,ALMOV BL,AHMOV X,BXPOP BXPOP AXENDMPRESENT MACRO X;显示单个字符的宏块 MOV AH,02H MOV DL,X INT 21H ENDMSTR MACRO STRING;显示字符串宏块 MOV AH,09H MOV DX,SEG STRING MOV DS,DX LEA DX,STRING INT 21HENDMINPUT MACRO;输入单个字符宏块 MOV AH,01H INT 21H ENDMDATA SEGMENTBUFF DB 100 DUP(0);存入输入数据STRING1 DB 0DH,Input illegal!,$STRING2 DB score of stu ,$STRING3 DB 100,$STRING4 DB NO.,$STRING5 DB The final rank is:,$STRING6 DB STU:,$STRING7 DB SCORE:,$NUM DW 1;存入学生人数NUM2 DW 1P DW 1COUNT DB 0;计数成绩位数COUNT1 DW 1DATA ENDSSTACK SEGMENT STACK DB 300 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACKSTART: MOV DX,SEG DATA MOV DS,DXLEA SI,BUFF;输入模块LOOP1: MOV BH,0MOV BL,0STR STRING2MOV CX,NUM;移入CX进行转换显示CHG CX;将当前学号变为ASCIIPRESENT CHPRESENT CLPRESENT :L3:INPUTCMP AL,26;输入是否结束JZ EXICMP AL,0DHJNZ L1L2:INC NUM;输入结束CMP COUNT,1JZ Y1MOV SI,BH;存成绩!MOV SI+1,BLJMP Y2Y1:MOV BYTE PTR SI,0;当输入为一位数时,高位写0MOV SI+1,BHY2:INC SIINC SIMOV COUNT,0;计数变量清零PRESENT 0DHPRESENT 0AHJMP LOOP1L1:CALL JUDGECMP DL,0JNZ LOOP1;不合法重新输入INC COUNT;合法代表已经输入了一位数CMP COUNT,1JNZ CNT2MOV BH,AL;输入第一位数JMP L3CNT2: CMP COUNT,2;输入第二位数JNZ CNT3MOV BL,ALJMP L3CNT3: MOV BH,40HMOV BL,40HJMP L2;输入三位数代表当前输入结束;排序模块EXI: DEC NUMMOV AX,NUMMOV NUM2,AX;存起来NUM输入的个数LEA SI,BUFFMOV BH,40H;最小数MOV BL,40HMOV DX,NUM;待比较的数的个数LOOP2:CMP NUM,0JZ WALILOOP3:MOV CL,SI;当前待比较单元送人SICMP CL,!;是否为空单元JZ PLUSS;是则判断下一个CMP CL,BH;判断高位JA PLUSS;大于最小数,跳转判断下一个JB IMOV CL,SI+1;判断低位CMP CL,BLJA PLUSS;大于最小数,跳转判断下一个I:MOV BH,SI;更新最小值MOV BL,SI+1MOV DI,SI;存最小值的指针PLUSS:INC SI;判断下一个数INC SIDEC DX;还剩DX个数需要比较CMP DX,0JNZ LOOP3PUSH BX;跳出循环一轮比较完毕LEA SI,BUFF;SI重新指向待比较的数组首位PUSH CXMOV CX,DISUB DI,SI;记录最小值是第几个学生MOV AX,DI;存下二者差值MOV BL,2DIV BL;得到实际的学号偏移MOV DI,CXPOP CXMOV P,AXINC PCHG P;将学号转换为ASCII码入栈PUSH P;学号入栈MOV BYTE PTR DI,!;入栈后相应位置置入特殊符号,下次读取到此符号可不进行判断MOV BYTE PTR DI+1,!DEC NUM;待入栈的变量-1MOV DX,NUM2MOV BH,40H;保证每次寻找最小值前BH、BL中内容为最大值MOV BL,40HJMP LOOP2 ;显示模块WALI:PRESENT 0DHSTR STRING5PRESENT 0DHPRESENT 0AHAGAIN:MOV CX,NUM2CMP CX,0;是否栈空JNZ GOONENDD:MOV AX,4C00H INT 21HGOON:STR STRING4MOV CX,COUNT1CHG CXPRESENT CHPRESENT CLPRESENT :POP CX;学号弹栈STR STRING6PRESENT CH;输出学号PRESENT CLPRESENT 20HSTR STRING6POP CX;成绩弹栈STR STRING7CMP CH,40H;是否是满分JZ NEAR PTR FULPRESENT CH;非满分显示分数的高低位PRESENT CLLINE:PRESENT 0DHPRESENT 0AHDEC NUM2INC COUNT1JMP AGAINFUL:PRESENT 1;满分直接显示100PRESENT 0PRESENT 0JMP LINEJUDGE PROC;判断输入是否合法,合法则DL=0不合法修改DL=1且输出字符串提示MOV DL,0 CMP AL,0 JNB NEXT1W1:STR STRING1MOV DL,1JMP OVNEXT1: CMP AL,9 JA W1 OV:RETJUDGE ENDPCODE ENDSEND START六、流程图显示学号1、输入模块流程图:提示用户输入成绩是否SI=0SI+1=BH存入BUFF是否结束输入若count!=1否输入回车?输入结束是重新输入判断输入是否合法是判断当前输入数字位数countcount+1count=1count=3count=2BH=40H BL=40H存入BH存入BL2、排名模块流程图当前位置赋为无效,下次不会进行比较BH=最小值高位40HBL=最小值低位40H学号入栈否有成绩未入栈退出成绩入栈是学号=(DI-SI)/2SI指向BUFF首位num=学生人数DI=SISI=首地址 是num=0?否SIBH 且SI+1BL?是否更新最小值BH,BLSI=SI+2num=num-1 3、输出模块流程图:输出排名号学号弹栈全部成绩出栈?显示100显示寄存器中成绩满分?成绩弹栈显示学号七、程序设计思路与总结本实验主要联系了宏块和子程序调用,属于排序问题。在程序设计时,一个好的存储结构显得尤为重要。一开始我并未采取堆栈结构,而是在数据段开辟了两段内存空间,将输入的成绩段插入排序到另一个名次段,插入排序只需处理N(输入数)个元素,但带来了大量的内存移动,时间复杂度较高,如果名次段存的是ASCII码则移动一个数据元素需要相应移动4个数据单元,于是我改变了存储结构,利用堆栈的后进先出,将最小的元素依次入栈,这样输出时就会按照成绩由大到小输出。且压栈时先压成绩ASCII码再压学号ASCII码,这样输出部分设计就非常容易,只需每次弹栈16位显示就可以。输入字符的处理也是程序设计的一大难点,输入时要判断字符的合法性,如果键入的字符在3个之内(两个数据一个回车或者一个三位数)均合法才能认为是合法数据,否则提示用户重新输入,其次当输入三位数时,实际存储的是两位数40H,40H因为0-9的ASCII码范围为30-39H所以读到40H时自然认为是最大数,输出时只要判断是40H就显示字符串100。显示模块只要进行相应的弹栈以及显示字符串即可 。功能的聚类:由于实验中有些功能需要反复利用,所以将那部分功能写成了宏块或子函数。因为要显示的字符串不同,所以字符串的显示功能以及字符到ASCII的转换需要入口参数,因此选择了宏块设计。而判断字符合法性是通用的,每次字符都会存在AL中,只对AL进行判断即可,因此选择了子程序设计。实验中遇到的问题主要有跳转超出范围问题,可以通过添加中继节点解决;循环变量的修改问题,除法的扩展问题,以及寄存器的利用问题。由于程序变大导致通用寄存器不够用,有可能在调用宏块时修改了内部重要的值,因此在每次利用寄存器中转数据时可将其先入栈保存,之后接着弹栈,既不会影响寄存器内容,也不会影响堆栈。实验四的调试费了很大的功夫,在四个实验中属于最难的。由于单步调试没法调试输入,因此我将各个模块单拆出来调试,依次修改每个模块,再组合到一起实现了功能。再调试成功后我又进一步优化了用户界面,实现输入友好和显示友好,并有检错能力。通过本次试验我进一步认识了汇编程序的工作原理,这样有利于我对程序底层运行的理解,这样为今后编写高级语言打下了良好的基础。最后,感谢老师对我的指导与关心!
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑环境 > 建筑工程


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!