2014-10-26 117 views
0

這是從課程中的作業分配。該項目的目標是在某個樞軸點分割2個數組,並從中創建一個「子」數組。所以,如果你的支點是11,你的兩個數組:將字符數組內容複製到另一個陣列[MIPS]

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函數,就不會打印任何內容。

回答

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

+0

謝謝你的迴應。在你回答之前,我確實知道了這一點,但這是正確的! – Ybarra 2014-10-29 06:59:46

相關問題