assembly - MIPS计算跳转指令的机器编码

标签 assembly mips

<分区>

我想知道如何计算跳转指令的机器编码。

假设我有
杰富
在地址 0x00400000
现在,如果 foo 位于地址 0x0040002c 会怎样。那么如何找到跳转指令的机器编码呢?

[0x00400000] j foo
...
[0x0040002c] foo:
在 Youtube 上找到一些指南说它会像

((400000+4) - 40002c)/4
但是 jump 有操作码 2,我没有通过那个计算得到它。

谢谢

最佳答案

J有操作码 2,编码为:

---------------------------
| opcode |     target     |
---------------------------
 6 bits       26 bits

因此,指令字应该是(2 << 26) | target .
现在,JJAL不是 PC 相关的,而是 PC 区域相关的。即 target是从您当前正在执行的 256MB 区域的开头到目标地址的距离in words。0x00400000 所在的 256MB 区域从 0x00000000 开始。所以target将被编码为 (0x0040002c - 0x00000000) >> 2 == 0x0010000B .这给了你指令词 (2 << 26) | 0x0010000B == 0x0810000B

关于assembly - MIPS计算跳转指令的机器编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39510183/

相关文章:

xcode - 创建常量跳转表;代码;铛;汇编

assembly - 从堆栈指针中减去对齐?

linux - Debian Mips 系统调用 unistd.h 丢失了吗?

mips - MIPS 中的微程序设计

c++ - 为什么在我的 C++ mips 反汇编程序中,没有打印出某些内容?

C 到 MIPS 的转换

assembly - MIPS:堆栈指针($sp)和堆栈的相关用途

linux - SYSENTER/SYSEXIT 与 INT 0x80

ios - Hopper 反汇编器 iOS 文件中的十六进制含义

汇编 (,%eax,4)