2016-06-01 11 views
1

MIPS Exception Handler Code funktioniert nicht: Im folgenden Code versuche ich die Adressen der Anweisung auszudrucken, die die Ausnahme verursacht (register $ 14) und die Art der Ausnahme (register $ 13). Ich habe jede mögliche Route ausgeschöpft, die mir einfiel.MIPS Exception Printing funktioniert nicht

Die Fehlermeldung gibt:

"lw": Zu wenige oder falsch Operanden formatiert. Erwartet: lw $ t1, -100 ($ t2)

Vielen Dank!

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

Klicken Sie auf "Bearbeiten" unter Ihrer Frage, wählen Sie Ihren gesamten Code aus und klicken Sie auf die Schaltfläche mit den geschweiften Klammern, um ihn richtig zu formatieren. –

+1

Okay danke für den Tipp! –

Antwort

0

Statt:

lw <regdst>,<regsrc> 

Do:

move <regdst>,<regsrc> 

move ist eine pseudo-op das wird [höchstwahrscheinlich] erzeugen:

addu <regdst>,<regsrc>,$zero 

Oder, um es könnte auch gemacht werden mit:

addiu <regdst>,<regsrc>,0 

Randbemerkung: Ich habe ein vollständiger Exception-Handler vor geschrieben, so sicher sein, dass der erste Befehl [mehr oder weniger]:

move $k0,$at 

Und der Epilog sieht aus wie:

move $at,$k0 
eret 

ich auch dann einen Stapelrahmen wie für eine normale Funktion [Sa Ving alle anderen Register, die geändert werden] und Pop von ihm am Ende

Der Grund, warum ich dies erwähne, ist, dass der Ausnahmebehandler jedes Register speichern muss, das es ändern wird, und den ursprünglichen Wert beim Beenden wiederherstellen, wenn es zurückgeht der Basiscode (z Es könnte eine Überlauf-Ausnahme fangen und beheben.

Dies gilt auch [speziell] für die Behandlung von Breakpoints.