【发布时间】: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 进行远跳。