LC-3 汇编语言试验 求成绩等级

实验目的

1. 掌握处理仿真工具LC-3软件的安装和使用方法。

2. 学会在LC-3仿真环境下编辑程序和转换为可执行目标程序的方法。

3. 学会在LC-3仿真环境下运行和调试程序的方法。

实验内容

1.分析和理解试验指定的需解决问题。

2.利用LC-3的汇编语言代码设计实现相关程序。

3.通过LC-3仿真器调试和运行相关程序并得到正确的结果

4. 学习和掌握断点,单步执行等调试方法和手段。

实验要求

1.熟悉和理解LC-3的汇编语言指令格式。

2.掌握在LC-3仿真平台下汇编语言代码的设计输入和调试过程。

3.掌握利用汇编语言解决问题的思路,加深对底层硬件的理解。利用LC3EDIT输入汇编代码程序并创建可执行目标程序。

实验步骤

1.分析问题

        在x3200处开始存放16个学生成绩,成绩为0~100的正整数,编写程序对16个学生的成绩进行排序,从高至低存放在起始地址x4000处,计算学生获得成绩等级为A的 数量 存放在x4100,获得B等级的数量存放在x4101处。

0526644030d74206ac541255a1c2ac1d.jpeg

2.解决问题

由1可知,对于这一个问题,我们需要解决的两个问题是:如何进行排序和如何进行分数等级的评定

1).排序问题

如何排序?并将排序后的分数存入地址x4000中?

        本题中,我选用了比较简单的排序算法——冒泡排序法,基本原理为建立双重循环,逐步比较相邻两个数的大小,并根据题目的需要决定是否需要进行交换(本问题中排序需要从大到小排序,所以交换的条件是左边需要小于右边,否则相对位置不变。

其实现的高级语言如下:

fbdd23768dd543938187f2cf3e66a644.jpeg

再将其转变为汇编语言即可,由于排序后的内存位置依旧在x3200,所以要通过一次循环将数据搬移到x4000.

2).等级问题

成绩等级计算方法:如果一个学生的成绩在85分以上同时排名前25%则获得A,如果一个学生不能获得A,他的成绩在75分以上同时排名前50%,则可获得B。其它成绩则获得C

  由于在进行等级排序之前,已经对分数排好了序,所以我们可以直接从小到大根据计算方法进行评定。

 

2ada364e4061483ea70c09ffad8f0487.png

 实验代码

 Part1:前期准备&&冒泡排序算法实现

7c186ea86e6a4306b9e21dc48ba0a5ea.png

 Part2:数据搬移指令&&等级计算 

369712216ff848a29d7924eb1e42e0c4.png

Part3:数据内存 

3444d54f84fe4911880ac9c202c603bb.png

样例演示

 输入16个数 87 76 98 89 76 65 25 37 90 8 81 34 19 10 39 89

50ccddfda8f042c6bd952096bd385fc5.png

排序后结果 98 90 89 89 87 81 76 76 65 39 37 34 25 19 10 8

 

42d9fcd8d06f43aab5df3efafec26111.png

A-level 和B-level的个数  4 4

91fea7a5dd5f42fb82612e0164199af1.png

实验结论

        通过这次的实验,我对汇编语言有了更深的认识。虽然在实验过程中遇到不少困难,最终都成功解决。如判断时条件错误,忘记将因用于比较而变成负数的值转回原值等。最后在一次次debug和测试中都得到解决。在对汇编语言进行编程时,如果代码较长,理解起各个指令的含义变得困难,此时就需要借助注释来进行提示,注释的作用在本实验中得到了很大体现。此外,我也学会了将高级语言中排序算法应用到汇编语言的能力,这大大降低了在汇编语言中实现相应操作的难度。

实验最终代码 !!!仅供参考!!!

代码编写目的:将掉前输入的16位同学的分数排序,并根据区分a-leve1 和-eve1 的要求计算出其个数:程序从x3000开始oriq X3000:程序代码区
:冒泡排序
AH0 R2,R2.0
ADD R2,R2,#1:R2初始1,外层循环1.轮次:一层循环outer (R2 @<i<n)
outer
:二层循环(R3 0C-j<n-1)LD R7.scoreAHD R3.R3。ADD R1,R2,#-16
:R7存放成绩隆序结果首地地里层循环5下标:R3青
:R1--(16-1)
interior
LOR R4,R7,乌LO溢«澳茵机容走每冽洪R剔遍遁爱隘疮把纺挨钢肝班爱吩癌膀彻,1
;R4存score[i]
:R5存score[j+1]
:R6-score[j-1]-score[j]:如果scere[j*il<-score[i]不用交换直接跳过;交换score[j*1]score[j]STR R5,R7,非STR R4,R7.1
HOT R6,Rs
ADD R6,R6,1
ADD R6,R6,RS
Rnz next
ADD R7,R7,1
next
;指向下一成绩j..
ADD R3,R3.1
ADD R6,R3.R1 :R6-j-(m-1)BRn interior ;如果j<n-,继续内层循环
;内层循环结束ADD R2.R2.1
ADD R6,R2.-16
;R6-i-n
:如果i<n,继续外层循环外层循环结束,冒泡排序完成,排序后的数值依旧存在内存起始地址为x3200的地方
RRn outer
;孙蟀割诀 扮裁艾齿壁盖搬移指令
L菇毋砍D杭板胡缸雌扁钡R1.score
LD R7.after_score
AHO R2,R2,0
ADD R2,R2,15
ADD R2,R2,1
start LOR R3,R1.0
STR R3,R7,0
ADD R1.R1.1
ADD R7,R7.1
ADD R2,R2,-1
BRp start
;R1为存放成绩初她地址;R7存放成续降序结巢地址
;将R2的值赋值为16,用于数据迁移时循环的计数器:R3存成
:成绩存结果个成续“个搬移数据分数的存放地址:指回下
试效然1:继续酒环直至全部复制《即R2的值不在是正数)
;计a-leve B-leve人的期准备(始化存器)
lo
R2,A_score
:R2--弃帛85:R3--75;1清雾,作为计数器,A-leve1不超过四人,B-leve1不超过八人;R5清赛存6人故;R6清零存B人故
lo
R3,B_score
AND
R1,R1,8
R5,R5,8
AND
AND
R6,R6,8
LD
R7.after_score
;R7存放成绩降序结果首地址
:获得的a-leve1人数
c6叮抉u侮 钡ntALDR
R4,R7,8
ADD
R4,R4,R2
:Ro-score-85
BRn
count8
;如果score<85,开始计数B
ADD
R5,R5,1
:效增加:移向下一分数
ADD
R7,87,1
ADD
R1,81.1
:加1
ADD
R0,R1,-年c[胳树资彗疚啧铲焙才不爸毕挨份叼瓣甭熬服部角
:R十一年;计数小于4,还在前25继续判断a人数
BRn
:获得B-level的人数count8LDR
R_,R7,8
ADDR4,R4,R3
;Ro-score-75
;如果score<75,跳出B计数,进行保存:效加;移向下一分数:计加1
BRn
STORE
ADD
R6,R6,1
ADD
R7,87,1
ADD
R1,R1.1
ADD
R0,81-8
R计-8
BRn
count8
;计数小于8,还在前5晚维续判断B人敬
:A-level B-level的人教保存STORESTI R5,Acount
STI R6.Bcount
HALT
;数据内存区
A score
B score
score
.fil #-85
.Fi11 #-75
.Fi11 X3200
after_score.Fi11 X4000
Acount
.Fi11 X4100
Bcount
END
.Fil X4101

 

 

 

  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值