2013-11-03 32 views
0

我想知道,在單個函數中,當我通過beq或bne去別的地方時,創建了一個新的堆棧,或者因爲我仍然在同一個函數中,我的堆棧繼續?讓我通過一個例子來解釋我的問題。 在測試部分之前,我已經將$ t3的內容疊加到堆棧中,並且在測試後我想要達到它。是否有可能?在此先感謝訪問存儲在堆棧中的值MIPS

main: 
     addi $sp, $sp, -1 
     sb $t3,($sp)  #t3 stores value 1 and I stored it into stack by this line 
     beq $t1 $t2 test #assume it holds 


    test: 
     lb $t7,($sp)  # now I want to take 1 into $t7 here.Is it possible ?? 
     addi $sp, $sp, 1 
     la $t7,($a0) 
     li $v0,4 
     syscall 
     li $v0,10 
     syscall 

回答

0

首先,如果你想調用一個函數,使用跳轉而不是分支。分支通常用於ifs,whiles等。有特殊的跳轉指令,如jalr(跳轉和鏈接寄存器)專門用於此目的,因爲它在$ra中存儲返回地址(因此您可以從函數返回返回)。

至於你的問題,當然你可以訪問。堆棧只是一個內存區域。但是你在做什麼實際上是將一個參數傳遞給函數。 MIPS ABI聲明這應該通過$aX寄存器完成,而不是堆棧。

編輯:我看到你對這個堆棧感到困惑。有關MIPS堆棧的更多詳細信息,請參閱this(在其他架構中也非常類似)。

+0

我不使用函數在我的代碼? – caesar

+0

test是一個你用一個參數調用的函數。在彙編中,沒有單獨的函數語法,而是使用它們的方式來使它們起作用。無論如何,你爲什麼不使用$ t3的值並將其複製到$ t7中? '或$ t7,$ t3,$ t3' – m0skit0

+0

當我去測試時,我是否會放棄我的堆棧:label?我的意思是我可以繼續從堆棧中的相同點? – caesar