微机作业——“学生成绩统计“

微机作业——“学生成绩统计”

1. 题目

从键盘输入某计算机应用班35人的《计组》成绩(百分制),按成绩从高到低排序。并计算全班总成绩、平均成绩、统计低于平均成绩的学生人数,并将结果在屏幕上显示。

2. 实现功能

  1. 从键盘输入35个百分制成绩。成绩用压缩BCD码存储。应只接受合法数字输入。
  2. 从高到低排序
  3. 计算全班总成绩
  4. 计算全班平均成绩
  5. 统计低于平均成绩的学生人数
  6. 在屏幕上显示以上结果。结果用压缩BCD码表示。

3. 流程图及解题分析

3.1 主程序

  • 主程序:

    程序结构上可分为6部分,首先是主程序main,主程序调用5个实现不同功能的子程序。子程序可分为输入成绩功能的子程序,按成绩降序排序功能的子程序,统计成绩总和功能的子程序,统计平均分功能的子程序,统计低于平均分人数功能的子程序。

  • 流程图:

    在这里插入图片描述

3.2 Input子程序

  • Input子程序:

    Input子程序用于成绩的输入,以压缩BCD码的形式将成绩输入到score变量中进行储存,其中需要输入35名学生的成绩。

  • 流程图:

    在这里插入图片描述

3.3 Sort子程序

  • Sort子程序:

    输入的成绩保存到score变量之后,对score中保存的35名学生成绩进行降序排序,本次采用选择排序算法。

  • 流程图:

    在这里插入图片描述

3.4 Output子程序

  • Output子程序:

    将压缩的BCD码成绩输出到屏幕中,当输出完35名学生成绩后退出循环。

  • 流程图:

    在这里插入图片描述

3.5 Sum1子程序

  • Sum1子程序:

    Sum1子程序用于计算全班总成绩,对score变量中保存的成绩进行遍历,将35名学生成绩进行相加,求得的结果再通过调整加指令转换成压缩BCD码格式存储到sum变量中,因为35名学生成绩总和最大为3500,所以sum变量为字类型(dw),求得的总和sum再通过02功能号分别将sum千百十个位的输出到屏幕中。

  • 流程图:

    在这里插入图片描述

3.6 Average子程序

  • Average子程序:

    Average子程序用于统计全班平均成绩,将sum从压缩的BCD码格式转换成二进制形式,然后以sum作为被除数,35作为除数进行除法操作。

  • 压缩BCD码转换二进制:

    假设ax存的是sum压缩BCD码,A、A′分别表示AH高4位、AL高4位,B、B′分别表示AH的低4位、AL的低四位。可视为AX <==> ABA′B′(压缩BCD),下面公式中0ah为十进制的权值10。

    转换公式:

    ( ( A * 0ah + B) * 0ah + A′) * 0ah + B′

  • 流程图:

    在这里插入图片描述

3.7 Nopass子程序

  • NoPass子程序:

    NoPass子程序用于统计低于平均成绩的学生人数,对score变量中的成绩进行遍历,小于平均分的人数用count变量进行统计,最后将count转换成非压缩BCD格式分别用02号功能进行输出操作。

  • 流程图: 在这里插入图片描述

4. 汇编源码

stack segment stack
d1 dw 128 dup(?)
top equ length d1
stack endsdata segment
score db 35 dup(0);store 35 scores of stduents
slength db 23h;store 35 as length of stduents
CRLF db 0dh,0ah,'$';newline
print_menu db '********************STUDENT_SCORE_SYSTEM********************',0dh,0ah,'$'
print_end db '****************************END*****************************',0dh,0ah,'$'
input_stduent db 'Please input 35 students score:',0dh,0ah,0dh,0ah,'$'
print_student db 'Student$'
print_colons db ': $'
check db 'OK!',0dh,0ah,'$';check for input success
print_output db 'Here are your input(Descending Order):',0dh,0ah,'$'
printsum db '                 Sum of students scores: $'
printavg db '                 Average of total scores: $'
print_fails db '                 The count of no pass: $'
stu db 0;student[stu]:
temp db 0;temp in Procedure of Sort
sum dw 0;sum in Procedure of Sum1
avg dw 0;avg in Procedure of Average
count db 0;count of no pass (uncompressed BCD)
data endscode segment
assume cs:code, ds:data, ss:stack
main    proc farpush dsxor ax,axpush ax
start:mov ax,datamov ds,axmov ax,stackmov ss,axmov sp,topxor cx,cxmov cl,slength;将计数35次用于输入成绩次数lea si,score;将si取到保存成绩的偏移地址xor ax,ax;********************STUDENT_SCORE_SYSTEM********************lea dx,print_menu;字符串入口为dxmov ah,09h;9号功能输出字符串int 21h;软中断;please input 35 students score:lea dx,input_stduentmov ah,09hint 21h
aa1:   		;Studentlea dx,print_studentint 21h;[stu]inc stu;设置stu的目的:输出显示屏Student[stu]中的stu,用来计数 范围[1,35]push ax;入栈保护push bx;同上push cx;同上xor ax,axxor bx,bxmov al,stu;1---------------------------mov bl,0ah;2 这3行将stu从16进制转10进制div bl	  ;3---------------------------;---打印Student[]中的stu---mov bx,axmov ah,02hmov dl,bladd dl,30hint 21h	  mov dl,bhadd dl,30hint 21h;-------------------------pop cx;恢复现场pop bx;同上pop ax;同上;:lea dx,print_colonsint 21hcall far ptr Input		;tabpush dxmov dl,09h;09h对应的字符为tabpush axmov ah,02hint 21hpop axpop dxloop aa1;如果计数器CX为0,则退出循环,表示输入完35名学生成绩;-----输出显示屏OK----lea dx,checkmov ah,09hint 21h;--------------------call far ptr Sort;调用选择排序算法;newlinelea dx,CRLFmov ah,09hint 21h;Here are your input:lea dx,print_outputmov ah,09hint 21hcall far ptr Output;输出学生成绩子函数(排序后);newlinelea dx,CRLFmov ah,09hint 21hcall far ptr Sum1;统计成绩总和子函数;newlinelea dx,CRLFmov ah,09hint 21h;Average of total scores:lea dx,printavgint 21hcall far ptr Average;计算平均分子函数;newlinelea dx,CRLFmov ah,09hint 21h;The count of no pass:lea dx,print_failsint 21hcall far ptr NoPass;低于平均分人数统计子函数,将低于平均分结果以非压缩BCD码保存到变量count中;newlinelea dx,CRLFmov ah,09hint 21hint 21h;just for beauty;****************************END*****************************lea dx,print_endint 21hmov ah,4chint 21hret
main endp;procedure name:Input
;function:input 35 students'score
;entry:store BCD score by al
;exit:noneInput   proc farpush axpush bxpush cxmov ah,01hint 21hmov cl,04hshl al,clmov bh,alint 21hand al,0fhadd al,bhmov [si],alinc sipop cxpop bxpop axret
Input   endp;procedure name:Output
;function:output 35 students'score
;entry:none
;exit:
Output  proc farpush axpush bxpush cxxor cx,cxmov cl,slength;count 23h-->35dlea si,score;db
aa2:    mov al,[si]mov bl,al;copypush cxmov cl,04hshr al,clpop cxmov bh,30hadd al,bhmov dl,almov ah,02hint 21hand bl,0fhadd bl,30hmov dl,blint 21hinc simov dl,00hmov ah,02hint 21hint 21hloop aa2pop cxpop bxpop axret
Output  endpSort    proc farpush axpush bxpush dxxor cx,cxxor bx,bxxor dx,dxmov ax,0000hmov si,axxor ax,axmov cl,slengthdec clrotate2:mov dx,0000hmov al,[si]mov temp,al
rotate1:inc dlmov bx,dxmov bl,[si+bx]cmp al,bl;al >= bl, sort_nextjnc sort_next;;has carrymov al,blmov bl,tempmov temp,alpush axpush simov ax,siadd ax,dxmov si,axmov [si],blpop sipop ax
sort_next:cmp dl,cl;dl < slength, rotate1jnc for2;dl >= slength, outjmp rotate1
for2:push axpush bxmov ax,sipush silea si,scoremov bx,sipop sisub ax,bxpush cxmov cl,slengthdec cldec clcmp al,cl;i < slength - 0pop cxpop bxpop axmov dl,tempmov [si],dljnc lastinc sidec cxjmp rotate2	
last:pop dxpop bxpop axret
Sort    endp;caculate sum of score
;entry:score
;exit:none
Sum1    proc farpush axxor cx,cxxor ax,axxor bx,bxmov cl,slengthdec cl;34 add timelea ax,scoremov si,axmov al,[si]xor ah,ah
rotate3:inc simov bl,[si]add al,bldaaadc ah,00hloop rotate3mov temp,al;mov al,ahxor ah,ahmov bl,0ahdiv blpush cxmov cl,04hshl al,clpop cxadd ah,almov al,temp;newlinelea dx,CRLFpush axmov ah,09hint 21hpop axmov sum,axmov ah,09hmov dx,offset printsumint 21h;mov ah,02hmov ax,sumcmp ah,1;judge ah has carry?jnc ah_carry
sum_next:mov ax,summov cl,04hshr al,cladd al,30hmov dl,almov ah,02hint 21hmov ax,sumand al,0fhadd al,30hmov dl,almov ah,02hint 21hpop axret
ah_carry:mov dl,ahpush cxmov cl,04hshr dl,clpop cxadd dl,30hmov ah,02hint 21hmov ax,summov dl,ahand dl,0fhadd dl,30hmov ah,02hint 21hjmp sum_next
Sum1    endpAverage proc far
push axpush dxpush cxxor cx,cxmov ax,summov al,ahxor ah,ahmov bl,almov cl,04hshr al,cland bl,0fhmov dl,0ahmul dladd al,blmov bx,sumshr bl,clxor bh,bhmov dx,000ahmul dxadd ax,bxmov bx,sumxor bh,bhand bl,0fhmov dx,000ahmul dxadd ax,bxmov bx,0023hdiv bxaammov avg,ax; uncompressed BCDmov dl,ahadd dl,30hmov ah,02hint 21hmov ax,avgmov dl,almov ah,02hadd dl,30hint 21hpop cxpop dxpop axret		
Average endpNoPass proc farpush axpush dxxor cx,cxmov cl,slengthlea si,scoremov bx,avg;0605hpush cxmov cl,04hshl bh,cl;6005hadd bl,bh; bl= 65h compressionpop cx
rotate4:mov al,[si]cmp al,bl;score[i] < avg?jnc rotate5inc count
rotate5:inc siloop rotate4mov cl,04hxor ax,axmov al,count;15hmov bl,0ahdiv bl;0102hmov dl,almov bl,ah;temp storeadd dl,30hmov ah,02hint 21hmov dl,bladd dl,30hint 21hpop dxpop axret
NoPass endpcode ends
end start

5.运行效果

在这里插入图片描述

6.后续「debug神器」

在本次调试过程中,由于代码量过于庞大,debug工具调试不为方便,只能通过单步T命令进行调试,尤其是再调试排序子程序的时候,理论上需要单步调试接近n平方次数(DosBox环境调试选择排序算法),所以为了跳过与问题无相干的代码,我往常会缩小代码调试的范围,将认为与问题相关的程序代码单独放到另一个汇编文件里进行调试,从而减少调试的次数。而在这次调试排序子程序过程中,由于边界上的问题,排序中偏后的数据发生错误的顺序,这就意味着从进入该排序子程序开始,就要遍历将近n的平方次,即使将该子程序单独放到另一个文件中进行调试,也要进行这样的单步调试过程。为了快速的匹配到关键问题所在,我将代码移至到VScode编辑器中进行调试,VScode编辑器中配置插件masm/tasm,本质上也是启动DosBox,就可以利用Vscode的打断点方式,来快速匹配到错误的具体范围,创建监视点数据查看寄存器中数据的变化。

还需要改进的地方

  • 要求输入百分制成绩,目前只实现了[0,99]
  • 输入成绩的合法性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/48183.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CRNN论文翻译——中英文对照

文章作者&#xff1a;Tyan 博客&#xff1a;noahsnail.com | CSDN | 简书 声明&#xff1a;作者翻译论文仅为学习&#xff0c;如有侵权请联系作者删除博文&#xff0c;谢谢&#xff01; 翻译论文汇总&#xff1a;https://github.com/SnailTyan/deep-learning-papers-tra…

CTPN论文翻译——中英文对照

文章作者&#xff1a;Tyan 博客&#xff1a;noahsnail.com | CSDN | 简书 声明&#xff1a;作者翻译论文仅为学习&#xff0c;如有侵权请联系作者删除博文&#xff0c;谢谢&#xff01; 翻译论文汇总&#xff1a;https://github.com/SnailTyan/deep-learning-papers-tra…

轻松使用阿里达摩院开源在魔搭社区上的CLUE语义匹配模型

作者&#xff1a;燕返 简介 CLUE&#xff08;中文语言理解测评基准&#xff09;是中文语言理解领域的权威榜单&#xff0c;包含多项测评任务。近日&#xff0c;达摩院NLP团队在其中的语义匹配榜登顶&#xff0c;并在魔搭社区&#xff08;ModelScope&#xff09;上开源了预训练和…

重要升级!OpenAI PowerShell SDK 支持Azure OpenAI的ChatGPT服务

如果关注过我这个公众号&#xff0c;你可以通过这篇文章&#xff08;ChatGPT PowerShell SDK 发布 &#xff09; 了解到我开发和维护的这个非官方的OpenAI PowerShell SDK, 此前已经支持在PowerShell中发起completions服务调用&#xff08;可广泛用于后台自动化&#xff0c;主要…

[chatgpt+Azure]unity AI二次元小女友之使用微软Azure服务实现RestfulApi->语音识别+语音合成

1.简述 如题所述&#xff0c;这个小项目是在unity引擎端&#xff0c;使用了chatgpt微软azure的一个AI二次元女友对话的项目&#xff0c;实现原理也比较简单&#xff0c;即在unity端实现AI二次元女友的交互界面&#xff0c;接入chatgpt-3.5-turbo的api接口&#xff0c;借助chatg…

chatgpt 能用什么到底

l理论上gpt可以担任一个很好的方向指导GPT社区

微信导出表情包教程

方法1&#xff1a;微信公众号 去免费申请个微信公众号&#xff0c;然后关注就可以给公众号发送表情包了&#xff0c;然后就可以下载这个表情包。 方法二&#xff1a;微信网页版 登录 https://wx.qq.com/ 然后聊天发送的表情直接拉出页面就会生成新的表情包页面&#xff0c;然后…

简单操作,轻松在线制作gif动图表情包

相信很多的朋友在使用微信、QQ等工具聊天的时候&#xff0c;经常会用到各式各样的表情包。表情包不但更加的有趣&#xff0c;而且能传达出很多文字无法表达的感情和情绪&#xff0c;更加的生动形象。那么大家知道怎么gif制作https://www.gif.cn/动图的吗?接下来手把手教大家怎…

表情包的gif怎么制作?一招教你快速做gif表情

Gif表情包是当下网友们聊天必备的一种情感表达方式&#xff0c;利用一张有动态效果的图片就可以表达出自己的心情和想法&#xff0c;十分有趣。那么&#xff0c;大家一定很好奇自己应该如何制作gif动图表情包吧&#xff01;很简单&#xff0c;使用gif制作&#xff08;https://w…

从微信导出表情包的简便方法 (不使用微信 for pc,无需进入文件夹寻找!)

微信表情大概分为两类&#xff0c;一类是打开右下角有一个可以操作的按键可以保存&#xff0c;一般是做好一套可以下载的但大多数没有杀伤力&#xff0c;为江湖人所不齿&#xff0c;另一件是没有的&#xff0c;本文从&#xff08;技术角度&#xff09;讨论后一个 不使用微信 f…

怎么做表情包微信gif?好用的制作方法介绍

怎么做表情包微信gif&#xff1f;现如今基本上人手一个微信&#xff0c;微信作为我们日常人际沟通的重要工具之一&#xff0c;我们在日常的聊天中&#xff0c;除了发送文字、图片等内容&#xff0c;也会发送一些表情包&#xff0c;活跃气氛。通常情况下&#xff0c;我们发送的表…

LM+Embedding构建问答系统的局限性及优化方案

原文&#xff1a;LLMEmbedding构建问答系统的局限性及优化方案 - 知乎 近期 LangChain LLM 方案高速发展&#xff0c;降低了知识问答等下游应用的开发门槛。但随着业务深入&#xff0c;一些局限性也日渐显露&#xff0c;比如&#xff1a;LLM意图识别准确性较低&#xff0c;交互…

Segment Anything CV界的GPT—prompt-based里程碑式研究成果

一、计算机视觉界的里程碑式研究成果 - SAM与SA-1B综述 Segment Anything受chatGPT式的prompt-based思路启发&#xff0c;训练数据集涵盖10亿masks&#xff0c;根据提供的图片注释实时产生不同的mask分割结果&#xff0c;试用效果惊人。 Segment Anything之于Computer Vision&…

更快地分割任何事物:面向移动应用的轻量级Sam

文章目录 摘要1、简介2、相关工作3、适合移动设备的SAM3.1、背景和项目目标3.2、提出方法4、实验4.1、实验设置4.2、MobileSAM的性能与原版SAM相当4.3、MobileSAM优于FastSAM5、结论摘要 https://arxiv.org/pdf/2306.14289v2.pdf 分割任何事物模型(SAM)因其令人印象深刻的零样本…

基于自然语言处理的多模态模型_综述

A Survey on Multimodal Large Language Models&#xff1b; 论文链接&#xff1a;https://arxiv.org/pdf/2306.13549.pdf 项目链接(实时更新最新论文&#xff0c;已获1.8K Stars)&#xff1a;https://github.com/BradyFU/Awesome-Multimodal-Large-Language-Models 研究背景 …

AI向百万薪资 高级原画师开刀?!爆Midjourney入局3D模型生成

来源 SoulofArt | ID Soul_Art 现在AI向高级原画师和3D开刀了&#xff1f; 网传爆料AI已入局3D模型生成... 这进化速度放在整个行业都十分炸裂 4月&#xff0c;Midjourney进一步宣布推出Niji-journey V5 这是MJ针对二次元动漫风格预训练好的模型 可在其中添加提示词直接调…

Java 20 正式发布,超神了。。

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) ChatGPT王炸更新&#xff01;终于解封了... 老铁们&#xff0c;JDK 20 / Java 20 正式发布了&#xff0c;这版本号简直超神了。。 JDK 20 是一个短期维护版本&#xff0c;将获得六个月的支持。尽管如此&#xff0c;但…

JDK 20 正式发布, JDK 21 最新动态来了

点击“开发者技术前线”&#xff0c;选择“星标” 让一部分开发者看到未来 来自 infoQ | OSC开源社区&#xff08;ID&#xff1a;oschina2013) JDK 20 是自 JDK 17, 以来的第三个非长期支持&#xff08;LTS&#xff09;版本&#xff0c;正如甲骨文 Java 平台组的首席架构师 Ma…

Ubuntu安装spark时遇到的问题及解决方案

伪分布式模式配置&#xff1a; 安装SSH: 问题一&#xff1a;安装openssh-server时出现以下报错 Package openssh-server has no installation candidate 出错原因: 一开始以为是apt命令没更新&#xff0c;apt-get update之后发现还是安装不了&#xff0c;可能是 文件/etc/apt…

ERROR Error: command failed: pnpm install --reporter silent --shamefully-hoist 错误解决办法

使用 vue-cli、pnpm创建新项目遇到的错误如下图所示&#xff1a; 在命令行安装pnpm6的版本&#xff1a; npm i pnpm6 -g vue create hello-world还可以直接使用npm安装就不报错了&#xff0c;输入一下代码&#xff1a; vue create hello-world -m npm以上两种方法都是亲测可…