超出PC相对寻址范围的MIPS分支指令执行结果探究
MIPS分支指令(beq/bne)偏移量溢出的处理逻辑
1. 能否生成二进制编码?
不能。MIPS的beq、bne等分支指令的偏移量字段仅为16位有符号数,对应的有效跳转范围是相对于PC+4的±131072字节(偏移量会先乘以4得到字节偏移)。当计算出的偏移量超出16位有符号数的范围(-32768 ~ 32767,对应字节偏移-131072 ~ 131076)时,汇编器会直接抛出错误,不会生成这条分支指令的合法二进制编码——16位字段根本存不下这么大的偏移量。
以你给出的例子来说:
- 当前指令地址:
0xAFC08880,PC+4为0xAFC08884 - 目标Label地址:
0x3376AB00 - 计算得到的偏移量远超出16位有符号数的范围,汇编阶段就会报错,无法生成对应的
bne指令二进制码。
2. 是否会触发错误或异常?
- 汇编阶段:会触发汇编错误,无法生成可执行文件。
- 如果强行构造非法二进制指令:比如手动截断偏移量的高位,只保留低16位写入指令字段,CPU执行这条指令时不会触发专门的硬件异常。CPU只会读取指令中的16位偏移量,进行符号扩展后乘以4,再与PC+4相加得到跳转地址——但这个地址会和目标Label完全不符,后续执行错误地址的代码可能引发非法指令、地址访问错误等异常,但这不是分支指令本身导致的,而是跳转后执行错误代码的结果。
3. 分支指令本身的执行结果
如果汇编阶段因偏移量溢出报错,这条指令根本不会出现在最终的二进制程序中,自然不会被执行。
如果是手动构造了非法的偏移量(比如截断高位),CPU会严格按照指令中的16位偏移量计算跳转地址,执行跳转操作,但跳转目标完全错误,不会指向你期望的Label地址。
内容的提问来源于stack exchange,提问作者HOCHI
相关产品推荐
相关产品推荐

