2015-04-23 52 views
0

我無法弄清楚這裏出了什麼問題。我試圖在內存中存儲10個整數,然後按順序訪問它們中的每一個。這裏是我當前的代碼:程序集中的內存地址

.data # Data declaration section 
strInMsg: .asciiz "Please Enter An Integer:" 

.align 2 
memAddr: .space 40 

.text 
main: #Get 10 integers and store them in $t0 
la $t0, memAddr #$t0 - 40 = first element in array 
add $t3, $zero, $zero 
add $t1, $zero, 10 

loop: la $a0,strInMsg 
add $v0, $zero, 4 
syscall 
add $v0, $zero, 5 
syscall 
sw $v0, 0($t0) 
add $s1, $s1, 4 
sub $t1, $t1, 1 
bgtz $t1, loop 

#la $a0, memAddr 
#sub $t0, $t0, 40 
#j QuickSort 

sub $t0, $t0, 40 #<--- PROBLEM LINE 
lw $t3, 0($t0) 
add $a0, $t3, $zero 
addi $v0, $zero, 1 
syscall 

會發生什麼是正確的得到所有10個整數從用戶,如果我擺脫這個問題行的,將打印的最後一個元素如預期,因爲這是存儲在內存地址在$ t0。我以爲我可以從它減去40,使其回到前面,但它只是輸出0.我怎樣才能得到第一個元素?

+0

像'$ t0'和'$ t1'這樣的臨時寄存器將不會保留在系統調用中。改用$ sxxx寄存器。 – markgz

回答

0

你永遠不會在循環內增加$t0,所以你會寫所有的值到同一個地址,當你在循環結束後減去40時,你最終指向memAddr - 40
也許行add $s1, $s1, 4本意是說add $t0, $t0, 4

+0

對不起,我在那裏有一段時間,所以我從來沒有標記爲答案,但是是的,你是正確的謝謝你 – user3831011

0

在讀入數據之前,您只能在循環開始時遞增地址,所以不應該像-36這樣的東西?

+0

這就是我想的,但從4到36的任何數字減去仍然給0。沒有多大意義。 – user3831011