MIPS异常打印无法正常工作

时间:2016-06-01 19:47:47

标签: exception assembly exception-handling mips

MIPS异常处理程序代码不工作:在下面的代码中,我尝试打印导致异常的指令地址(寄存器$ 14)和异常类型(寄存器$ 13)。我已经筋疲力尽了我能想到的每条路线。

错误消息给出:

  

“lw”:操作数太少或格式不正确。预期:lw $ t1,-100($ t2)

谢谢!

  mfc0 $k0,$14 # Coprocessor 0 register $14 has address of trapping instruction

    lw $a0, $k0 # address of string to print

    li $v0, 4 # Print String service

    syscall

    mfc0 $k0,$13 # Coprocessor 0 register $13 has type of exception

    lw $a0, $k0 # address of string to print

    li $v0, 4 # Print String service

    syscall

1 个答案:

答案 0 :(得分:0)

而不是:

lw <regdst>,<regsrc>

执行:

move <regdst>,<regsrc>

move是一个伪[最有可能]生成的伪操作:

addu <regdst>,<regsrc>,$zero

或者,也可以通过以下方式完成:

addiu <regdst>,<regsrc>,0

旁注:之前我已经写过一个完整的异常处理程序,所以请确保第一条指令是[或多或少]:

move $k0,$at

而且,epilog看起来像:

move $at,$k0
eret

然后我也建立一个堆栈帧,就像正常函数一样[保存所有其他更改的寄存器]并从最后弹出

我提到这个的原因是,异常处理程序必须保存它将更改的每个寄存器,并在退出时恢复原始值,如果它将返回基本代码(例如,它可能会捕获并修复溢出除外)。

对于处理断点也是如此。

相关问题