【问题标题】:Target address encoding for J-Type instructions in assembly (MIPS) [duplicate]汇编中 J-Type 指令的目标地址编码 (MIPS) [重复]
【发布时间】:2017-04-22 23:26:59
【问题描述】:

根据我的课堂笔记,在 MIPS 中,跳转指令的编码是 6 位的操作码和 26 位的目标地址。但是地址是 32 位的,那么地址的哪一部分被遗漏了呢?考虑一条 j 指令(操作码 2 -> 000010 6 位)和目标地址 0x00400024 -> 0000 0000 0100 0000 0000 0000 0010 0100。最终的编码应该是0x08100009,实在不明白目标地址是怎么编码的

【问题讨论】:

  • 由于指令对齐到 4 个字节,所以省略了两个低位。鉴于 0x400024 >> 2 = 0x100009 这将是编码。任何指令集参考都应该告诉你这一点。
  • 非常感谢!而我没有提到的参考表。它只说地址使用了 26 位。

标签: assembly mips memory-address machine-code


【解决方案1】:

MIPS 中的绝对 32 位跳转目标地址是通过获取分支延迟槽 ( PC+4 ) 中地址的最高 4 位并将其与 26 位 instr_index 字段相结合来解码的编码 J 类型指令左移 2 位。 (正如@jester 所说,这是有效的,因为所有跳转目标地址必须是 4 字节对齐的。)

要对跳转目标进行编码,您需要获取目标地址的低 28 位并右移 2 位。

// Decoding a jump target.
TARGET := ((PC+4) & 0xF0000000) | (INSTR_INDEX << 2);

// Encoding a target.
INSTR_INDEX := (TARGET & 0x0FFFFFFF) >> 2;

【讨论】:

  • 你确定它是相对于分支延迟槽的区域,而不是 J / JAL 本身吗? mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html 显示了 PC = nPC; nPC = (PC &amp; 0xf0000000) | (target &lt;&lt; 2); 的解码公式(我假设 nPC 是“下一台 PC”,即它表明跳转发生在运行分支延迟指令之后,但它是用 J / JAL 的高位计算的本身。)How to Calculate Jump Target Address and Branch Target Address? 和其他 SO 答案同意
  • @PeterCordes 来自 MIPS Technologies 的官方文档指出 “剩余的高位是延迟槽中指令地址的对应位(不是分支本身)”.
  • @Michael:啊,那么可能需要更新的所有其他答案。与往常一样,首先发生 PC+=4 确实更有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多