实验目的
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处。
2.解决问题
由1可知,对于这一个问题,我们需要解决的两个问题是:如何进行排序和如何进行分数等级的评定
1).排序问题
如何排序?并将排序后的分数存入地址x4000中?
本题中,我选用了比较简单的排序算法——冒泡排序法,基本原理为建立双重循环,逐步比较相邻两个数的大小,并根据题目的需要决定是否需要进行交换(本问题中排序需要从大到小排序,所以交换的条件是左边需要小于右边,否则相对位置不变。
其实现的高级语言如下:
再将其转变为汇编语言即可,由于排序后的内存位置依旧在x3200,所以要通过一次循环将数据搬移到x4000.
2).等级问题
成绩等级计算方法:如果一个学生的成绩在85分以上同时排名前25%则获得A,如果一个学生不能获得A,他的成绩在75分以上同时排名前50%,则可获得B。其它成绩则获得C
由于在进行等级排序之前,已经对分数排好了序,所以我们可以直接从小到大根据计算方法进行评定。
实验代码
Part1:前期准备&&冒泡排序算法实现
Part2:数据搬移指令&&等级计算
Part3:数据内存
样例演示
输入16个数 87 76 98 89 76 65 25 37 90 8 81 34 19 10 39 89
排序后结果 98 90 89 89 87 81 76 76 65 39 37 34 25 19 10 8
A-level 和B-level的个数 4 4
实验结论
通过这次的实验,我对汇编语言有了更深的认识。虽然在实验过程中遇到不少困难,最终都成功解决。如判断时条件错误,忘记将因用于比较而变成负数的值转回原值等。最后在一次次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