MIPS [Address error] - сравнение символов строки в инструкции Switch - PullRequest
0 голосов
/ 17 марта 2019

Моя программа будет читать из файла .txt массив максимум из 5 символов, от 'A' до 'E'.

После того, как программа прочитала массив, существует цикл while, который останавливает цикл, когда он достигает предела в 5 символов, и инструкция switch, где, если анализируемый символ является одной из 5 буквот 'A' до 'E', программа переходит к определенной метке (пример algoA).

Когда я пытаюсь "сканировать" bufferKey QtSpim, выдает ошибку:

  Exception 4  [Address error in inst/data fetch]  occurred and ignored

Я пытаюсь понять, что происходит, но я не понимаю.

Это код:

.data
    fnf:        .asciiz "The file was not found!"
    donemsg:    .asciiz "Encoding complete!"
    key:        .asciiz "chiave.txt"
    bufferKey:  .space  5

.text
.globl main

main:

# Open KEY File
openKey:
    li     $v0, 13 
    la     $a0, key
    li     $a1, 0
    li     $a2, 0
    syscall
    move   $t7, $v0
    blt    $v0, 0, err

# Read KEY File
readKey:
    li      $v0, 14
    move    $a0, $t7    
    la      $a1, bufferKey
    li      $a2, 5
    syscall


decodeKey:

    li      $s3, 0          # i = 0 
    la      $s6, bufferKey  # $s6 is the Buffer
    addi    $s5, $v0, 1

loop:   ### WHILE ###
    add     $t1, $s3, $s3
    add     $t1, $t1, $t1
    add     $t1, $t1, $s6
    lw      $t0, 0($t1)

    ### SWITCH ###

    ## CASE DEFAULT ##
    blt     $t0, 0x41, done
    bgt     $t0, 0x45, done

    ## CASE A #
    beq     $t0, 0x41, algoA
    ## CASE B ##
    beq     $t0, 0x42, algoB
    ## CASE C ##
    beq     $t0, 0x43, algoC
    ## CASE D ##
    beq     $t0, 0x44, algoD
    ## CASE E ##
    beq     $t0, 0x45, algoE

    ## End of cycle ##
    add     $s3, $s3, 1
    beq     $s3, $s5, done
    j   loop


# Error
err:
    li      $v0, 4
    la      $a0, fnf
    syscall 

# Done
done:
    li      $v0, 10
    syscall

# Algo A
algoA:
    li      $v0, 4
    la      $a0, 0x41
    syscall         
    j   loop

# Algo B
algoB:
    li      $v0, 4
    la      $a0, 0($t1)
    syscall         
    j   loop

# Algo C
algoC:  
    li      $v0, 4
    la      $a0, 0($t1)
    syscall         
    j   loop

# Algo D
algoD:
    li      $v0, 4
    la      $a0, 0($t1)
    syscall         
    j   loop

# Algo E
algoE:
    li      $v0, 4
    la      $a0, 0($t1)
    syscall         
    j   loop

Строка, в которой QtSpim найденоошибка в loop в инструкции

lw $t0, 0($t1)

...