【问题标题】:MIPS jump instruction and consequence of the absolute valueMIPS 跳转指令及绝对值结果
【发布时间】:2018-05-07 08:53:35
【问题描述】:

假设我们在地址 0x20000004 处有一条跳转指令。现在,据我所知,跳转间隔与 PC 值无关,而是绝对间隔约为 32 位寄存器最大值的 1/16。现在,考虑如何在机器代码中构造跳转指令,这是否意味着最大向后跳转(在这种特殊情况下)是 1 条指令,还是指向地址 0x20000000?或者在相反的情况下:在地址 0x1FFFFFFC 处跳转指令,我想在 2 条指令之前跳转到地址 0x20000004。不可行吗?汇编程序如何设法不在这两种情况之一中放置指令? 编辑:修复了一些错误

【问题讨论】:

  • “这是否意味着最大向后跳转(在这种特殊情况下)是 4 条指令” 什么?你从哪里得到这个想法的? “还是到地址 0x20000000?” 每条指令是 4 个字节,而不是 1 个字节。 “在地址 0x1FFFFFFE 处跳转指令” 不能,因为指令必须是字对齐的。
  • 通常是链接器放置部分,这些范围足够大,因此您通常可以毫无问题地将所有代码(至少是您的模块)放入单个代码中。顺便说一句,GNU ld 似乎有问题,如果你强迫这种情况发生,它只会在没有警告的情况下截断跳转。

标签: assembly mips32 machine-code


【解决方案1】:
  • 目标地址的低 28 位设置为 J 指令字的 26 个最低有效位,左移 2 位。
  • 目标地址的高 4 位设置为分支延迟槽中指令地址的最高 4 位。

因此,您可以在与分支延迟槽中的指令相同的 256 MB 区域内跳转任何位置(具有字粒度)。在实践中,这与能够在与 J 指令相同的 256 MB 区域内的任意位置跳转相同,但J 指令位于 256 MB 区域的最后一个字的情况除外。

【讨论】:

  • 好的,你确认我的假设,如果跳转指令和目的地在2个不同的区域,即使被1条指令分开,你也不能跳转?
  • "如果跳转指令和目的地在2个不同的区域,即使隔1条指令也不能跳转?"具体可以跳转指令位于 256 MB 区域的最后一个字的情况。
  • 我想是这样的,因为PC值在被取的过程中转移到了PC+4,所以变成了下一个region的首地址?
猜你喜欢
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多