LC-3 机器码编程实验

一、实验目的

  1. 分析和理解试验指定的需解决问题。
  2. 利用LC-3的机器代码设计实现相关程序。
  3. 通过LC-3仿真器调试和运行相关程序并得到正确的结果。

二、实验内容

利用LC-3的机器代码计算一个16位的字中有多少位是“1”,程序从x3000开始,需计算的字存储在x3100,计算的结果存储在x3101。

三、实验步骤与结果

1. 流程图及思路

在这里插入图片描述

因为输入的数据只有16位,那么计算一个数据中“1”的个数,只需要进行16轮循环。实现16轮循环的具体方法是:令一个寄存器(R2)的值为16,在每一轮循环结束的时候都减1,直到R2 = 0的时候中止循环。用这种方法,可以将循环进行16次,对每一个位都进行检验。这里面遇到了一个问题,5位立即数的范围有限,无法一次性将R2的值加到16。于是我分了两次:先令R2 = 1,然后R2 += 15。

用一个寄存器(R3)保存输入数据,在每一轮循环中,通过判断该数字是否大于等于0,来检测其符号位。如果该数字为非负,则符号位为0;如果该数字为负,则符号位为1。在保存结果的寄存器(R1)中记录每一轮检测的信息。

每一轮循环后,将R3的值左移一位。具体方法是将R3的值乘以2,用加法实现,就是R3 = R3 + R3。这样就可以更新最高位的信息,进行下一轮的检测,直到程序结束。

2. 源代码和注释

0011 000 000000000      ; 设置初始位置,PC = x3000

0101 001 001 1 00000    ; R1 <- 0 该寄存器用来记录1的个数
0001 010 001 1 00001    ; R2 <- 1 该寄存器用来判断循环次数
0001 010 010 1 01111    ; R2 <- R2 + 15 分两次进行赋值,共16次

0010 011 011111100		; R3 <- *(x3100) 将待测数据放进R3

						;循环
0000 011 000000001		; R3 >= 0 ? 判断R3符号位是否为0,是则跳过下一句
0001 001 001 1 00001	; R1 <- R1 + 1 更新R1的值
0001 010 010 1 11111	; R2 <- R2 - 1 
0000 010 000000010		; R2 == 0 ? 判断是否结束?如果R2为0则结束
0001 011 011 0 00011	; R3 <- R3 << 1
0000 111 111111010		; 向回跳转,循环继续

0011 001 011110110		; 将R1的结果存储至x3101

3. 实验过程和结果

首先用LC3 Edit编辑好上述代码,然后生成obj文件,如图所示,没有发现错误。

在这里插入图片描述
用LC3模拟器装载之。
在这里插入图片描述
x3100处写入输入数据,然后执行。最后在x3101处查看结果。在此我使用了四组测试数据测试。

样例1:输入15(x000F)

在这里插入图片描述
结果如图:
在这里插入图片描述
可见输入数据的补码有4个“1”,这是正确的。

样例2:输入642(x0282)

在这里插入图片描述
结果如图:

在这里插入图片描述
可见输入数据的补码有3个“1”,这是正确的。

样例3:输入0(x0000)

在这里插入图片描述
结果如图:
在这里插入图片描述

样例4:输入-100(xFF9C)

在这里插入图片描述
结果如图:
在这里插入图片描述
可见输入数据的补码中有12个“1”,这依然是正确的。

猜你喜欢

转载自blog.csdn.net/weixin_46655675/article/details/130858010