一、实验目的
- 分析和理解试验指定的需解决问题。
- 利用LC-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”,这依然是正确的。