我有一个问题我在MARS上做了一个大学项目并且运行正常但是我们的老师告诉我们该程序必须在QTSPIM上运行,所以我的问题是哪些错误不允许我的程序运行在QTspim上运行?
错误是"在PC = 0x00400154 ecc时出现异常。"
代码正在读取名为Sequenza的txt文件(一系列二进制数字),它在字符串中搜索带符号幅度和用户输入的数字的补码。
.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: