在MIPS中“长时间调用”一个函数意味着什么

时间:2012-12-13 23:41:43

标签: 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

问题在于行jal frogger,它说 F:\ Users \ Matt \ WSU \ Cpts 260 \ HW9 \ HW9.asm第32行出错:跳转目标字地址超出26位范围。

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

谢谢!

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

jal frogger替换为:

  la    $t9, frogger
  jalr  $t9

JALR在MIPS中使用绝对地址。

答案 2 :(得分:0)

我有同样的问题。我发现我的功能是在.data部分中定义的。一旦将其放在.text部分下,它就可以正常运行。

另外,我是MIPS的新手,所以请问.ktext是什么。抱歉,我不能帮忙。