MARS で作成した大学のプロジェクトは問題なく動作しますが、先生からプログラムは QTSPIM で実行する必要があると言われたので、QTspim でプログラムを実行できないエラーはどこにあるのでしょうか?
エラーは「PC=0x00400154 ecc で例外が発生しました..」です。
このコードは、Sequenza と呼ばれる txt ファイル (2 進数のシーケンス) を読み込んでおり、ユーザー入力から符号付きマグニチュードと数値の 1 の補数を文字列で検索します。
.data
file: .asciiz "c:/sequenza.txt"
fBuffer: .space 1024
stringB: .asciiz "Sequenza : "
stringI: .asciiz "Inserisci un numero -511<=n<=511 :"
stringA: .asciiz "\n"
stringE: .asciiz "\n valore inserito non corretto \n \n "
stringH: .asciiz "valore inserito:"
stringF: .asciiz "completato"
stringV: .asciiz " "
stringMS: .asciiz "\n Sequenze Modulo e Segno :"
stringC1: .asciiz "\n Sequenze Complemento a 1 :"
stringNC: .asciiz " Nessuna occorrenza identificata"
outputf: .asciiz " "
outputg: .asciiz " nessuna occorrenza"
array: .space 11
.text
main: addi $t5,$zero,511 # limiti
addi $t6,$zero,-511
# lettura del file
#returns: pointer to file's text in $a1
openFile:
li $v0, 13 # system call for open file
la $a0, file #fin is the file name
li $a1, 0 # 0 means 'read'
li $a2, 0
syscall # open file
move $t8, $v0 # save the file descriptor
#read from file
li $v0, 14 # system call for read from file
move $a0, $t8 # file descriptor
la $a1, fBuffer
li $a2, 1024 # hardcoded buffer length
syscall # read from file
move $a3,$v0 # sposta in $s0 la lunghezza della srtinga
la $a0,stringB #carica la stringa stringz(per andare a capo)in $a0
li $v0,4 #codice di stampa sul terminale =4
syscall
addi $t9,$a3,-8
la $a0,fBuffer #carica la stringa stringz(per andare a capo)in $a0
li $v0,4 #codice di stampa sul terminale =4
syscall
la $a0,stringA #carica la stringa stringz(per andare a capo)in $a0
li $v0,4 #codice di stampa sul terminale =4
syscall
#inizio con richiesta inserimeno input
start:
la $a0,stringI #carica la stringa stringz(per andare a capo)in $a0
li $v0,4 #codice di stampa sul terminale =4
syscall
li $v0,5 #codice letture intero da console =5
syscall #legge il valore inserito e lo colloca in $v0
move $s3,$v0
addi $s4,$zero,2
add $t0,$zero,$s3
bgt $t0,$t5,Errore
blt $t0,$t6,Errore
li $v0, 9 # richiamo la procedura dello "sbrk"
addi $a0, $zero, 40 # creo spazio necessario (10 celle)
syscall
add $s2,$zero,$v0
la $a0,stringMS #carica la stringa stringz(per andare a capo)in $a0
li $v0,4 #codice di stampa sul terminale =4
syscall
convert: remu $t3,$t0,$s4
move $a0,$t3
sb $a0,36($s2)
div $t0,$t0,$s4
subu $s2,$s2,4
beqz $t0,postconvert
addi $s6,$s6,1
j convert
negativo: addi $s0,$zero,1
sb $s0,0($s2)
addi $s0,$s0,1
j mod
postconvert:
la $t7,fBuffer #indirizzo di fBuffer e $t7
li $v0, 9 # richiamo la procedura dello "sbrk"
addi $a0, $zero, 100 # creo spazio necessario (4 celle)
syscall
add $s1, $v0, $zero
addi $t1,$zero,1 # azzero t1
loop: lb $t6,($t7) # leggo un carattere della stringa (pseudoistruzione)
addu $t6,$t6,-48
sb $t6,($s1)
beq $t1,$a3,postloop # se è zero ho finito (pseudoistruzione)
add $t7,$t7,1 # incremento la posizione sulla stringa
add $t1,$t1,1
add $s1,$s1,4
j loop
postloop: addu $s2,$zero,268697600
addu $s1,$zero,268697640
add $s1,$s1,$t4
add $t4,$t4,4
add $t3,$zero,$zero
addi $t0,$t0,1
beq $t0,$t9,c1
bltz $s3,negativo
mod: lb $t1,0($s1)
lb $t2,0($s2)
bne $t1,$t2,postloop #c'è da cambiare l'offset
addi $t3,$t3,1
addi $s1,$s1,4
addi $s2,$s2,4
beq $t3,10,sequenzaok
j mod
sequenzaok: add $s5,$s5,1
move $a0,$t0
li,$v0,1
syscall
la $a0,stringV #carica la stringa stringz(per andare a capo)in $a0
li $v0,4 #codice di stampa sul terminale =4
syscall
j postloop
sequenzaok2:
move $a0,$t0
li,$v0,1
syscall
la $a0,stringV #carica la stringa stringz(per andare a capo)in $a0
li $v0,4 #codice di stampa sul terminale =4
syscall
j control
c1: addi $s0,$zero,0
sb $s0,0($s2)
beqz $s5,nocaso
c1x: addu $s2,$zero,268697600
addu $s1,$zero,268697640
add $t0,$zero,$zero
add $t1,$zero,$zero
add $t2,$zero,$zero
add $t4,$zero,$zero
la $a0,stringC1 #carica la stringa stringz(per andare a capo)in $a0
li $v0,4 #codice di stampa sul terminale =4
syscall
loopcs: beq $t2,10,control
addi $t2,$t2,1
lb $t0,36($s2)
beqz $t0,piu1
beq $t0,1,meno1
loopc1: sb $t0,36($s2)
add $t0,$zero,$zero
addi $s2,$s2,-4
j loopcs
piu1: addi $t0,$t0,1
j loopc1
meno1: subu $t0,$t0,1
j loopc1
control: addu $s2,$zero,268697600
addu $s1,$zero,268697640
add $s1,$s1,$t4
add $t4,$t4,4
add $t3,$zero,$zero
addi $t0,$t0,1
beq $t0,$t9,c2
realc1: lb $t1,0($s1)
lb $t2,0($s2)
bne $t1,$t2,control #c'è da cambiare l'offset
addi $t3,$t3,1
addi $s1,$s1,4
addi $s2,$s2,4
beq $t3,10,sequenzaok2
j realc1
nocaso: la $a0,stringNC #carica la stringa stringz(per andare a capo)in $a0
li $v0,4 #codice di stampa sul terminale =4
syscall
j c1x
Errore:
la $a0,stringE #carica la stringa stringz(per andare a capo)in $a0
li $v0,4 #codice di stampa sul terminale =4
syscall
j start
c2: