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
答案 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
然后我也建立一个堆栈帧,就像正常函数一样[保存所有其他更改的寄存器]并从最后弹出
我提到这个的原因是,异常处理程序必须保存它将更改的每个寄存器,并在退出时恢复原始值,如果它将返回基本代码(例如,它可能会捕获并修复溢出除外)。
对于处理断点也是如此。