计算机系统基础
运算器逻辑运算
实验目的
掌握ALU的逻辑运算原理,熟悉ALU数据传送通路和数据传送方式。
实验环境
微机,配置Windows操作系统、LC-3仿真机软件。
实验内容
ALU数据传送通路和数据传送方式;ALU的逻辑运算功能及其运算原理。
实验过程
运算指令对数据进行处理。常见的例子包括算术运算(加、减、乘、除)和逻辑运算(与、或、非、异或)。
LC-3有三个运算指令:加ADD、与AND、非NOT
这次实验主要是研究 逻辑运算(NOT、AND)
(一)指令介绍(逻辑运算指令)
NOT指令(1001)是唯一一个进行一元运算的指令,这个指令要求有一个源操作数。这个指令对一个16位的源操作数按位取反后把结果存入一个目标中。NOT对源操作数和目标操作数都采用寄存器寻址模式。[8:6]位对应的是源寄存器。[11:9]位对应的是目标寄存器,[5:0]位必须全部包含1。
例子:
R1存储的为0001010100001111,(x150F 5391 )
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 0 1 0 1 0 0 0 1 1 1 1 1 1 1 (947F)
NOT R2 R1
预测 :R2中将会包含 1110101011110000 (xEAF0 -5392)
测试截图 : 与预测值相符
上图显示了用来执行NOT指令的数据通路的关键部分。NOT是一元运算,对于ALU,只有A输入是相关的。源操作数来自于R1,指挥ALU的控制信号是执行按位取反运算,ALU的输出被存储于R2中。
AND指令(0101) 执行一个二元运算,它需要两个16位的源操作数。AND指令对它的两个16位源操作数执行一次按位与运算,AND对其中一个源操作数和目标操作数采用寄存器寻址模式。bit[8:6]对应源寄存器,bit[11:9]对应目标寄存器。AND的第二个源操作数可以通过寄存器寻址模式或立即数模式得到,由bit[5]决定使用哪种方式。如果bit[5]为0,那么第二个操作数使用一个寄存器,bit[2:0]位对应着这个寄存器。bit[4:3]全部为0。如果bit[5]为1,第二个源操作数就被包含在指令当中,第二个源操作数是在执行AND操作之前,将bit[4:0]位执行符号扩展到16位得到的。
例子:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 (x54A0)
AND R2 R2 0
Set value R2 =8
指令执行 :R2 = R2 & 0
预测:R2被清零
测试截图: 与预测值相符
(二)具体实验测试
(1)NOT指令
a)按位取反
Set value R3 = 0010 0101 1100 0011 (x25C3 9667 )
指令: 1001 011 011 111111 (x96FF)
NOT R3 R3
预测结果 : R3 = 1101 1010 0011 1100 (xDA3C -9668)
测试截图 :与预测值相符
b)求相反数 (~a+1)
Set value R1 = 0000 0110 1000 0101 (x0685 )
指令: 1001 001 001 111111 (x927F)
NOT R1 R1 (R1 = ~R1)
0001 001 001 100001 (x1261)
ADD R1 R1 1 (R1 = R1+1)
预测结果: R1 = 1111 1001 0111 1011 (xF97B -1669)
测试截图: 与预测值相符
(2)AND指令
a) 清0操作
Set value R5 = 0001 1010 0000 0011 (x1A03 )
指令 : 0101 101 101 100000 (x5B60)
AND R5 R5 0 (R5 = R5 & 0)
预测: R5 = 0000 0000 0000 0000 R5清零
测试截图:与预测值相符
b)保留位
Set value R1 = 0101 0101 1001 1001 (x5599 21913), 把R1的高八位清零,保留低八位
Set value R2 = 0000 0000 1111 1111 (x00FF 255)
将R1和R2相与,则可以保留R1的低八位
指令: 0101 001 001 000010 (x5242)
AND R1 R1 R2 (R1 = R1 & R2)
预测 : R1 = 0000 0000 1001 1001 (x0099 153)
测试截图:与预测值相符
c)取余运算
Set value R0 = 0000 0000 0000 1001 (x0009 9)
想要实现 R0 对4求余数, R0&3
指令 : 0101 001 000 100100 (x5223)
AND R1 R0 3
预测 : R1 = R0&3 = 1
测试截图:与预测值相符
Set value R3 = 0000 0000 0000 1010 (x000C 12)
想要实现 R3 对 8取余数, R3&7
指令 : 0101 010 011 100111 (x54E7)
AND R2 R3 7 (R2 = R3 & 7)
预测 : R2 = R3&7 = 4
测试截图 :与预测值相符
这个取余运算的方法只能计算2的次幂的余数,而且参加按位与的只能是2^n-1,因为这些数的二进制形式全是1。
小结
实验结论:
· 逻辑运算指令LC3只有:NOT 和 AND
· 算术运算指令LC3只有:ADD
· NOT指令是唯一一个进行一元运算的指令,从上述实验中可以看出这个指令对源操作数和目标操作数都采用的是寄存器寻址模式;NOT指令的数据通路部分,对于ALU,只有A输入是相关的。
· ADD和AND指令都执行一个二元运算:它们需要两个16位的源操作数。ADD指令对两个源操作数执行一个二进制补码的加法运算。AND对两个16位源操作数执行一次按位与运算。ADD和AND对其中一个源操作数和目标操作数采用寄存器寻址模式。
· ADD和AND的第二个源操作数可以通过寄存器寻址模式或立即数模式得到,由bit[5]决定使用哪种方式。
· NOT指令 逻辑非 :也就是取反
1变0,0变1 由“非门”电路实现
(我用NOT指令做了取反和取相反数,实验结果与预测结果相同。LC3没有减法指令,但是可以通过NOT和ADD实现减法:NOT取反,再ADD加1得到该数的负数,再于被减数ADD就可实现简单的减法运算)
AND指令 逻辑乘 : 就是“与”
1·1 = 1,1·0 = 0·1 = 0·0 = 0,由“与门” 电路实现
(我用AND指令做了简单的清零、保留位和取余运算,实验结果与预测结果相同。上一次实验一还做了ADD和AND数据相加、相与溢出时的不同结果,只保留四位,高位舍去。按位与运算我目前了解最多的就是用来清零和用来保留某些位,就用LC3实现了一下,以及取余运算,但这个取余运算的方法只能计算2的次幂的余数,而且参加按位与的只能是2^n-1,因为这些数的二进制形式全是1。)