【计算机系统1】3 LC-3汇编语言求成绩等级
目录
目的与要求
内容与方法
步骤与过程
程序总体设计
核心数据结构——冒泡排序
调试过程
成绩数据文件data编写和程序数据初始
成绩复制
冒泡排序
A B计数保存
核心代码
结论或体会
目的与要求
分析和理解实验指定的问题
利用LC-3的汇编代码设计实现相关程序
熟练掌握循环、分支程序设计方法
内容与方法
- 背景
- 16名学生成绩排序,及统计分析
- 成绩分类规则
- A:全班排名前25%,且成绩在85分及以上
- B:非A成绩,全班排名前50%,且成绩在75分及以上
- C:非A、B成绩
- 要求
- 使用LC-3汇编语言,编写程序实现以上功能
- 输入
- 16名学生成绩,存储于x3200至x320F
- 每个成绩为0至100之间,由16比特无符号整数表示
- 输出
- 成绩降序排序,并存储于x4000至x400F内存位置,x4000位置成绩为最高成绩
- 得A、B成绩的学生总人数,分别存储于x4100,及x4101位置
步骤与过程
程序总体设计
- 根据题目,首先要实现的是成绩的存储。首先我用标号SCORE存储成绩首地址x3200,用data文件记录16个成绩于起始位置:.ORIG x3200。
- 其他重要地址和常量用标号表示如下:
SCORE .FILL x3200 ;成绩存放起始地址
RES .FILL x4000 ;成绩降序结果存放起始地址
Anum .FILL x4100 ;存放A地址
Bnum .FILL x4101
nAscore .FILL -85 ;A分数相反数
nBscore .FILL -75
StuNUM .FILL 16 ;学生人数
ONE .FILL 1 ;1
- 算法流程——具体实现步骤如下:
- 将成绩复制到结果区:COPY循环
- 冒泡排序:2层嵌套循环
- 计算A B人数:各2个循环(CountA CountB)
- 结果保存:STORE
核心数据结构——冒泡排序
C++代码如下:
for(int i=1;i<n;i++){For(int j=0;j<n-I;j++){If(score[j]<score[j+1]){Swap(score[j],score[j+1])}}
}
调试过程
因为程序步骤较多,我进行分模块编写和调试,逐步完成。
成绩数据文件data编写和程序数据初始
- 代码编写编译(图1)
R1存成绩存放初始地址SCORE(x3200),R7存结果降序成绩初始地址RES(x4000)。标号编写。
Figure 1 data编写和程序数据初始
- 运行结果无误(图2)
Figure 2 数据获得和初始成功
成绩复制
先将成绩直接复制到结果区,在结果区排序。
- 编写编译运行(图3)
Figure 3 成绩复制代码编译运行
- 结果正确,x3200和x4000存放的数据一样(图4)
Figure 4 成绩复制成功
冒泡排序
- 编译通过(图5)
Figure 5 冒泡成功编译运行
- 答案错误,代码有误,经过单步调试发现是每轮冒泡循环没有把成绩指针指向首位。(图6)
Figure 6 调试过程
- 修改代码(图7)
每次循环都初始成绩指针指向第一个成绩。修改后答案正确
Figure 7 修改冒泡排序
A B计数保存
2个循环CountA和CountB遍历前4和前8个数,获得A B人数,并保存。(图8)
Figure 8 程序结果正确
核心代码
.ORIG x3000 ;程序开始LD R1,SCORE ;R1为存放成绩初始地址LD R7,RES ;R7存放成绩降序结果地址LD R2,StuNUM ;R2装入学生人数
;
; 成绩复制至结果区(loop)
;
COPY LDR R3,R1,0 ;R3存成绩STR R3,R7,0 ;成绩存结果ADD R1,R1,1 ;下一个成绩ADD R7,R7,1 ;结果成绩指针移向下一个ADD R2,R2,-1 ;计数减1BRp COPY ;继续循环直至全部复制; 冒泡排序
;LD R2,ONE ;R2初始1,外层循环i,轮次
;
; 外层循环LOOP1(R2 0<i<n)
LOOP1 ; 内层循环(R3 0<=j<n-i);LD R7,RES ;R7存放成绩降序结果首地址AND R3,R3,0 ;R3清零, 里层循环j,下标ADD R1,R2,-16 ;R1=-(n-i)LOOP2 LDR R4,R7,0 ;R4存SCORE[j]LDR R5,R7,1 ;R5存SCORE[j+1]NOT R6,R4 ADD R6,R6,1 ADD R6,R6,R5 ;R6=SCORE[j+1]-SCORE[j]BRnz FLAG ;如果SCORE[j+1]<=SCORE[j],不用交换直接跳过;; 交换SCORE[j+1] SCORE[j];STR R5,R7,0 STR R4,R7,1;FLAGADD R7,R7,1 ;指向下一成绩ADD R3,R3,1 ;j++ADD R6,R3,R1 ;R6=j-(n-i)BRn LOOP2 ;如果j<n-i,继续内层循环;; 内层循环结束ADD R2,R2,1 ADD R6,R2,-16;R6=i-nBRn LOOP1 ;如果i<n,继续外层循环
;
; 外层循环结束,冒泡排序完成; 计数A B人数
;LD R2,nAscore ;R2=-85LD R3,nBscoreAND R1,R1,0 ;R1清零,计数AND R5,R5,0 ;R5清零存A人数AND R6,R6,0 ;B人数LD R7,RES ;R7存放成绩降序结果首地址
;
; 获得的A人数
;
CountA LDR R4,R7,0 ADD R4,R4,R2 ;R4=score-85BRn CountB ;如果score<85,开始计数BADD R5,R5,1 ;人数增加ADD R7,R7,1 ;移向下一分数ADD R1,R1,1 ;计数加1ADD R0,R1,-4 ;R0=计数-4BRn CountA ;计数小于4,还在前25%继续判断A人数
;
; 获得B的人数
;
CountB LDR R4,R7,0 ADD R4,R4,R3 ;R4=score-75BRn STORE ;如果score<75,跳出B计数,进行保存ADD R6,R6,1 ;人数增加ADD R7,R7,1 ;移向下一分数ADD R1,R1,1 ;计数加1ADD R0,R1,-8 ;R0=计数-8BRn CountB ;计数小于8,还在前50%继续判断B人数
;
; 将A B人数保存
;
STORE STI R5,AnumSTI R6,BnumHALT ;程序运行结束
;
SCORE .FILL x3200 ;成绩存放起始地址
RES .FILL x4000 ;成绩降序结果存放起始地址
Anum .FILL x4100 ;存放A地址
Bnum .FILL x4101
nAscore .FILL -85 ;A分数相反数
nBscore .FILL -75
StuNUM .FILL 16 ;学生人数
ONE .FILL 1 ;1
; .END ;代码结束
结论或体会
在本次实验中,我首次尝试了在LC3利用汇编代码实现一个小程序,熟悉了了相关语法和良好的代码分割。认识到了适用标号的诸多好处,如利用LD直接加载数据常量,将地址偏移的计算交给机器负责从而增加代码的可读性;同时也熟悉了关于标号的各种操作。通过规定文件起始位置(.ORIG)实现多文件连接的可能。
另外我熟悉了利用汇编代码编写循环和分支结构的过程,第一次尝试用汇编代码实现冒泡排序。尝试了将一个实际问题通过问题分析,找到相应的算法实现流程及数据结构,进而通过逐步编写调试完成对问题的解决。
在本次实验中我也纠正了一些自己的模糊认知。比如标号地址是一个常量,不能做指针移动。其他数据标号也同样是常量,需要将其赋值给寄存器才能进行变量操作。另外lc3仅有8个寄存器。需要合理循环利用寄存器。
【计算机系统1】3 LC-3汇编语言求成绩等级相关推荐
- C语言:从键盘输入10个学生的成绩存储在数组中,求成绩最高者的序号和成绩
/*从键盘输入10个学生的成绩存储在数组中,求成绩最高者的序号和成绩*/ #include <stdio.h> int main(){int i,n=1;float max,grade[1 ...
- 26 利用switch语句解决问题 【项目1:投票表决器】【项目2:成绩等级】【项目3:分段函数求值switch语句版】【项目4:本月有几天?】【项目5:个人所得税计算器switch语句版】
/*项目1:投票表决器] 设计一个投票表决器,其功能是: 输入Y.y,打印agree 输入N.n,打印disagree 输入其他,打印lose */#include <stdio.h>in ...
- 计算机计算合格不合格的公式,excel给成绩等级划分_如何使用Excel计算优秀、良好、合格、不合格的比例?...
在excel怎样算优秀,良好,及格,不及格 利用IF函数就可以做到了. 具体的步骤如下所示: 1.打开EXCEL,一个要进行运算的单元格.(下图仅为演示数据,假设60以下为不及格,60-70为及格,7 ...
- 再php用if语句实现成绩,php中if语句怎么编写学生成绩等级
php中if语句怎么编写学生成绩等级 php中if语句怎么编写学生成绩等级? 代码如下:php语言 var $score;//分数变量 if($score<60){ echo "不及格 ...
- php中表单输出成绩等级,php中if语句怎么编写学生成绩等级_后端开发
c++如何比较两个字符串?_后端开发 c++两个字符串比较的方法:首先定义整型变量j及两个字符串变量:然后输入两个字符串保存在变量s1和s2中并比较大小:最后根据判断结果j的值,输出两个字符串的比较结 ...
- 判断学生成绩等级 php,php中if语句怎么编写学生成绩等级_后端开发
c++如何比较两个字符串?_后端开发 c++两个字符串比较的方法:首先定义整型变量j及两个字符串变量:然后输入两个字符串保存在变量s1和s2中并比较大小:最后根据判断结果j的值,输出两个字符串的比较结 ...
- php写一个成绩等级,php中if语句怎么编写学生成绩等级
php中if语句怎么编写学生成绩等级? 代码如下:php语言 var $score;//分数变量 if($score<60){ echo "不及格"; }elseif($sc ...
- 潍坊中考计算机成绩,2017年潍坊中考考试科目及成绩等级划分
2017年潍坊中考考试科目及成绩等级划分 2017-3-17 8:55:00 | 点击13602次 考试科目及形式 1.初中学业水平考试的科目及成绩等级划分 初中学业水平考试分考试科目和考查科目两类. ...
- ACMNO.5给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E
题目描述 给出一百分制成绩,要求输出成绩等级'A'.'B'.'C'.'D'.'E'. 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E 输入 一个整数0-100以内 ...
最新文章
- Windows7 64位下vs2008配置OpenCV2.3.1
- textarea样式
- sql 分组后按时间降序排列再取出每组的第一条记录
- C# DataTable的詳細用法
- 使用HDFS客户端java api读取hadoop集群上的信息
- Java 8 时间日期库的20个使用演示样例
- 汇编语言实模式到保护模式的思考
- 他说,编程的黄金时代已到
- atitit.木马病毒webshell的原理and设计 java c# .net php.
- 《计算机组网试验-DNS服务器安装配置 》杭州电子科技大学
- 客户分析表格怎么做 财务合并报表培训 5分钟看懂财务报表
- bat批处理,变量不生效
- Android下载图片并添加图片水印
- InputStream转byte[]
- VUE时间范围选择的组件
- PHP:安装fileinfo扩展
- (HDU)1718 -- Rank (段位)
- oracle 修改 dbid,Oracle 在使用NID更改DBID时ORA-01122 ORA-01110 ORA-01206
- 计算机描述不可用步骤,Win10 1909系统中提示打印机描述不可用解决方法
- TMMi02:SG和SP读书笔记
热门文章
- 金融过程的模拟(一):CIR 过程的模拟
- JAVAEE千锋教育第一天学习总结(2022年7月11日)
- 妻子照顾高位截瘫丈夫16年:和你一直到老挺知足
- Spring Boot进阶(17):如何在Swagger2中配置header请求头等参数?若不会,我便手把手教你 | 超级详细,建议收藏
- 常用HANA函数解释
- 安装window10时没选XPS,现在怎么安装
- Android 增量更新实现
- 形状相似的物品_找身边与图形相似的事物
- 火焰焰心matlab,[转载]酒精灯火焰的温度真的是外焰最高吗?
- 水塘抽样算法(Reservoir Sampling Algorithm)