0

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: 
4

0 に答える 0