Implementation of C strcpy function in MIPS using MARS simulator

Asked

Viewed 436 times

1

Why the code below does not work?

Error in strcpy.asm line 9: Runtime Exception at 0x00400014: fetch address not Aligned on word Boundary 0x00000001

.text
.globl main

main:
    lw  $a0, destino        # Carrega o ponteiro destino para a0
    lw  $a1, origem         # Carrega o ponteiro origem para a1
    li  $v0, 0              # Número de ítens copiados = 0
loop:
    lw  $s0, 0($a1)         # s0 = origem[0]
    beq $s0, $zero, end     # Chegou no final da string de origem (origem[0] = 0)
    sw  $s0, ($a0)          # destino[0] = origem[0]
    sll $a0, $a0, 2         # destino++
    sll $a1, $a1, 2         # origem++
    addi    $v0, $v0, 1     # copiados++
    j   loop
end:

    .data

origem:  .word 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x00
destino: .word 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

1 answer

2


Apparently you were loading origin and destination as words, and not their respective addresses. For this it is necessary to use la instead of lw. Doing this and a few more changes, it works:

    .text
    .globl main

main:
    la  $a0, destino        # Carrega o ponteiro destino para a0
    la  $a1, origem         # Carrega o ponteiro origem para a1
    li  $v0, 0               # Número de ítens copiados = 0
loop:
    lw  $s0, ($a1)          # s0 = origem[i]
    beq $s0, 0, end         # Chegou no final da string de origem   (origem[0] = 0)
    sw  $s0, ($a0)          # destino[i] = origem[i]
    add $a0, $a0, 4         # destino++
    add $a1, $a1, 4         # origem++
    addi    $v0, $v0, 1     # copiados++
    j   loop
end:

    .data
origem:  
    .word 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x00
destino:
    .word 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

Browser other questions tagged

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