Моя программа будет читать из файла .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)