2015-12-30 58 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