2015-05-30 2 views
0

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

Вот мой код

.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: 

ответ

0

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

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 

Вообще говоря, это зависит:

Смежные вопросы