【深圳大学计算机系统1】实验三 LC-3汇编语言实验

一、实验目的

分析和理解指定的需解决问题。

利用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 子忆)

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归忆_AC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值