一、实验目的
分析和理解指定的需解决问题。
利用LC-3的汇编代码设计实现相关程序。
通过LC-3仿真器调试和运行相关程序并得到正确的结果。
二、实验内容
对学生的成绩使用数组进行排序
背景:
一位老师需要你帮忙决定学生的成绩,她想要根据学生分数在班上的排名和考试分数一起决定学生最后的成绩等级。
具体要求如下:
如果学生的分数排名在全班的25%之前,且考试分数达到85分及以上,则学生可以获得A;
如果学生不能拿A,但是分数排名在全班的50%之前,且考试分数达到75及以上,则学生可以获得B;
剩下的学生都是C。
具体的情况:
一共有16名学生,每名学生只有一个成绩。
要求:
用汇编语言给这个班写一个成绩排序的程序。
你的程序必须给学生的分数排序,然后计算出获得A和B的学生人数。程序从x3000开始
程序的输入:
班上16个学生的没有排序的成绩;
每个分数是用16位无符号数表示的0~100的整数
分数存储在16个连续的内存位置-每一个位置一个分数;从x3200开始;
最后一个分数的存储位置为x320F
你可以假设所有的分数相互之间不相同(每个分数是唯一的)
程序的输出(程序必须有两个输出)
16位学生的分数排序。分数必须按降序排序在连续的内存位置-每个内存地址一个分数,从x4000开始存储;即x4000存储的分数是最高的
获得A和B的学生的人数。获得A的学生人数必须存储在x4100,获得B的人数必须存储在x4101。
三、实验步骤与结果
1.将x3200开始的分数全部拷贝到x4000开头的地址
2.通过选择排序法将分数降序排序
3.计算得A的人数并存在x4100
4.同方法计算得B的人数
5.代码尾部
6.编译后发现错误
6.按行修改
7.运行代码
8.分数样本取25-100,每隔5取一个值
9.结果
四、实验结论
1.学会了用汇编编写简单的程序,掌握了利用汇编代码进行选择排序的排序方法。
2.学会了修正用汇编编写程序中的错误。
3.更加熟悉地掌握了LC-3Edit和simulate的使用方法,对LC-3汇编语言指令格式的使用更加熟悉。
4.对于寄存器的使用以及相应操作码的用法都更为熟悉,掌握了利用汇编语言解决问题的思路。
代码
.ORIG x3000;
LD R0,fen1; R0=x3200
LD R3,fen2; R3=x4000
AND R5,R5,#0;
ADD R5,R5,#10;
ADD R5,R5,#6; R5=16为计数器
;批量转移
zhuan BRz pai; R5为0时结束循环
LDR R2,R0,#0; R2=mem[R0]
STR R2,R3,#0; R3=mem[R2]
ADD R0,R0,#1; R0++
ADD R3,R3,#1; R3++
ADD R5,R5,#-1; R5--
BRnzp zhuan;
;选择排序
pai LD R3,fen2; R3=X4000
AND R1,R1,#0;
ADD R1,R1,#10;
ADD R1,R1,#6; R1=16为外循环计数器
;
waixun BRz paiwan; R1=0时结束外循环 line24
ADD R2,R1,#-1; R2=R1-1为内循环计数器
LDR R4,R3,#0; R4存储最大的数
ADD R6,R3,#0; R6为内循环指针
ADD R7,R3,#0; R7存储最大数的地址
NOT R4,R4;
ADD R4,R4,#1; R4转为补码
;
neixun ADD R6,R6,#1; R6++
LDR R5,R6,#0; R5=mem[R6]
ADD R5,R4,R5; R5=R4+R5
BRnz next; 结果大于0时跳过交换步骤
;
LDR R4,R6,#0; R4=mem[R6],即改变最大值
NOT R4,R4;
ADD R4,R4,#1; R4取补码
ADD R7,R6,#0; R7=R6更新最大数地址
;
next ADD R2,R2,#-1; R2--
BRp neixun; R2>0时继续内循环找最大值
;
LDR R0,R3,#0;
STR R0,R7,#0; mem[R7]=mem[R3]
NOT R4,R4;
ADD R4,R4,#1; R4再次取补码变回正数
STR R4,R3,#0; mem[R3]=mem[R4]
ADD R3,R3,#1; R3++
ADD R1,R1,#-1; R1--
BRnzp waixun;
;计算得A人数
paiwan LD R0,chaa; R0读入开始查找的地址
AND R1,R1,#0; R1为计数器
AND R2,R2,#0; R2读入分数
AND R3,R3,#0; R3放R2减分段点后的结果
AND R4,R4,#0; R4存A的人数
AND R5,R5,#0;
AND R6,R6,#0; R6存B的人数
AND R7,R7,#0; R7放分段点-85和-75
ADD R1,R1,#4; R1=4
;计a
jia ADD R1,R1,#0;
BRz cunzhia; R1=0时结束循环
ADD R1,R1,#-1; R1--
LDR R2,R0,#0; R2=mem[R0]
LD R7,fena; R7=mem[fena] line70
ADD R3,R2,R7; R3=R2-85;
BRn panb; 若R3<0,跳转判B
ADD R4,R4,#1; R4++
BRnzp dizhia;
;判B
panb LD R7,fenb;
ADD R3,R2,R7;
BRn dizhia;
ADD R6,R6,#1; R6++
;
dizhia ADD R0,R0,#-1; 地址--
BRnzp jia;
;存值得A人数
cunzhia STI R4,cuna; 间接寻址存值
;计算得B人数,方法同A,注意R6不能清零
LD R0,chab;
ADD R1,R1,#0;
ADD R2,R2,#0;
ADD R3,R3,#0;
ADD R1,R1,#4;
;
jib ADD R1,R1,#0
BRz cunzhib;
ADD R1,R1,#-1;
LDR R2,R0,#0;
LD R7,fenb;
ADD R3,R2,R7;
BRn dizhib;
ADD R6,R6,#1;
;
dizhib ADD R0,R0,#-1;
BRnzp jib;
;
cunzhib STI R6,cunb;
HALT;
fen1 .fill x3200;
fen2 .fill x4000;
fena .fill #-85;
fenb .fill #-75;
chaa .fill x4003;
chab .fill x4007;
cuna .fill x4100;
cunb .fill x4101;
.END
(by 子忆)