PC值的改变(相对寻址与绝对寻址)

我们知道,计算机中有很多的寄存器,他们是32位的,其中每一位的值要么是0要么是1。在汇编语言中,每一条要执行的指令都放在一个寄存器中,而这个将要执行指令的地址我们就需要放在PC(程序计数器)中,而这个PC也是32位的,那么此时就有一个可寻址的范围。是从-2的31次方 到 2^31 - 1吗。
那么在这里有两种寻址方式,相对寻址与绝对寻址。其中beq和bne采用相对寻址,j采用绝对寻址。
相对寻址
在这里插入图片描述其中immediate占16位,我们已经知道,每一条指令都要4个字节,那么我们我们这里就以字为单位,immediate * 4就是要跳转的指令个数了。那么这个可以寻址的范围就是从当前指令向上 - 2的15次方 ,向下 PC + 2的15次方 - 1个指令.
如下,其中PC+4这一项是由于硬件原因。可以简单的在Mars上验证一下就可以。
如果进行分支: PC = (PC + 4) + (immediate * 4)
绝对寻址
在这里插入图片描述
其中的target address占据26位
现在, 可以指定32位地址中的26位.
优化:
和前面分支跳转一样,将只跳转到字对齐的地址, 因此最后两位总是00.
因此,可以默认最后二位为00,而不必专门指定.
现在指定了32位地址中的28位
其它4位如何得到呢?
我们定义,从PC处取得最高4位.
从技术上讲, 这意味着我们无法跳转到内存的任何地方, 但对99.9999…%的情况,这是正确的,因为程序没有那么长
那么此时的PC就是:New PC = { PC[31…28], target address, 00 }
附上一道例题来加以说明
在这里插入图片描述
2.24
对于跳转指令j来说,PC采用绝对寻址,
即PC = PC31…28 : (address × 4),其中address是26位。
如果原地址是PC(原) = 0x20000000
那么按照定义新的PC(新) = 0x2*******
不可能为0x40000000.
对于条件分支指令beq来说,PC采用相对寻址,
即PC = (PC + 4) + (immediate * 4),其中immediate是16位,
每执行一条语句,PC += 4;(0x40000000-0x20000000) / 0x4 = 0x5000000则实际要跳转的指令数为5 * 16^6 - 1 = 5 * 2^24 - 1 >> 2^15 - 1.故对于beq来说不可以。
综上,j和beq指令都不可以将PC的值从0x2000000变为0x4000000.

你可能感兴趣的:(计算机组成原理)