0

所以我一直在研究一个可以删除数组中重复值的程序。我有它,所以它打印出所有重复的值,我只是不知道如何实际删除它们(将它们向下移动)。这是我到目前为止所拥有的。注意:我的问题是在“壁球”功能

        .text
test:
    la  $a0,info    # put address of array in $a0
    li  $a1,8       # put length of array in $a1 (words, not bytes)
    jal squash      # call the function

    la      $s0,info    # get address of array
    move    $s1,$v0     # save size of array
loop:
    ble $s1,$0,done
    lw  $a0,0($s0)  # get the next value from the result array
    li  $v0,1       # print it
    #syscall
    la  $a0,eol     # print end of line
    li  $v0,4
    syscall
    addi    $s1,$s1,-1  # decrement count
    addi    $s0,$s0,4   # advance pointer to next value
    b   loop        # print the next value (if one)

done:
    li  $v0,10      # exit
    syscall

# squash out duplicates
#
# $a0 = address of the first element of the array
# $a1 = the number of values (not bytes) in the array
#
# $v0 set to the number of values after duplicates have been removed
squash:
    move    $s0, $a0 #move address to s0
    move    $s1, $a1 #move size to s1
read:
    ble $s1, $0, donea  # (while x > 0) keep looping
    lw  $t0,0($s0)  # get the next 2 value from the result array
    lw  $t1,4($s0)  
    beq $t0, $t1, shift #Branch if two values are equal 
    b   end_if
end_if:
    addi    $s1,$s1,-1  # decrement count (size of arary)
    addi    $s0,$s0,4   # advance pointer to next value
    b   read

shift:
    lw  $a0, 0($s0)
    li  $v0, 1
    syscall
    addi    $s1,$s1,-1  # decrement count (size of arary)
    addi    $s0,$s0,4   # advance pointer to next value
    b   read

donea:              # end of 1st loop

doneb:              #end of 2nd loop    



    jr  $ra

    .data
eol:    .asciiz "\n"
info:
    .word   1
    .word   2
    .word   2
    .word   4
    .word   7
    .word   7
    .word   7
    .word   9
4

0 回答 0