在MARS上运行但未在Qtspim

时间:2015-06-21 16:08:17

标签: assembly mips compatibility mars-simulator qtspim

我有一个问题我在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: 

0 个答案:

没有答案