3

割り込み処理を使用して 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 から関数を呼び出す特別な方法がありますか?

ありがとう!

4

3 に答える 3

4

長い呼び出しでは、ターゲットの完全な (32 ビット) アドレスが使用されます。これは、命令で 26 ビットのアドレスしかエンコードできず、PC 相対である可能性がある呼び出しとは異なりますjal(これが当てはまるかどうかは覚えていません)。長い呼び出しを行うには、アドレスを構築またはレジスタにロードしてから、そこに分岐します。

于 2012-12-13T23:59:30.153 に答える
4

jal frogger次のようなものに置き換えます。

  la    $t9, frogger
  jalr  $t9

JALRMIPS では絶対アドレスを使用します。

于 2012-12-14T23:33:29.837 に答える