【问题标题】:What does it mean to "Long call" a function in MIPS在 MIPS 中“长时间调用”函数是什么意思
【发布时间】:2012-12-13 23:41:43
【问题描述】:

我正在编写一个程序,该程序使用中断处理在 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 调用函数?

谢谢!

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    jal frogger 替换为:

      la    $t9, frogger
      jalr  $t9
    

    JALR 在 MIPS 中使用绝对地址。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我认为 dlx 和 mips 之间的区别之一是一个使用绝对和另一个 pc-relative。
      • MIPS jal 将 PC 的低 28 替换为新值。 MIPS 指令是字对齐的,因此 26 位立即数左移 2。这使其成为绝对区域,在与分支延迟槽相同的 256MiB 区域内。 How to Calculate Jump Target Address and Branch Target Address?
      【解决方案3】:

      我遇到了同样的问题。我发现我的函数是在.data 部分中定义的。一旦我把它放在.text 部分下,它运行得非常好。

      另外,我是 MIPS 的新手,所以我知道 .ktext 是什么。抱歉,我帮不上忙。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多