如何在Assembly mips中从堆栈中推送和弹出?

时间:2015-12-30 14:40:31

标签: assembly mips mips32

我想在mips程序集中创建push和pop方法。这是java中的代码:

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:
    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.

1 个答案:

答案 0 :(得分:1)

MIPS ABI作为参考:

  

返回值是否存储在$ v0?

  

我是否必须将$ v0的内容移到另一个注册表中?

不,没有必要。 $ vX寄存器类似于$ tX寄存器,您不需要备份它们。调用者不是被调用者,如果需要关注那些寄存器,则需要负责备份这些寄存器。

PS:请注意,如果需要,您实际上可以使用任何其他寄存器甚至内存作为返回值。