0

これはクラスの宿題です。プロジェクトの目標は、あるピボット ポイントで 2 つの配列を分割し、そこから「子」配列を作成することです。したがって、ピボット ポイントが 11 で、2 つの配列が次の場合:

1111111111111111
abcdefghijklmnop

子出力は次のようになります。

111111111111mnop

今、私は子供を印刷するのに苦労しています。これまでの私のソースコードは次のとおりです。

.globl main

.data
parentOne: .space 17
parentTwo: .space 17
split: .word 0
childOne: .space 17
childTwo: .space 17
space: .asciiz "\n"

.text
main:
jal getInputOne
jal getInputTwo
jal getIndex
jal makeChildren
jal printChildOne

j endMain

##############################################################################################################
getInputOne:
li $v0, 8
la $a0, parentOne
li $a1, 17
syscall

addi $v0, $zero, 4  # print_string syscall
la $a0, space       # load address of the string
syscall
jr $ra
##############################################################################################################
getInputTwo:
li $v0, 8
la $a0, parentTwo
li $a1, 17
syscall
addi $v0, $zero, 4  # print_string syscall
la $a0, space       # load address of the string
syscall
jr $ra
##############################################################################################################
getIndex:
li $v0, 5
syscall
sw $v0, split
jr $ra
##############################################################################################################
makeChildren:
la $s0, parentOne
la $s1, parentTwo
la $a0, childOne
la $a1, childTwo

li $s2, 0       #intial counter
li $s3, 17      #end counter
lw $s4, split       #split point

childLoop:
    slt $t1, $s2, $s3
    beq $t1, $0, endChildLoop
    if:
        slt $t1, $s2, $s4   # i<pivot
        beq $t1, $0, else   # not less than pivot
        lb $a0, ($s0)       #load childOne[i] <-- parentOne[i]
        lb $a1, ($s1)       #load childTwo[i] <-- parentTwo[i]
        j endif
    else:
        lb $a0, ($s1)       #load childOne[i] <-- parentTwo[i]
        lb $a1, ($s0)       #load childTwo[i] <-- parentOne[i]
    endif:
    #li $v0, 11     #print character       
    #syscall

    addi $s0, $s0, 1    #increment parent1 array
    addi $s1, $s1, 1    #increment parent2 array
    addi $a0, $a0, 1    #increment child array
    addi $a1, $a1, 1    #increment child2 array
    addi $s2, $s2, 1    #counter++
    j childLoop
endChildLoop:
la $a0, childOne
li $v0, 1
syscall
jr $ra

##############################################################################################################
printChildTwo:
la $a0, childOne
li $v0, 4
syscall
jr $ra

endMain:

何が起こっているのかというと、実際には childOne レジスタに何も保存されていないと思いますが、その理由はわかりません。childOne アドレスを $a0 レジスタにロードしましたが、プログラムが printChildOne 関数に移動すると、何も出力されません。

4

1 に答える 1

0

ここでのコメントは、命令が実際に行うことと一致しません。

lb $a0, ($s0)   #load childOne[i] <-- parentOne[i]

その命令は に新しい値を設定するだけで、指して$a0いたメモリ位置には何も書き込みません。$a0

Cでこれを行った場合のようです:

char *a0 = childOne;
...
a0 = (char*) parentOne[i];

これは明らかに次と同じではありません:

*a0 = parentOne[i]; 

あなたが望むのは次のようなものです:

lb $t0, ($s0)       # temp = parentOne[i]
sb $t0, ($a0)       # childOne[i] = temp
# similarly for $a1

あなたの質問のコードには、ここにもタイプミスがあるようです:

printChildTwo:
la $a0, childOne

そのラベルは であるべきだと思いますprintChildOne

于 2014-10-27T16:50:34.053 に答える