MIPS跳转指令编码困惑:目标地址对齐后为何结果为0x08100009?
MIPS跳转指令编码细节解析
已知条件
- 当前指令地址:
0x00400008 - 目标标签
foo地址:0x00400024 - 最终跳转指令编码:
0x08100009
核心编码规则拆解
MIPS跳转指令(如j)的编码格式为:[6位操作码] + [26位目标偏移],其中:
- 操作码固定为
000010(对应十六进制08,这就是指令开头08的来源) - 26位目标偏移的计算逻辑:
- 由于MIPS指令是字对齐(地址最低两位始终为
00),目标地址可直接除以4(等价于右移2位),得到目标地址 >> 2 - 取这个值的低26位,作为指令中的26位偏移字段
- 由于MIPS指令是字对齐(地址最低两位始终为
针对你的场景计算验证
- 计算目标地址右移2位(除以4):
0x00400024 >> 2 = 0x00400024 / 4 = 0x00400009 - 提取这个值的低26位:
0x00400009的二进制为0000 0000 0100 0000 0000 0000 0000 1001,低26位是0100 0000 0000 0000 0000 1001,对应十六进制0x100009 - 拼接操作码和偏移字段:
操作码0x08+ 低26位偏移0x100009=0x08100009,与正确结果完全匹配
关于末尾9的解惑
你看到的指令末尾0x09,本质是目标地址除以4后的值的最后两位十六进制。因为0x00400024除以4得到0x00400009,这个值的低2位十六进制就是09,而它被包含在26位偏移字段的最后部分,所以最终指令的末尾会呈现0x09。
内容的提问来源于stack exchange,提问作者Bishop_1
相关产品推荐
相关产品推荐

