Implementation of the strcpy function of C in MIPS using the MARS simulator

1

Why does not the code below 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
    
asked by anonymous 24.10.2016 / 20:42

1 answer

2

Apparently you were loading source and destination as words, not their addresses. For this it is necessary to use la instead of lw . Doing this and a few more changes 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
    
06.11.2016 / 17:25