0

我必须制作一个程序,用从键盘输入的 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:
4

1 回答 1

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

一般来说,这取决于:)

于 2015-05-30T18:42:37.797 回答