下面的 I-Type 指令如何改变程序计数器?
How does the following I-Type instruction change the program counter?
考虑这条I型指令(BNE,不等于分支):0001 0100 1010 1001 1111 1111 1110 1111。当NE条件满足时,PC值的变化是多少,即PC = PC + _____?
问题的答案是-68,但我不太清楚为什么。我知道对于 I-Type 指令,如果偏移量是最后 16 位,则源目标和您要分支的位置之间的符号差异也是如此。所以所有的 1 都表示负值?但是,我仍然不明白值 68 是如何得出的。
指令的直接部分是
1111 1111 1110 1111
等于-17。这是由于二进制补码编码,可以很容易地验证通过将 17 添加到该数字,我们得到 2^16(如果我们只保留前 16 位,则为零)。
MIPS 指令是 32 位(4 字节)并且它们是对齐的,即它们的地址始终是 4 的倍数。MIPS 架构使用此特性来增加分支范围,并且由于 PC 始终是 4 的倍数,分支在添加到 PC 之前,偏移量将乘以 4。这允许存储 4 倍大的偏移量。
所以PC会加上一个0 4*(-17)的值,即-68。
准确地说,official MIPS documentation表示
An 18-bit signed offset (the 16-bit offset field shifted left 2 bits) is added to the address of the instruction following
the branch (not the branch itself), in the branch delay slot, to form a PC-relative effective target address.
一个等效的公式是,在获取指令阶段,这个值-68 增加了 4 之后,将被添加到 PC。
考虑这条I型指令(BNE,不等于分支):0001 0100 1010 1001 1111 1111 1110 1111。当NE条件满足时,PC值的变化是多少,即PC = PC + _____?
问题的答案是-68,但我不太清楚为什么。我知道对于 I-Type 指令,如果偏移量是最后 16 位,则源目标和您要分支的位置之间的符号差异也是如此。所以所有的 1 都表示负值?但是,我仍然不明白值 68 是如何得出的。
指令的直接部分是
1111 1111 1110 1111
等于-17。这是由于二进制补码编码,可以很容易地验证通过将 17 添加到该数字,我们得到 2^16(如果我们只保留前 16 位,则为零)。
MIPS 指令是 32 位(4 字节)并且它们是对齐的,即它们的地址始终是 4 的倍数。MIPS 架构使用此特性来增加分支范围,并且由于 PC 始终是 4 的倍数,分支在添加到 PC 之前,偏移量将乘以 4。这允许存储 4 倍大的偏移量。
所以PC会加上一个0 4*(-17)的值,即-68。
准确地说,official MIPS documentation表示
An 18-bit signed offset (the 16-bit offset field shifted left 2 bits) is added to the address of the instruction following the branch (not the branch itself), in the branch delay slot, to form a PC-relative effective target address.
一个等效的公式是,在获取指令阶段,这个值-68 增加了 4 之后,将被添加到 PC。