2
In this code, I am having trouble using the sw command. Always an error appears as follows:
Runtime Exception at 0x004000ac: store address not Aligned on word Boundary 0x1001040e
Honestly, I’m trying hard to learn Assembly mips, but I stopped there. I can’t see the error. Could someone help me, please?
.data
arquivo: .asciiz "string.in.txt"
buffer_in: .space 1024 #tamanho suficiente para as 10 strings de 100 caractere
buffer_menor: .space 80 #Salva endereços das menores strings
buffer_maior: .space 80 #salva endereços das maiores strings
buffer_out: .space 1100 #se todas as strings tiverem o mesmo tamanho
.text
#abre arquivo
li $v0, 13
la $a0, arquivo
li $a1, 0
li $a2,0
syscall #chama a syscall(abre arquivo)
move $s1, $v0 #Salva o retorno da syscall abre arquivo (descritor do arquivo) em $s1
#le_arquivo
li $v0, 14
move $a0, $s1
la $a1, buffer_in
li $a2,1100
syscall #chama a syscall(lê arquivo)
#fecha arquivo
li $v0, 16
add $a0, $zero, $s1 #passa descritor do arquivo contido em $s1 como argumento para a0
syscall #chama a syscall(fecha arquivo)
#marca endereço dos dados lidos em $s1
la $s1, buffer_in #não usaremos mais o descritor do arquivo, então carregaremos $s1 com o endereço inicial do buffer
li $s3,0 #cotador de tamanho
li $s4,100 #menor tamanho (carregado com o maior possível)
li $s5,0 #maior tamanho (carregado com o menor possível)
#percorre buffer_in para encontrar a menor e a maior string
loop_buscastrings:
lb $s2,($s1) #carregaremos $s2 o byte do endereço $s1
beq $s2, 0x0d, fim_da_string
beq $s2, 0x00, fim_do_arquivo
add $s1, $s1, 1 #incrementa endereço
add $s3, $s3, 1 #conta tamanho da string
j loop_buscastrings
#achou o fim da string, tem que salvar ela num buffer de saída
fim_da_string:
#se é a primeira string
beq $s4, 100, primeira_string #checa se é a primeira string
bgt $s3, $s5, maior_que_maior #checa se é maior que a maior
beq $s3, $s5, igual_que_maior #checa se igual que a maior
blt $s3, $s4, menor_que_menor #checa se é menor que a menor
beq $s3, $s4, igual_que_menor #checa se é igual a menor
#se estiver entre a maior e menor, vai buscar de novo
add $s3, $zero, $zero #zera contador de tamanho
add $s1, $s1, 2 #pula os caracteres /r e /n
j loop_buscastrings
#se for primeira string
primeira_string:
sub $t1, $s1, $s3 #carrega t1 com o endereco inicial da string
la $t2, buffer_menor #carrega t2 com o endereco do buffer_menor
sw $t1, ($t2) #guarda o byte de endereco de t1 no buffer menor
la $t2, buffer_maior #carrega t2 com o endereco do buffer maior
sw $t1, ($t2) #guarda o byte de endereco de t1 no buffer maior
move $s4, $zero #zera o registrador de maior tamanho
add $s4, $zero, $s3 #guarda o tamanho da string no registrador de menor tamanho
add $s5, $zero, $s3 #guarda o tamanho da string no registrador de menor tamanho
add $s3, $zero, $zero #zera tamanho string
add $s1, $s1, 2 #pula o /r e /n pra próxima string
j loop_buscastrings #volta a procurar mais strings
#apaga o buffer da maior e reescreve o ponteiro da nova maior
maior_que_maior:
la $s6, buffer_maior
move $s7, $zero
loop_apaga_buffer_maior:
sw $zero, ($s6)
add $s6, $s6, 1
add $s7, $s7, 1
blt $s7,80, loop_apaga_buffer_maior
#guarda endereço da primeira maior
escreve_novo_maior:
sub $t1, $s2, $s3
sw $t1, buffer_maior
move $s5, $s3 #carrega o novo valor da maior string
add $s3, $zero, $zero #zera contador de tamanho
add $s1, $s1, 2 #pula os caracteres /r e /n
j loop_buscastrings #volta a buscar as strings
##apaga o buffer da menor e reescreve o ponteiro da nova menor
menor_que_menor:
la $s6, buffer_menor
move $s7, $zero
loop_apaga_buffer_menor:
sw $zero, ($s6)
add $s6, $s6, 1
add $s7, $s7, 1
blt $s7,80, loop_apaga_buffer_menor
#guarda endereço da primeira menor
escreve_novo_menor:
sub $t1, $s2, $s3
sw $t1, buffer_menor
move $s4, $s3 #carrega o novo valor da menor string
add $s3, $zero, $zero #zera contador de tamanho
add $s1, $s1, 2 #pula os caracteres /r e /n
j loop_buscastrings #volta a buscar as strings
igual_que_maior:
add $s3, $zero, $zero #zera contador de tamanho
add $s1, $s1, 2 #pula os caracteres /r e /n
j loop_buscastrings
igual_que_menor:
add $s3, $zero, $zero #zera contador de tamanho
add $s1, $s1, 2 #pula os caracteres /r e /n
j loop_buscastrings
fim_do_arquivo:
la $s6 buffer_menor
la $s7 buffer_maior