微机原理实验4:统计学生成绩

一、实验目的

掌握比较综合性的汇编程序设计流程,以及多分支情况下程序的设计技巧。

二、实验内容

设计程序统计学生数学成绩。分别归类90-99分、80-89分、70-79分、60-69分及60分以下,并将各段的人数及成绩存入对应的内存单元中,并在屏幕上显示。

三、程序清单

CRLF    MACROMOV     DL,0DHMOV     AH,02HINT     21HMOV     DL,0AHMOV     AH,02HINT     21H
ENDMDATA    SEGMENT                         ;数据段,成绩区
DATA1   DB      89H,92H,74H,85H,96H,73H,62H,78HDB      49H,59H,97H,66H,84H,81H,79H,67HDB      90H,88H,76H,82H,71H,69H,84H,81HDB      79H,65H,94H,86H,76H,82H,75H,83H
DA90    DB      16 DUP (0)              ;首字节为人数,随后为成绩
DA80    DB      16 DUP (0)
DA70    DB      16 DUP (0)
DA60    DB      16 DUP (0)
DA50    DB      16 DUP (0)
KKK     EQU     DA90 - DATA1            ;总人数
DATA    ENDSCODE    SEGMENT
MAIN    PROC    FARASSUME  CS:CODE,DS:DATA,ES:DATA
START:  PUSH    DSSUB     AX,AXPUSH    AXMOV     AX,DATAMOV     DS,AXMOV     ES,AXLEA     SI,DATA1                ;SI 指向成绩表首MOV     CX,KKK                  ;循环数(总人数)送 CX
LOOP1:  MOV     AL,[SI]                 ;将成绩按字节送入ALCMP     AL,90HJNC     KK90                    ;成绩 >= 90 转CMP     AL,80HJNC     KK80                    ;成绩 >= 80 转CMP     AL,70HJNC     KK70                    ;成绩 >= 70 转CMP     AL,60HJNC     KK60                    ;成绩 >= 60 转LEA     DI,DA50                 ;不及格区首地址送 DIJMP     TTT
KK60:   LEA     DI,DA60                 ;60分区首地址送 DIJMP     TTT
KK70:   LEA     DI,DA70                 ;70分区首地址送 DIJMP     TTT
KK80:   LEA     DI,DA80                 ;80分区首地址送 DIJMP     TTT
KK90:   LEA     DI,DA90                 ;90分区首地址送 DI
TTT:    MOV     BL,[DI]                 ;BL = 存放人数地址INC     BL                      ;该段人数+1MOV     [DI],BL                 ;存该段人数MOV     AL,[SI]XOR     BH,BHMOV     [DI+BX],AL              ;成绩存入该段INC     SI                      ;修改地址指针LOOP    LOOP1LEA     SI,DA90CALL    DISPL                   ;显示 90 - 99分人数及成绩LEA     SI,DA80CALL    DISPL                   ;显示 80 - 89分人数及成绩LEA     SI,DA70CALL    DISPL                   ;显示 70 - 79分人数及成绩LEA     SI,DA60CALL    DISPL                   ;显示 60 - 69分人数及成绩LEA     SI,DA50CALL    DISPL                   ;显示 60分以下人数及成绩RETDISPL   PROC    NEAR                    ;子程序:显示某段人数及成绩MOV     BL,[SI]                 ;取人数MOV     AL,BLMOV     CL,10CBW                             ;符号扩展指令,AL的内容扩展到AH,形成AX中的字。;如果AL的最高有效位是0,则AH = 00,AL的最高有效位为1,则AH = FFH。AL不变。(即将AL的符号位移至AH)DIV     CL                      ;8位除法,被除数放在AX中,除数为8位在CL中,;AL存储除法操作的商(即十位),AH存储除法操作的余数(即个位)MOV     DX,AXADD     DL,30H                  ;将十位加30H转换为ASCII码,后面类似MOV     AH,02                   ;调用INT 21H中断的2号功能进行显示输出,输出字符存在DL中INT     21H                     ;显示十位MOV     DL,DHADD     DL,30HMOV     AH,02INT     21H                     ;显示个位MOV     DL,20H                  ;空格的ASCII码MOV     AH,02INT     21H                     ;显示空格
DISP1:  INC     SI                      ;指向下一单元MOV     DL,20HMOV     AH,02INT     21HMOV     DL,[SI]                 ;取成绩MOV     CL,04ROL     DL,CLAND     DL,0FHADD     DL,30HMOV     AH,02INT     21H                     ;显示十位MOV     DL,[SI]AND     DL,0FHADD     DL,30HMOV     AH,02INT     21H                     ;显示个位DEC     BLJNZ     DISP1CRLF                            ;回车换行RET
DISPL   ENDPMAIN    ENDP
CODE    ENDSEND     START

四、实验过程

1.用编辑器建立源文件D101-4.ASM
在这里插入图片描述
2.用汇编程序MASM.EXE对源文件进行汇编,产生目标文件,再用连接程序LINK产生可执行文件
在这里插入图片描述
3.使用调试工具DEBUG进行程序调试
先用U命令反汇编,以便了解指令地址。显示结果如下,具体调试结果见第五部分。
在这里插入图片描述

五、实验结果分析

1.程序调试及结果
使用U命令查看汇编指令,可以看到共有32个成绩需要统计。
在这里插入图片描述
使用-d ds:0查看成绩内存区存放情况,使用-G 12指令执行到从成绩内存区读取成绩指令,可以看到第一个成绩为89,如下
在这里插入图片描述
使用-t指令单步运行程序,因为第一个成绩为89,所以在第一次比较时跳转不成立,在第二次比较时跳转成立,跳转到KK80标号处,如下
在这里插入图片描述
使用-g 51指令执行到将该成绩存入80分区内存地址段,再使用-d ds:0进行查看成绩区内存情况,可以看到此时80分区人数已经变为1,且此人成绩为89,如下
在这里插入图片描述
依次类推,将源地址指针SI进行加1,指向下一个成绩(字节),再进行循环操作,按照比较、跳转、取相应分区首地址、人数累加、存放成绩的流程进行操作,按照该流程循环成绩总数32次以后,成绩区内存如下
在这里插入图片描述
由上图可以看出,90分以上有5人,80-90分有0B(11)人,70-80分有9人,60~70分有5人,不及格成绩有2人,分别为49分和59分。

最后,再调用显示子程序DISPL对各分区人数及成绩进行打印,该子程序采用SI寄存器进行传参,参数为相应分区首地址,其内部核心思想为利用除法和调用INT 21H中断分别显示人数、成绩的十位和个位,如下。
在这里插入图片描述
至此,整个实验完成。

2.分析总结

首先,本次实验的重点在于掌握成绩的读取、判断分区、存放以及寄存器的调整,其中有个小技巧就是通过人数的增加刚好可以索引到当前成绩应该存放的位置,该小技巧的使用使得程序简洁明了,值得在今后的编程中借鉴。此外,本实验用到了变址寄存器寻址,应该对该部分加以理解。

其次,该实验中碰到几个比较生疏的指令,如符号扩展指令CBW,其功能是将AL的内容扩展到AH,形成AX中的字;如果AL的最高有效位是0,则AH = 00,AL的最高有效位为1,则AH = FFH。AL不变,也就是将AL的符号位移至AH中。程序中在显示数据时,通过8位除法指令DIV来分别依次显示人数、成绩的十位和个位;对于8位除法操作,其被除数放在AX中,除数为8位在CL中,最终结果是AL存储除法操作的商(即十位),AH存储除法操作的余数(即个位)。此外,该实验也用到了INT 21H中断的2号功能进行显示输出,其参数输出字符存在DL中,该显示操作也比较方便,后续可以借鉴。

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

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

相关文章

Spring Boot的Spring Data JPA示例

1.简介 在本文中,我们将演示如何利用功能强大的Spring Data JPA API与本课程中的数据库(内存中的H2数据库)进行交互。 Spring Data JPA提供了一组非常强大且高度抽象的接口,用于与任何基础数据库进行交互。 数据库可以是MySQL&am…

C语言实现01字符转比特流

记一个小功能的实现过程,程序中在循环体里使用语句 int num fwrite(&wrByte,1,i/8,pfw);代替了判断语句,不知道是判断每够8比特写入一次的效率高还是直接用上面的语句效率高,有待验证。 int main(int argc, char** argv) {FILE* pfrNU…

为什么写路径这事有点复杂?动态Web工程内编写路径【JavaWeb】

文章目录一、为什么要写路径?二、为什么写路径这事有点复杂?三、准则四、写路径的步骤五、动态获取上下文路径一、为什么要写路径? 整个系统要根据功能拆分成许许多多独立的资源资源之间既要完成自身的功能又要和其他资源配合写路径就是为了从…

Windows编程初步(一)

第一节:安装帮助文档 使用C语言进行Windows开发,必然使用到WindowsSDK。Windows SDK指Windows开发人员工具包,是为使用C语言开发Windows程序所提供的工具集。里面提供的工具异常全面丰富,很少有人能全部了解,在开发Wi…

2022大学生免费(24元)申请个人软著专利(微信小程序)

文章目录一、发放的软著证书二、申请流程概览三、官网提交申请四、纸质材料打印五、纸质材料邮寄六、模板及代码统计工具点击查看《再易江南》微信小程序 一、发放的软著证书 挂号信封 软著证书 点击查看《再易江南》微信小程序 二、申请流程概览 一般情况下,按照文…

微信小程序错误 Cloud API isn‘t enabled, please call wx.cloud.init first 解决

Cloud API isnt enabled, please call wx.cloud.init first 这个错误的意思就是云环境还没有初始化就调用其它的云api了,因此需要先初始化,也就是让我们先 wx.cloud.init() 进行初始化,最简单的办法就是直接在最前面初始化,代码如…

Windows编程初步(二)

第二节:简单的Windows程序(二) 下面为这个程序增加一个菜单项: 首先设计用户菜单。在工作区里找到资源视图。点击Menu左边的号,双击出现的IDC_WIN_STEP1菜单。 图7 资源视图中的菜单 将help右边的虚框拖入左侧File菜…

kryo java_优化Java序列化– Java,XML,JSON,Kryo,POF

kryo java也许我很天真,但是我一直认为Java序列化肯定是将Java对象序列化为二进制形式的最快,最有效的方法。 毕竟Java是第7个主要发行版,所以这不是新技术,而且由于每个JDK似乎都比上一个快,因此我错误地认为序列化现…

Java数字分类给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3

题目描述: 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 能被5整除的数字中所有偶数的和; A2 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2n3-n4…; A3 被5除后…

Windows编程之互动与动画

第五节: 考虑屏幕左侧一台坦克,向水平方向发射一枚炮弹,穿越屏幕。 很自然地,这场景中有坦克和炮弹两个对象,各自有各自坐标,坦克坐标是固定的,而炮弹坐标是变化的。因此有两个结构体类型:Tank…

创新设计模式:工厂模式

以前,我们对创建模式进行了介绍,并使用抽象工厂模式来创建对象族。 下一个模式是Factory模式 。 当涉及到Java时,工厂模式是最常用的模式之一。 那么,工厂模式到底是什么呢? 工厂模式处理创建对象而未指定确切的类或…

Java福尔摩斯的约会大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧 3485djDkxh4hhGE 2984akDfkkkkggEdsb shgsfdk dHyscvnm”。大侦探很快就明白了

题目描述: 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面…

Windows编程之网络之邮件槽通讯

第6节 使用邮件槽传输数据 网络通讯的理论很复杂,可是初学者不考虑性能的话,可以使用很简单的模式。一般而言网络通讯有两种模式,点对点模式或者广播模式。点对点模式就像一对一辅导,双方都能听清楚对方说什么,并作出…

java 批量处理 示例_Java异常处理教程(包含示例和最佳实践)

java 批量处理 示例异常是可能在程序执行期间发生的错误事件,它会破坏其正常流程。 Java提供了一种健壮且面向对象的方式来处理异常情况,称为Java异常处理 。 我们将在本教程中研究以下主题。 Java异常处理概述 异常处理关键字 异常层次 有用的异常方…

Java德才论宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之 小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若

题目描述: 宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之&#xff0c…

Windows编程之多媒体

一、语音接口的使用: 第一步,安装MSSpeech SDK。 MSSpeech SDK可从网络课堂安装,也可在微软公司直接下载,安装完毕后具有了语音处理能力。 安装过程全选默认即可。 安装完毕后,在开始菜单中会增加MS Speech SDK 5.1&#xff0…

Java的@Serial批注

JDK可能正在使用JDK 11 : Serial获得另一个标准(预定义)注释 。 JDK-8202385 [“标记与序列相关的字段和方法的注释”]的目的是添加“某种“ SerialRelated”注释,以促进对序列字段和方法的声明的自动检查。” 这种想法是为了更好…

Java部分A+B正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。现给定A、DA

题目描述: 正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A 3862767,DA 6,则A的“6部分”PA是66,因为A中有2个6。现给定A、DA、B、DB,请编写程序计算…

Windows编程之调用Matlab

一、选择matlab: 注意。Matlab的安装需要较长时间,建议本拓展在同学们自己的电脑上运行。 Matlab是大多数工科学生必修的科目,是一个口碑极佳的数学计算工具,可以支持立即运算和程序设计两种形式。Matlab较新的版本均提供32位版本…

JavaA除以B本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

题目描述: 本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A B * Q R成立。 输入描述: 输入在1行中依次给出A和B,中间以1空格分隔。 输出描述: 在1行中依次输出Q和R&…