Как мне получить доступ к данным .word «источник», приращение к каждому номеру, присвоить «назначение»? - PullRequest
0 голосов
/ 13 апреля 2019

Попытка доступа и итерации по каждому номеру в «источнике», пока я не достигну 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

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

1 Ответ

0 голосов
/ 13 апреля 2019

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

Есть несколько других проблем.

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

И количество слов в $t4 не было напечатано правильно.

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

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

.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 

...