今天在做学习计算机组成原理时,突然产生了一个问题?为什么在跳转指令时,PC值(无符号数)可以直接与偏移量(有符号数)相加?
众所周知 在计算跳转地址时,跳转的下一条地址的计算公式为:PC值+指令长度+偏移量,其中指令长度表示的是一条指令是几个编址单位,如指令字长为32bit,按照字节编址,则指令长度就是4。
在公式里 PC值为当前指令的地址,地址为无符号数,而偏移量为有符号数并且用补码表示,那么为什么无符号数和有符号数可以直接相加呢?
我们假设当前的指令字长为32位,按照字节编址,偏移量为4位(需要进行符号扩展到32位)。假设PC值为F000 0000H,偏移量为FF12H,经过符号扩展为FFFF FF12H,那么现在按照公式去计算下一条指令的地址应该是 F000 0000H+4H(指令长度)+FFFF FF12H=EFFF FF16H, 为什么可以这样计算呢?
如果严格按照课本上数据运算的要求,最正确的方法应该是先将这个补码的偏移量转化为真值,再将这个真值与地址(无符号数)相加,再加上指令长度,很明显这样运算十分低效。但是奇怪的是,这样运算的结果与我们通过公式直接运算的结果是完全一致的,这难道是炸胡还是说具有某种规律?
在探究我们的问题前,我们首先需要知道补码的本质,x的补码=+x的真值,此处x为32位,