题目描述
16名学生的成绩排名和统计分析。
A:全班排名前25%,85分以上。
B:非A成绩,全班前50%,75分以上。
C:非A、B成绩。
使用LC-3汇编语言,编写程序以实现上述功能。
16名学生的成绩存储在x3200至x320F。
由16比特无符号整数表示,每个分数在0到100之间。
成绩降序排序,并存储在x4000至x400F内存位置,x最高分数为4000位。
得A、B学生总数分别存储在成绩中x4100,及x4101位置。
思路分析
R存储原始数据的第一个地址x3200,R存储排序后数据存储的第一个地址x4000,R2的值为循环次数16,内存采用基址加偏移的寻址方式读取,R3作为中间搬运工,使用LDR和STR指令首先移动数据。
现在数据已经转移到了x4000~x400F,开始排序。
普通泡沫排序需要内外循环,外循环n-1次,内循环n-因此,我们让一次R0和R1的值为15,读取内存时仍采用基址加偏移的寻址方式,R存储数据存储地址x4000,R读取前一个数,R4读取后一个数,然后需要比较大小。R3取反加1存储R5,然后将R5和R存储相加结果R5,通过判断R正负判断R3和R如果R3小于R4,即R5是正数,然后交换这两个数,使用STR指令将R将3的值存储到后一个地址单元,并将其存储到后一个地址单元R4的值存储到前一个地址单元。
读取数据采用基址加偏移的寻址方式,R0存储首地址x4000,R1和R用于存储A和B的人数,R存储循环次数为16,R4存储每一个数据,R作为中间载体,存储数据取反加一的值,R6和R7存储着A和B85和75的临界分数同时承担存储和R5相加数据用于比较结果。最后将R1和R2的值分别存进地址为x4100和x内存单元4101。
AC代码
.ORIG X3000 LD R0,DATA LD R1,COPY LD R2,COUNTER LOOP1 BRZ NEXT1 LDR R3,R0,#0 ADD R0,R0,#1 STR R3,R1,#0 ADD R1,R1,#1 ADD R2,R2,#-1 BRNZP LOOP1 NEXT1 LD R1,BUBBLE LOOP2 BRZ NEXT2 LD R0,COPY LD R2,BUBBLE LOOP3 BRZ AGAIN LDR R3,R0,#0 ADD R0,R0,#1 LDR R4,R0,#0 NOT R5,R3 ADD R5,R5,#1 ADD R5,R5,R4 BRNZ RIGHT STR R3,R0,#0 ADD R0,R0,#-1 STR R4,R0,#0 ADD R0,R0,#1 RIGHT ADD R2,R2,#-1 BRNZP LOOP3 AGAIN ADD R1,R1,#-1 BRNZP LOOP2 NEXT2 LD R0,COPY AND R1,R1,#0 AND R2,R2,#0 LD R3,COUNTER LOOP4 BRZ FINISH LDR R4,R0,#0 LD R6,A LD R7,B NOT R4,R4 ADD R4,R4,#1 ADD R6,R6,R4 BRP BB NOT R5,R0 ADD R5,R5,#1 LD R6,AHOLD ADD R6,R6,R5 BRN BB ADD R1,R1,#1 BRNZP TAIL BB ADD R7,R7,R4 BRP TAIL LD R7,BHOLD ADD R7,R7,R5 BRN TAIL ADD R2,R2,#1 TAIL ADD R0,R0,#1 ADD R3,R3,#-1 BRNZP LOOP4 FINISH STI R1,ANUM STI R2,BNUM HALT DATA .FILL X3200 COPY .FILL X4000 COUNTER .FILL X0010 ANUM .FILL X4100 BNUM .FILL X4101 AHOLD .FILL X4003 BHOLD .FILL X4007 A .FILL #85 B .FILL #75 BUBBLE .FILL #15 .END