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

 

 

 搞了好久,刚开始写的时候其实不清楚LDI,LDR,STI,STR是个啥,那就更不会在地址上改数了。

也是第一次写,勉强过,注释应该非常详细了

排序思路是进行遍历,每16次遍历找到最大值放到指定地址,然后把原始地址给赋值为0

.ORIG x3000
LD R1,ZERO;i 记录第几次遍历
LD R2,ZERO;j 遍历到第几个数据
LD R7,SIXTEEN;-16
LD R3,ZERO;存最大值的位置(是第几个)
LD R6,ZERO;存减数吧!!!
LD R4,ZERO;存最大值
LD R5,ZERO;存被减数
;R0存计算结果

LOOP1;是否找了16次,外循环
;遍历了一次,找到最大值了,存一手
	;每次存完排好的最大的数后,把那个数归零,SGRADE+1,(因为写在前面了,所以开局就存了一次
	STI R5,SGRADE;存好了
	LD R0,SGRADE
	ADD R0,R0,#1 
	ST R0,SGRADE;地址加一了
	LD R0,GRADE
	ADD R0,R0,R3
	ST R0,GRADE_FOR_DELETE;把这个位置给存起来,马上STI他然后赋值为0
	LD R0,ZERO
	STI R0,GRADE_FOR_DELETE;赋值为0喽

	LD R7,SIXTEEN
	ADD R0,R1,R7;次数-16,看循环够了吗
	BRzp JUDGE
	ADD R1,R1,#1
	LD R2,ZERO
	LD R5,ZERO
	LD R6,ZERO
LOOP2
;读数arr[R2+GRADE],读到R0里面
	LD R0,GRADE
	ADD R0,R0,R2
	ST R0,GRADE_FOR_DELETE;计算出那个地址,就存这里吧GRADE_FOR_DELETE
	LDI R0,GRADE_FOR_DELETE
	LDI R4,GRADE_FOR_DELETE;用来存的
;是否为最大值
	ADD R0,R0,R6
	BRnz #6;减不过直接走
	LD R5,ZERO
	ADD R5,R5,R4
	NOT R6,R5
	ADD R6,R6,#1;更换最大值,然后弄成负数
	LD R3,ZERO
	ADD R3,R3,R2;记录位置
;以上为处理
	ADD R2,R2,#1
;是否跳出循环,内循环
   	ADD R0,R2,R7
	BRn LOOP2
	BR LOOP1;
;_______________________________________
;判断AB
;R1存A的人数
;R2存A+B的人数,最后B = A+B-A
;R3 = -85
;R4 = -75
;R5 序号,即排名
;R6 = -16*25% = -4
;R7 = -16*50% = -8然后就可以结束了
JUDGE	LD R1,ZERO
	LD R2,ZERO
	LD R3,EIGHTY_FIVE
	LD R4,SEVENTY_FIVE
	LD R5,ZERO
	LD R6,FOUR
	LD R7,EIGHT	
LOOP3	ADD R5,R5,#1
	LD R0,SGRADE2
	ADD R0,R0,R5
	ST R0,GRADE_FOR_DELETE;计算并储存出该排名对应成绩的地址
AJUDGE	ADD R0,R5,R6
	BRp BJUDGE;A排名判断,排名不符合直接跳到B
	LDI R0,GRADE_FOR_DELETE
	ADD R0,R0,R3
	BRn BJUDGE;A成绩判断
	ADD R1,R1,#1
BJUDGE	ADD R0,R5,R7
	BRp END;B排名判断,过了就可以结束了
	LDI R0,GRADE_FOR_DELETE
	ADD R0,R0,R4
	BRn LOOP3;B成绩判断
	ADD R2,R2,#1
	BRnzp LOOP3
END	STI R1,NUMA
	NOT R1,R1
	ADD R1,R1,#1
	ADD R2,R2,R1
	STI R2,NUMB
	HALT

ZERO .FILL x0000;0
SIXTEEN .FILL xFFF0;-16的补码
EIGHTY_FIVE .FILL xFFAB;-85
SEVENTY_FIVE .FILL xFFB5;-75
FOUR .FILL xFFFC;-4
EIGHT .FILL xFFF8;-8
GRADE .FILL x3200;地址
GRADE_FOR_DELETE .FILL X3300;用来存那个归零的数的地址然后可以STI,后面也存排好序的每个成绩的地址
SGRADE .FILL x3FFF;存成绩
SGRADE2 .FILL x3FFF;因为SGRADE之前排序改了,后面成绩判断还要用,所以弄个副本
NUMA .FILL x4100
NUMB .FILL X4101
.END

样例:

3200;.orig
0043;67
0058;88
0057;87
0053;83
0052;82
0051;81
0050;80
004F;79
004E;78
0049;73
0048;72
0047;71
0046;70
0045;69
0044;68
0059;89

结果:

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值