2015-12-30 89 views
2

我想在mips程序集中創建push和pop方法。以下是一個Java代碼:如何在Assembly mips中從堆棧中推送和彈出?

static int pop() 
{ 
    if (i == 0) { 
     System.out.println ("Invalid Postfix"); 
     System.exit(1); 
    } 
    i--; 
    return (p[i]); 
} 

static void push (int result) 
{ 
    if (i == MAX) { 
     System.out.println ("Too many tokens"); 
     System.exit(1); 
    } 
    p[i] = result; 
    i++; 
} 

到目前爲止,我已經創建了push方法:

push: 
    beq $s1, $s0, error_overflow 
    sw $t2 , stack($t7)   # p[i] = result 
    addi $t7, $t7, 4    # go to space for next int 
    addi $s1, $s1, 1    # i++ 

    jr $ra 

但是我不知道怎麼翻譯的return (p[i])彙編語句。返回值是否存儲在$v0?我需要將$v0的內容移到另一個註冊表嗎?任何關於這個主題的谷歌搜索只會讓我困惑。任何幫助?

如果我在MIPS代碼混淆這裏的小抄:

$s0 = MAX 
$s1 = stack pointer 
$t7 = where I will store the numbers 
$t2 = the number(result) that will be stored. 
+0

與其使用'stack($ t7)',我會使用指定爲堆棧指針的寄存器(即'$ sp' aka'$ r29')。如果需要設置'$ sp',請在開始時執行'la $ sp,stack_high'。然後,使用'sw $ whatever,0($ sp)'等。 –

回答

1

服用MIPS ABI作爲參考:

存儲在$ V0返回值?

是的。

我需要將$ v0的內容移動到另一個註冊表嗎?

不,這不是必需的。 $ vX寄存器就像$ tX寄存器,你不需要備份它們。如果調用者關心他們,那麼調用者不是被調用者需要照顧備份這些寄存器。 PS:請注意,如果需要,您實際上可以使用任何其他寄存器或內存作爲返回值。

+0

Thanks @ m0skit0!這是否意味着我的代碼會看起來像這樣? BEQ S1,$零,error_underflow LW $ V0,棧($ T7) 阿迪$ T7,T7 $,-4 阿迪$ S1,$ S1,-1#我 - –

+0

如果'push'是正確的,那麼是的。 – m0skit0