汇编语言实验

计算机系统 实验3

实验目的:

(1) 熟悉和理解LC-3的汇编语言指令格式。

(2) 掌握在LC-3仿真平台下汇编语言代码的设计输入和调试过程。

(3) 掌握利用汇编语言解决问题的思路,加深对底层硬件的理解。

实验内容与实验要求:

实验要求:

(1) 分析和理解试验指定的需解决问题。

(2) 利用LC-3的汇编语言代码设计实现相关程序。

(3)通过LC-3仿真器调试和运行相关程序并得到正确的结果

实验内容:

编写程序满足下列要求的程序

  1. 程序起始地址 x3000
  2. 在x3200处开始存放16个学生成绩,成绩为0~100的正整数,假定成绩不重复
  3. 编写程序对16个学生的成绩进行排序,从高至低存放在起始地址x4000处
  4. 计算学生获得成绩等级为A的数量存放在x4100,获得B等级的数量存放在x4101处。成绩等级计算方法:如果一个学生的成绩在85分以上同时排名前25%则获得A,如果一个学生不能获得A,他的成绩在75分以上同时排名前50%,则可获得B。其它成绩则获得C,存储于x4102中
  5. 实验报告要写清楚排序算法的实现过程以及等级的计算方法

实验步骤:

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人

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值