计算机系统基础实验01运算器算术运算

计算机系统基础
运算器算术运算
实验目的

掌握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串接起来,就组成了串行加法器。
当然除了这些还有并行加法器等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值