Assembly Mips: Runtime Exception at 0x004000ac: store address not Aligned on word Boundary 0x1001040e

Asked

Viewed 117 times

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
No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.