1

mips を使用したクラス学習アセンブリにいます。私は数値の配列のソートに取り組んでおり、メソッドが正しく機能していると思いますが、少し問題があります。完全にソートされたことを確認する方法がわかりません。ソートにはかなり初歩的な方法を使用していますが、これまでに学んだことはそれだけです。また、ソートされているかどうかを確認するために数値を出力する方法がわかりません。私はJavaなどに慣れているので、アセンブリは私をスピンに投げ込みます。これまでの私のコードは次のとおりです。

    .text
    .globl main
main:       la  $a0, Array             # sets the base address of the array to $a0
loop:       lw  $t0, 0($a0)             # sets $t0 to the current element in array
            lw  $t1, 4($a0)         # sets $t1 to the next element in array
            blt $t1, $t0, swap      # if the following value is greater, swap them
            addi    $a0, $a0, 4     # advance the array to start at the next location from last time
            j   loop                  # jump back to loop so we can compare next two elements

swap:       sw  $t0, 4($a0)         # store the greater numbers contents in the higher position in array (swap)
            sw  $t1, 0($a0)         # store the lesser numbers contents in the lower position in array (swap)
            li  $a0, 0                 # resets the value of $a0 back to zero so we can start from beginning of array
            j   loop                  # jump back to the loop so we can go through and find next swap

            .data

Array:      .word   14, 12, 13, 5, 9, 11, 3, 6, 7, 10, 2, 4, 8, 1 

助けてくれてありがとう!

4

3 に答える 3

3

このリンクは、 QTSPIMMARSなどの MIPS シミュレーターで画面に出力する方法を説明しています。

コードに関しては、いくつかのバグがありました。配列のベースアドレスが 0 に設定されているため、この行は最初の命令li $a0, 0によって行われた作業を上書きしています。代わりに、命令をループに移動して、配列全体を反復した後に のベースアドレスに適切にリセットする必要があります。、命令を削除します。また、プログラムが並べ替えを完了したときの条件を追加する必要があります。次のリビジョンをお勧めします (SPIM でテスト済み):la $a0, Arraylila$a0Arrayli

main:
    la  $t0, Array      # Copy the base address of your array into $t1
    add $t0, $t0, 40    # 4 bytes per int * 10 ints = 40 bytes                              
outterLoop:             # Used to determine when we are done iterating over the Array
    add $t1, $0, $0     # $t1 holds a flag to determine when the list is sorted
    la  $a0, Array      # Set $a0 to the base address of the Array
innerLoop:                  # The inner loop will iterate over the Array checking if a swap is needed
    lw  $t2, 0($a0)         # sets $t0 to the current element in array
    lw  $t3, 4($a0)         # sets $t1 to the next element in array
    slt $t5, $t2, $t3       # $t5 = 1 if $t0 < $t1
    beq $t5, $0, continue   # if $t5 = 1, then swap them
    add $t1, $0, 1          # if we need to swap, we need to check the list again
    sw  $t2, 4($a0)         # store the greater numbers contents in the higher position in array (swap)
    sw  $t3, 0($a0)         # store the lesser numbers contents in the lower position in array (swap)
continue:
    addi $a0, $a0, 4            # advance the array to start at the next location from last time
    bne  $a0, $t0, innerLoop    # If $a0 != the end of Array, jump back to innerLoop
    bne  $t1, $0, outterLoop    # $t1 = 1, another pass is needed, jump back to outterLoop

各 MIPS 命令の動作に関する追加の例と説明については、このリンクを確認してください。

于 2013-10-11T04:09:08.907 に答える