计算机系统基础
运算器算术运算
实验目的
掌握ALU的算术运算原理,熟悉ALU数据传送通路和数据传送方式。
实验环境
微机,配置Windows操作系统、LC-3仿真机软件。
实验内容
ALU数据传送通路和数据传送方式;ALU的算术运算功能及其运算原理。
实验过程
一、LC-3中几个重要的寄存器
通用寄存器(GPR):R0~R7共8个,每个均为16bit
IR、PC:IR用来存放本次执行的指令,PC用来存放下一条指令所在的内存地址
条件码:LC-3中有3个位寄存器,为N、Z、P,一旦GPR的数据发生变化,条件码的对应一位就会发生变化:写入正数时,N置1;写入0时,Z置1;写入负数时,P置1。可以根据条件码的变化来控制指令执行的顺序。
二、指令介绍
算术运算操作指令:ADD
0001 001 100 000101 (1305)
ADD R1 R4 R5 (R4+R5 -->R1)
0001 001 100 100101 (1325)
ADD R1 R4 5 (R4+5 -->R1)
指令 ADD R1,R4,#5 执行的数据通路 如下图
一条指令是由操作码和操作数组成的。ISA指令集是由一组操作码、数据类型、和寻址模式定义的。寻址模式决定了操作数位于哪个位置。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 1
ADD R1 R4 R5
bit[11:9]R1为目的寄存器,bit[8:6]R4是源寄存器,通过bit[5]来判断bit[4:0]的含义。
如果bit[5]为0,则bit[2:0]为是另一个源寄存器;
如果bit[5]为1,则bit[4:0]为指令携带的立即操作数,16位扩展后与源寄存器相加。
上面的例子就是操作码为ADD,寻址模式是寄存器模式的指令。该指令的操作是让计算机做二进制补码整数加法,计算机寻找的操作数的位置是位于通用寄存器中的。
三、具体实验测试
通过前面一些铺垫,对算术运算指令ADD有了一定的了解,接下来就举一些例子进行测试并具体分析。
(1) bit[5]来判断bit[4:0]
0001 010 001 000011 (x1443)
ADD R2 R1 R3 (R2 = R1 + R3)
Set value R1=3,R3=2,则R2会被赋值为 5
bit[5]位是0,则011表示另一个源寄存器R3,也就是 R1+R3—>R2
测试截图
如果bit[5]是1,第二个源操作数就被包含在指令当中,第二个源操作数是在执行ADD操作之前,将bit[4:0]位执行符号扩展到16位得到的。
0001 010 001 100011 (x1463)
ADD R2 R1 3 (R2 = R1 + 3)
Set value R1=3,R3=2,则R2会被赋值为 6
测试截图
ADD指令的立即操作数必须位于指令的bit[4:0]位中,也就说不是所有的二进制补码整数都可以是立即数。
(2)运算
0001 001 010 000011 (1283)
ADD R1 R2 R3 (R1 = R2 + R3)
令 R2 = x8000, R3 = x8000
则R1 = 1 0000
测试截图如下,我们可以看到R1=0000,而并不是 10000,因为只能保留了四位,所以将最高位丢掉了。
0101 001 010 000011 (5283)
AND R1 R2 R3 (R1 = R2 & R3)
令 R2 = x8000, R3 = x8000
则 R1 = 8000
测试截图如下,我们可以看到R1的确等于8000,即8000&8000的结果
以上两个指令,我再重新赋值给R2,R3
Set value R2 = xFFFF, R3 = x8000
ADD预测 R1 = 1 7FFF
ADD测试截图如下,R1 = x7FFF,运算溢出,只能保留四位,则丢了掉了最高位的1
AND测试截图如下,R1 = x8000
通过上面两组数据,可以看出ADD数据运算溢出是只保留4位,其余位都丢掉。
(3)实现减法 x-y
将y取反加1,得到其补码,再与x相加即为x+(-y)
x is in R0, y is in R1
Set value R0 = 4 = x,R1 = 1 = y
1)求反码
1001 001 001 111111 (927F)
NOT R1 R1 ( NOT(y)-->R1 )
2)得补码
0001 010 001 100001 (1461)
ADD R2 R1 1 ( (-y)-->R2 )
3)做减法
0001 010 000 000010 (1402)
ADD R2 R0 R2 ( x+(-y)-->R2 )
(4)求10个数的和
假设知道x3100到x3109这10个地址中储存的是整数,然后计算这10个整数的和。
第一步,我们先将10个数值存储到x3100到x3109这10个地址当中;
第二步,初始化变量,有三个变量:当前的和(R1初始化为0),没有被做加法的整数的个数(R4初始化为10),以及下一个被加整数的地址(R2初始化为第一个整数的地址,即x3100)。
然后加法开始执行。
这个程序重复一下过程:加载10个数中的一个到R3,加到R1中。每执行一次加法,就递增R2, R2指向下一个要被加的数据的地址,并且递减R4, 就知道还有多少数据等待被加。当R4等于0时,条件码Z被置为1,停止循环,即可得到计算结果R1。
流程图如下
指令分析如下
Set value x3100~x3109
x3000 0101 001 001 100000 (5260)
AND R1 R1 0 (R1&0 R1清零,存储和)
程序开始于PC=x3000的位置,第一条指令是清空R1,R1是保存累加的结果;
x3001 0101 100 100 100000 (5920)
AND R4 R4 0 (R4&0 R4清零, R4作为计数器)
x3002 0001 100 100 101010 (192A)
ADD R4 R4 10 (R4 = R4+10 赋值数的个数为10)
第二、三条指令是将R4清零,并将10赋值给R4,R4记录的是有多少数据要被加,这个数字将会在做完每一步加法后被减1(由x3007实现);
x3003 1110 010 011111100 (E4FC)
LEA R2 x0FC (R2-->PC+x0FC x3100)
第四条指令,将R2加载为地址x3100(被增加了1的PC是x3004, 符号扩展的PC偏移量是x00FC);
x3004 0110 011 010 000000 (6680)
LDR R3 R2 0 (R2+0-->R3 ) loop
第五条指令,将R2中加载的x3100的内容赋值给R3;
x3005 0001 010 010 100001 (14A1)
ADD R2 R2 1 (R2 = R2+1 指向下一位数据)
第六条指令,将R2加1,R2指向了下一个被加数的地址;
x3006 0001 001 001 000011 (1243)
ADD R1 R1 R3 (R1 = R1+ R3)
第七条指令,将取到的数据R3赋值累加到R1中;
x3007 0001 100 100 111111 (193F)
ADD R4 R4 -1 (R4 = R4 - 1,计数器减一)
x3008 0000 001 111111011 (03FB)
BR P (BRP loop x3004)
x3009 1111 000000100101 (F025)
TRAP HALT (TRAP halt)
…
小结
ALU
算术逻辑单元 (arithmetic and logic unit)
组成:
1)内部组成: 加法器AU、逻辑运算器、移位器、求补器
2)外部组成: 两个输入缓冲器A和B、输出缓冲器SUM、进位标志CF、溢出标志OF、符号标志SF、零标志ZF
串行加法器:
我们手算加法的时候,总是先个位相加,选出结果和进位,再十位相加并加上进位,再算出结果和进位… 这就是一个链式的过程,每一位(除第一位外)其结果的得出都依赖于前一位的进位,并且该位运算完的进位需要提供给下一位才能得出下一位结果和进位,下一位的进位再…
基本逻辑单元:全加器FA
两个本位加数 Ai和Bi;
低位进位Ci-1;
本位和Si
向高位的进位 Ci
Si = Ai XOR Bi XOR Ci-1
Ci = Ai·Bi + (Ai+Bi)·Ci-1(逻辑加OR 与 逻辑乘AND)
记Gi=Ai·Bi称为本位进位
记Pi=Ai+Bi称为传递条件,Pi·Ci-1称为传递进位
可见:Ci = Gi + Pi·Ci-1
多个FA串接起来,就组成了串行加法器。
当然除了这些还有并行加法器等。