Assembly MIPS跳转指令和绝对值的结果

Assembly MIPS跳转指令和绝对值的结果,assembly,mips32,machine-code,Assembly,Mips32,Machine Code,假设我们在地址0x2000004处有一条跳转指令。现在,正如我所知,跳转间隔与PC值无关,但它是约32位寄存器最大值的1/16的绝对间隔。现在,考虑到跳转指令是如何在机器代码中构造的,这是否意味着最大向后跳转(在这种特殊情况下)是1条指令,还是指向0x20000000?或者在相反的情况下:跳转地址为0x1FFFFFC的指令,我想跳转到地址为0x2000004的2条指令之前。这不可行吗?汇编程序是如何做到不将指令放在这两种情况之一的? 编辑:修复了一些错误 目标地址的低28位被设置为指令字J的26

假设我们在地址0x2000004处有一条跳转指令。现在,正如我所知,跳转间隔与PC值无关,但它是约32位寄存器最大值的1/16的绝对间隔。现在,考虑到跳转指令是如何在机器代码中构造的,这是否意味着最大向后跳转(在这种特殊情况下)是1条指令,还是指向0x20000000?或者在相反的情况下:跳转地址为0x1FFFFFC的指令,我想跳转到地址为0x2000004的2条指令之前。这不可行吗?汇编程序是如何做到不将指令放在这两种情况之一的? 编辑:修复了一些错误
  • 目标地址的低28位被设置为指令字
    J
    的26个最低有效位,向左移动2位
  • 目标地址的上4位设置为分支延迟槽中指令地址的4个最高有效位

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

    “这是否意味着在这种特殊情况下,最大向后跳转是4条指令”什么?你从哪里得到这个主意的?“或地址0x20000000?”每条指令是4字节,而不是1字节。“地址0x1FFFFFE处的跳转指令”不能是,因为指令必须是字对齐的。通常是链接器放置节,并且这些节的范围足够大,因此您通常可以将所有代码(至少是模块)装入一个节中。顺便说一句,GNU
    ld
    似乎有问题,如果你强迫这种情况发生,它只会在没有警告的情况下截断跳转。好吧,那么你确认我的假设,如果跳转指令和目标位于两个不同的区域,即使被一条指令分隔,你也不能跳转?“如果跳转指令和目标位于两个不同的区域,即使被一条指令分隔,您也不能跳转?“在跳转指令位于256 MB区域的最后一个字的特定情况下,您可以这样做。我想是这样的,因为在提取过程中,PC值转移到PC+4,因此它成为下一个区域的第一个地址?