MIPS 中“长调用”函数是什么意思

Mat*_*zke 4 assembly mips

我正在编写一个程序,该程序使用中断处理在 MIPS 中玩基于 ASCII 的游戏。我被告知从我的处理程序中“长时间调用”我的主要函数。我的处理程序发生在 .ktext 0x80000180 下,如下所示:

.ktext  0x80000180

    move    $k1, $at

    beq $13, 0, keyboard
    li  $v0, 10 # Do nothing and exit
    syscall

    keyboard: # else check interupt level
    la  $t9, 0xffff0000
    beq $t9, 1, continue

    li  $v0, 10     # Do nothing and exit
    syscall
    continue:

    jal frogger     # call frogger function
    mtc0    $0, $13     # set cause register to 0

    mfc0    $k0, $12        # Fix status register
    andi    $k0, 0xfffd # clear EXL bit
    ori $k0, 0x1        # Enable interrupts
    mtc0    $k0, $12        # Store value back into status register


    move    $at, $k1

    eret
Run Code Online (Sandbox Code Playgroud)

问题出在该行jal frogger,它显示 Error in F:\Users\Matt\WSU\Cpts 260\HW9\HW9.asm line 32: Jump target word address across 26-bit range。

其余代码是否有问题,或者是否有特殊方法从 .ktext 调用函数?

谢谢!

Var*_*der 5

长调用使用目标的完整(32 位)地址。这与您的jal调用不同,您的调用只能在指令中编码 26 位地址,并且可能与 PC 相关(我不记得是否是这种情况)。要进行长调用,您需要构造地址或将地址加载到寄存器中,然后分支到该地址。


mar*_*kgz 5

替换jal frogger为类似以下内容:

  la    $t9, frogger
  jalr  $t9
Run Code Online (Sandbox Code Playgroud)

JALR在 MIPS 中使用绝对地址。