【问题标题】:Assembler labels with limited jump range跳转范围有限的汇编标签
【发布时间】:2014-11-12 15:14:15
【问题描述】:

我正在为一个简单的 RISC 处理器编写一个汇编程序,该处理器具有非常小的跳转立即数(7 位有符号)。所有跳跃的计算方式为:

PC = PC + IMMEDIATE + 1

其中 PC 是指向下一条指令的程序计数器。

如果您需要向前跳转超过 64 行,则需要如下链式跳转:

JMP, 0x3F

//64 lines ahead

JMP, 0x5;

这实际上会在当前指令之前跳转 70 行。

当我们有标签时,我的问题就出现了:

JMP, label

//more than 64 lines ahead

label:

汇编器如何为此生成代码?您需要两个标签还是汇编程序会为您添加两个跳转?如果它进行两次跳转,它如何知道一条指令是否不在前面 64 行?

【问题讨论】:

  • 你正在编写那个汇编程序,所以这取决于你。在奇怪的情况下自动插入跳转会导致麻烦,并且一直很棘手。如果你仍然对它感兴趣,我可以写一些关于它的细节。
  • 这是一个棘手的问题,有时跳转指令(或跳转指令序列)的确切选择只有链接器才能解决。
  • 我是否应该直接跳转到必须提前 64 行或之前 63 行的任何标签?在那种情况下,进行大跳跃几乎是不可能的吗? ISA 有一条 JALR 指令,它将 PC+1 放入寄存器并从寄存器加载新的 PC 值。这将工作的方式是将地址加载到寄存器(比如这个寄存器是一个汇编器唯一的寄存器,就像在 MIPS 上一样)并将 PC 设置为那个。 PC+1 可以被发送到零寄存器,这会破坏不需要的结果。
  • 使用 jump-to-register 进行远跳。

标签: assembly labels


【解决方案1】:

条件跳转不能向前超过 127 个字节或向后超过 128 个字节。无条件跳跃可以跳得更远。我猜你用条件跳转试过了。如果你想有条件地跳转到一个超过 127 字节的地方,写一个无条件跳转到那个地方,如果条件不满足,那么在它之前插入一个条件跳转将跳过另一个跳转指令。例如这段代码:

je label

//more than 127 bytes ahead

label:

可以用这个代码代替:

jne omit
jmp label
omit:
//more than 127 bytes ahead
label:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多