【计算机组成原理】为什么PC值可以直接与偏移量相加

今天在做学习计算机组成原理时,突然产生了一个问题?为什么在跳转指令时,PC值(无符号数)可以直接与偏移量(有符号数)相加?

众所周知 在计算跳转地址时,跳转的下一条地址的计算公式为:PC值+指令长度+偏移量,其中指令长度表示的是一条指令是几个编址单位,如指令字长为32bit,按照字节编址,则指令长度就是4。

在公式里 PC值为当前指令的地址,地址为无符号数,而偏移量为有符号数并且用补码表示,那么为什么无符号数和有符号数可以直接相加呢?

我们假设当前的指令字长为32位,按照字节编址,偏移量为4位(需要进行符号扩展到32位)。假设PC值为F000 0000H,偏移量为FF12H,经过符号扩展为FFFF FF12H,那么现在按照公式去计算下一条指令的地址应该是 F000 0000H+4H(指令长度)+FFFF FF12H=EFFF FF16H, 为什么可以这样计算呢?

如果严格按照课本上数据运算的要求,最正确的方法应该是先将这个补码的偏移量转化为真值,再将这个真值与地址(无符号数)相加,再加上指令长度,很明显这样运算十分低效。但是奇怪的是,这样运算的结果与我们通过公式直接运算的结果是完全一致的,这难道是炸胡还是说具有某种规律?

在探究我们的问题前,我们首先需要知道补码的本质,x的补码=2^{^{32}}+x的真值,此处x为32位,2^{^{32}}为33位,因此我们可以知道:x的真值=x的补码-2^{^{32}}(1)。

在清楚这一公式后,我们再来看一下 我们最正确的方法是如何计算的:地址(无符号数)+指令长度+偏移量的真值,如果我们结合(1)可以发现 :地址(无符号数)+指令长度+偏移量的真值=地址(无符号数)+指令长度+x的补码-2^{^{32}},带入我们之前假设的数值:F000 0000H+4H+FFFF FF12H-2^{^{32}}=1 EFFF FF16H- 2^{^{32}} = 0 EFFF FF16H(33位), 由于字长为32位,因此超出32位的会被舍去,即结果为EFFF FF16H(32位),因此我们发现了问题的核心就是因为这一步舍去操作,也就是说在计算到结果1 EFFF FF16H(33位),就算我们不去减2^{^{32}},计算机也会因为字长原因而将结果保留到32位,所以这就是为什么我们用书上的定义计算与用公式法计算的结果相同的原因,由于二者结果相同,且公式法可由硬件快速处理,因此我们在未来计算可直接使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值