计算机系统 实验3
实验目的:
(1) 熟悉和理解LC-3的汇编语言指令格式。
(2) 掌握在LC-3仿真平台下汇编语言代码的设计输入和调试过程。
(3) 掌握利用汇编语言解决问题的思路,加深对底层硬件的理解。
实验内容与实验要求:
实验要求:
(1) 分析和理解试验指定的需解决问题。
(2) 利用LC-3的汇编语言代码设计实现相关程序。
(3)通过LC-3仿真器调试和运行相关程序并得到正确的结果
实验内容:
编写程序满足下列要求的程序
- 程序起始地址 x3000
- 在x3200处开始存放16个学生成绩,成绩为0~100的正整数,假定成绩不重复
- 编写程序对16个学生的成绩进行排序,从高至低存放在起始地址x4000处
- 计算学生获得成绩等级为A的数量存放在x4100,获得B等级的数量存放在x4101处。成绩等级计算方法:如果一个学生的成绩在85分以上同时排名前25%则获得A,如果一个学生不能获得A,他的成绩在75分以上同时排名前50%,则可获得B。其它成绩则获得C,存储于x4102中
- 实验报告要写清楚排序算法的实现过程以及等级的计算方法
实验步骤:
1.编写一个数据文件,将16个学生的成绩提前存入x3200为起始的内存中
3200
0064
0000
0063
0001
0062
0042
0061
0043
0060
0054
005F
0035
0047
0051
0033
0025
2.用汇编语言编写满足上述要求的程序
程序设计思路:
(1)用循环依次取出最大数(将提取成绩后的内存单元数据置成-1,以方便下一个数的搜取),然后依次填入x4000作为起始地址的内存单元中;
排大小,存数:
以R0作为外层循环的计数器——循环结束后跳入“进行等级统计”
以R4作为内层16个成绩比较大小的循环的计数器——每次取出16个学生成绩中的最大值,然后存入相应内存之中
(2)依次访问已存入x4000为起始的内存单元中的成绩,去确定各成绩等级人数;
进行等级统计:
以R1作为循环范文内存数据的计数器——对每次访问的成绩进行成绩等级的归类计数
.ORIG x3000
;;;;;;;;;排大小,存数
LD R2,EN
LD R0,FNUM
;外层循环
PART1 ADD R0,R0,-1
BRn PART2
LD R1,BIG ;R1用于记录最大值数据所在地址
LD R4,FNUM ;该比较的次数
ADD R6,R1,0 ; 记录另一个比较数据的地址
;记录所取数据的补码
E3 LDR R5,R6,0;
NOT R5,R5
ADD R5,R5,1
;内层循环,取最大值
E1 ADD R4,R4,-1
BRz E2
ADD R6,R6,1
LDR R7,R6,0
ADD R7,R7,R5
BRnz E1
;切换原始数据R5所取的数据来源,切换地址R1的指向和R5的大小
ADD R1,R6,0
BRnzp E3
;写入每次取得的最大值
E2 NOT R5,R5
ADD R5,R5,1
STR R5,R2,0 ;R5取反,存入
ADD R2,R2,1
AND R5,R5,0
ADD R5,R5,-1
STR R5,R1,0 ;将取出数后的内存数据置换成-1
BRnzp PART1
;;;;;;;;进行等级的统计
PART2 AND R0,R0,0
LD R6,A
STR R0,R6,0
LD R6,B
STR R0,R6,0
LD R6,C
STR R0,R6,0 ;分别对A,B,C进行初始化为0
LD R0,FNUM
ADD R0,R0,-1
NOT R0,R0
ADD R0,R0,1 ;取15的取反
LD R6,SCOREA
NOT R6,R6
ADD R6,R6,1 ;R6记录85的取反
LD R7,SCOREB
NOT R7,R7
ADD R7,R7,1 ;R7记录75的取反
AND R1,R1,0 ;R1用于记录下一个数据与A的差距
LD R3,EN ;取数据的起始地址
;循环——对x4000中的成绩进行逐一的获取、判断
TFOR ADD R5,R0,R1
BRp TH
ADD R4,R3,R1 ;该取数据的地址
LDR R4,R4,0 ;记录存储数据
ADD R5,R4,R6
BRzp TA
ADD R5,R4,R7
BRzp TB
;为C的数进行统计
TC LD R4,C
LDR R5,R4,0
ADD R5,R5,1
STR R5,R4,0
ADD R1,R1,1
BRnzp TFOR
;有可能为A的数进行统计
TA ADD R5,R1,-3
BRp TB
LD R4,A
LDR R5,R4,0
ADD R5,R5,1
STR R5,R4,0
ADD R1,R1,1
BRnzp TFOR
;有可能为B的数进行统计
TB ADD R5,R1,-7
BRp TC
LD R4,B
LDR R5,R4,0
ADD R5,R5,1
STR R5,R4,0
ADD R1,R1,1
BRnzp TFOR
TH HALT
BIG .FILL x3200; 开始时存放成绩的首地址
FNUM .FILL #16; 循环次数
EN .FILL x4000; 最后成绩存放的地址
A .FILL x4100; 成绩等级为A的数量存放在x4100
B .FILL x4101; B等级的数量存放在x4101处
C .FILL X4102; C等级的数量存放在x4102处
SCOREA .FILL #85
SCOREB .FILL #75
.END
具体思路:
让程序起始与地址 x3000(即.ORIG x3000)
排大小,存数:
在R2中存放入最后成绩放置的地址x4000(即LD R2,EN)
在R0中存放提取最大值的次数16,为外循环跳出的判断依据(即LD R0,FNUM)
进行外层,PART1标记目前pc地址
让外层循环次数减1(即ADD R0,R0,-1)
然后判断是否满足跳出外循环条件,跳往PART2(即BRn PART2)
用R1记录最大值所在地址,方便最后将其内存数置为-1(即LD R1,BIG)
用R4记录还需比较的次数,作为内循环跳出的欧安的依据(即LD R4,FNUM)
用R6记录与暂时的最大值进行比较的数据的地址(即ADD R6,R1,0)
E3标记当前的地址,将暂时的最大值数据进行求反,方便与其他数据用ADD指令比较大小
E3 LDR R5,R6,0;
NOT R5,R5
ADD R5,R5,1
用E1标记内循环开头
让内循环的比较的次数减1(即ADD R4,R4,-1)
然后判断是否达到内循环跳出的条件,跳往E2进行存数操作(即BRz E2)
通过R6加1,访问内存中另一个比较数(即ADD R6,R6,1; LDR R7,R6,0)
通过ADD指令进行暂时最大值与另一比较数的比较(即ADD R7,R7,R5)
用BR指令对比较结果进行判断,判断是否重新开始新内循环(即BRnz E1)
对于结果为另一个比较数比较大,通过ADD指令和E3,修订R1的指向和R5中的值
ADD R1,R6,0
BRnzp E3
E2标记存储暂时最大值的操作的开头
将R0取反,得到正值(即NOT R5,R5; ADD R5,R5,1)
调用STR指令存储该次外循环得到的最大值(即STR R5,R2,0)
对R2进行加1操作,得到下次外循环中最大值该存入的地址(即ADD R2,R2,1)
通过AND指令和ADD指令,将R5置为-1(即AND R5,R5,0;ADD R5,R5,-1)
将取出最大值的内存的数据置换成-1(即STR R5,R1,0)
进行无条件跳转回外循环的起始,进行跳出还是继续执行的判断(BRnzp PART1)
进行等级的统计:
用PART2标记为“等级统计”这一部程序的开始,承接前面外循环跳出的目的地
用R0,R6通过AND、LD和STR分别对A,B,C进行初始化为0
AND R0,R0,0
LD R6,A
STR R0,R6,0
LD R6,B
STR R0,R6,0
LD R6,C
STR R0,R6,0
用R0存储15的取反结果,方便以ADD指令来判断是否满足循环的跳出条件
LD R0,FNUM
ADD R0,R0,-1
NOT R0,R0
ADD R0,R0,1
用R6存储85的取反结果,方便在对成绩评级时,用ADD指令判断是否分数小于85
LD R6,SCOREA
NOT R6,R6
ADD R6,R6,1
用R7存储75的取反结果,方便在对成绩评级时,用ADD指令判断是否分数小于75
LD R7,SCOREB
NOT R7,R7
ADD R7,R7,1
用R1记录下一个数据与x4000(EN)的差距(即AND R1,R1,0)
用R3作为排序好的成绩的起始地址(即LD R3,EN)
用TFOR标准“等级统计”这一部分程序中的循环的开始
承接前面R5取反,ADD和BR指令对是否达到跳出循环(终止程序)条件进行判断
ADD R5,R0,R1
BRp TH
用R4临时生成目前该取数据的地址(即ADD R4,R3,R1)
用临时存储该取存储中的数据(即LDR R4,R4,0)
对取到数据是否达到85分进行判断,是则跳转到TA进行A等级具体条件的判断
ADD R5,R4,R6
BRzp TA
对取到数据是否达到75分进行判断,是则跳转到TB进行B等级具体条件的判断
ADD R5,R4,R7
BRzp TB
对C中数据进行加1操作,然后进行R1加1操作,开始新循环
TC LD R4,C
LDR R5,R4,0
ADD R5,R5,1
STR R5,R4,0
ADD R1,R1,1
BRnzp TFOR
TA标记当初地址,对取得数是否是为25%进行判断,若是,直接对A中数据进行加1操作,然后进行R1加1操作,开始新循环;否则,跳转到TB,进行B等级具体条件的判断;
ADD R5,R1,-3
BRp TB
LD R4,A
LDR R5,R4,0
ADD R5,R5,1
STR R5,R4,0
ADD R1,R1,1
BRnzp TFOR
TB标记当初地址,对取得数是否是为50%进行判断,若是,直接对B中数据进行加1操作,然后进行R1加1操作,开始新循环;否则,跳转到TC,进行C的加1操作
ADD R5,R1,-7
BRp TC
LD R4,B
LDR R5,R4,0
ADD R5,R5,1
STR R5,R4,0
ADD R1,R1,1
BRnzp TFOR
TH标记当前地址,承接“等级统计”这一部分程序中的循环,终止程序
HALT
下面数据的定义都是为了方便进行操作,减少代码量
BIG .FILL x3200; 开始时存放成绩的首地址
FNUM .FILL #16; 循环次数
EN .FILL x4000; 最后成绩存放的地址
A .FILL x4100; 成绩等级为A的数量存放在x4100
B .FILL x4101; B等级的数量存放在x4101处
C .FILL X4102; C等级的数量存放在x4102处
SCOREA .FILL #85
SCOREB .FILL #75
.END
3.用simulator打开学生成绩数据文件,运行文件代码
实验结论:
16名同学的成绩排序结果如下:
16名同学的成绩等级数量如下:
A 4人
B 4人
C 8人