搞了好久,刚开始写的时候其实不清楚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
结果: