Скопируйте элементы массива в другой массив в сборке MIPS

Мне нужно создать программу, которая заполняет массив 30 целыми числами, введенными с клавиатуры. Затем пользователь набирает «c», чтобы скопировать массив в другой массив. Я сделал первый шаг, но мне не удается скопировать массив в еще один.

Вот мой код

    .data
msg1: .asciiz "> "
msg2: .asciiz "type 'c' to copy \n>"

.align 2
array: .space 400
.text

main:

    la $t3 array
    loop:


        la $a0, msg1 #output message 1
        li $v0, 4
        syscall
        li $v0, 5 #read integer input
        syscall
        move $t0, $v0
        beq  $t0, -99, endloop #loop until user types -99
        beq  $t1,30,endloop #get user input up to 30 times 

        addi $t1, $t1, 1 #counter
        sw $t0,($t3)
        addi $t3,$t3,4

        b loop #loop until it reaches 30 

    endloop:

    la $a0, msg2 #output message 2
    li $v0, 4
    syscall

    li $v0, 12 #read character input
    syscall


    beq $v0, 'c', COPY

    j NEXT

    COPY:


    NEXT:

person Antonis sinotnA    schedule 30.05.2015    source источник


Ответы (1)


Самый примитивный способ это сделать

la $t1, dst_array
la $t3, src_array
addu $t0, $t3, 30*4     # setup a 'ceiling'


copy_loop:
    lw $at, 0($t3)
    sw $at, 0($t1)

    addu $t1, $t1, 4
    addu $t3, $t3, 4

    blt $t1, $t0, copy_loop # if load pointer < src_array + 30*4

Однако некоторые реализации MIPS не используют переадресацию, и поэтому вам придется подождать, пока $at не будет записано обратно. Для этого может быть либо ларь (от которого можно избавиться),

subu $t1, $t1, 4
copy_loop:
    lw $at, 0($t3)
    addu $t1, $t1, 4
    addu $t3, $t3, 4
    sw $at, 0($t1)

или слот задержки загрузки, который обычно занимает 1 цикл, что делает его

copy_loop:
    lw $at, 0($t3)
    addu $t1, $t1, 4

    sw $at, 0($t1)
    addu $t3, $t3, 4

В общем, зависит :)

person user35443    schedule 30.05.2015