Как получить доступ к «источнику» данных .word, увеличить каждое число, назначить «назначение»?

Попытка получить доступ и перебрать каждое число в «источнике», пока я не нажму 0, а затем сохранить эти числа в тот же индекс «назначения».

Пробовал: много чего, не смог правильно получить доступ к данным .word. непонятно почему..

.data
source:     .word   3, 1, 4, 1, 5, 9, 0
dest:       .word   0, 0, 0, 0, 0, 0, 0
countmsg:   .asciiz " values copied. "

.text

main:   add $s0,    $0,     $ra # Save our return address
    la  $t0,    source
    la  $t1,    dest


loop:   lw  $t3,    ($t0)       # read next word from source
    beq $t3,    $zero,  loopend # loopend if word is 0
    addi    $t4,    $t4,1       # increment count words copied
    sw  $t3,    0($t1)      # write to destination
    addi    $t0,    $t0,1       # advance pointer to next source
    addi    $t1,    $t1,1       # advance pointer to next dest
    j loop
loopend:

    move    $a0,    $v0     # We want to print the count
    li  $v0,    1
    syscall             # Print it
    la  $a0,    countmsg    # We want to print the count msg
    li  $v0,    4
    syscall             # Print it
    li  $a0,    0x0A        # We want to print '\n'
    li  $v0,    11
    syscall             # Print it
    jr  $s0         # Return from main. $ra in $s0

не выровнено по границе слова, не знаю, как выровнять итерацию


person Tom Clark    schedule 13.04.2019    source источник


Ответы (1)


Проблема в том, как вы увеличиваете указатели массива. word имеет ширину 4 байта, и для доступа к следующему элементу требуется добавить 4 к адресу. Это определенно объясняет, почему у вас есть невыровненный доступ.

Есть еще пара проблем.

main — это специальная функция, и вы не должны возвращаться из main, а вызывать exit() (syscall 10)

И количество слов находится в $t4 и напечатано неправильно.

Я также изменил ваш цикл, чтобы иметь в нем уникальную ветвь и подавить последний прыжок. Всегда лучше выполнять тест в конце цикла в режиме do-while.

Вот исправленная версия:

.data
source:     .word   3, 1, 4, 1, 5, 9, 0
dest:       .word   0, 0, 0, 0, 0, 0, 0
countmsg:   .asciiz " values copied. "

.text

main:   ### main is a special function. Should not save $ra
            #### $ra add $s0,    $0,     $ra # Save our return address
    la  $t0,    source
    la  $t1,    dest

loop:    lw  $t3,    ($t0)   # read next word from source
    addi $t4,    $t4,1       # increment count words copied
    sw   $t3,    0($t1)      # write to destination
    addi $t0,    $t0,4       # advance pointer to next source
        ### increment must be sizeof(word), ie 4
    addi $t1,    $t1,4       # advance pointer to next dest
    bne  $t3,$zero, loopend # loopend while word is != 0
        ### no longer required    j loop
loopend:

    move $a0,    $t4    # We want to print the count
                            # which is in $t4    
    li  $v0,    1
    syscall             # Print it
    la  $a0,    countmsg    # We want to print the count msg
    li  $v0,    4
    syscall             # Print it
    li  $a0,    0x0A        # We want to print '\n'
    li  $v0,    11
    syscall             # Print it
    li  $a0,    0       # EXIT_SUCCESS
    li  $v0,    10
    syscall             # exit
##    jr  $s0         # NO Return from main. use exit syscall 

person Alain Merigot    schedule 13.04.2019