我正在努力理解 MIPS 跳转指令编码的细节,特别是在处理位于地址 0x00400008 的指令时。上下文涉及跳转到 foo 指定的地址,其中标签 foo 位于地址 0x00400024 处。
答案应该是0x08100009。
据我所知,您需要使用给定的信息计算跳转目标地址:
但是如果 2 个最低有效位是 0,为什么我们最终会得到数字 0x0…9?
从预期结果来看,您实际上是在对指令进行编码,而不是尝试对公式适用的跳转目标进行解码。它还错误地使用了
address(label)
:它缺少一个位范围 27:2。砍掉 2 个最低有效位相当于除以 4。基本原理是指令的大小为 32 位并且自然对齐,因此您不需要存储两个零位和末尾。
要获取机器代码,您需要知道指令格式,即二进制的
0000 10 address[27:2]
。 0000 10
是操作码。
在您的情况下,目标地址是
0x00400024
。只需除以 4 即可得到适当的位:0x100009
。预先添加操作码以获得预期的 0x08100009
(请注意操作码是 6 位,因此在使用十六进制时必须小心)