首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIPS寄存器$v0/$a0

MIPS寄存器$v0/$a0
EN

Stack Overflow用户
提问于 2013-08-13 18:38:53
回答 1查看 11.4K关注 0票数 2

我知道$v0, $v1$v0为32位,$v1为64位的函数结果寄存器。

我还了解到$ao-$a3是保存整型变量的函数参数寄存器。

我知道这两个函数都不会在函数调用中保留,但是我不明白的是,MIPS中有文字上的用法吗?在什么情况下我们需要使用这些寄存器?

EN

回答 1

Stack Overflow用户

发布于 2013-08-13 19:21:11

如果您计划调用其他使用MIPS ABI (应用程序二进制接口)的函数,则需要使用它们。这是一种让不同的代码模块就彼此接口的公共方式达成一致的方法。想象一下,如果每个程序员或编译器选择自己的一组寄存器来传递参数和返回值,会有多混乱。

让我们来看看C编译器为一小段代码生成了什么:

代码语言:javascript
复制
int multwoplusone(int arg)
{
    return arg*2 + 1;
}

int main()
{
    int i = 5;
    i = multwoplus1(i);

    return 0;
}

如果我们编译这段代码(并且只查看生成的程序集的相关部分),我们会得到:

代码语言:javascript
复制
multwoplusone:
    sll $2,$4,1  # $2 is $v0, $4 is $a0
    j   $31      # $31 is $ra
    addiu   $2,$2,1

...

main:
    ...

    li  $4,5            # 0x5
    lw  $25,%call16(multwoplus1)($28)
    .reloc  1f,R_MIPS_JALR,multwoplus1
1:  jalr    $25
    nop

如您所见,当main调用multwoplusone时,它首先将参数(5)放在$a0 ($4)中。然后,multwoplusone将该值左移一位(即将其乘以2),将结果保存在$v0 ($2)中,然后在返回给调用方时将延迟分支槽中的值加1。然后,调用者(在本例中为main)可以假定返回值为$v0,并根据需要对该值执行某些操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18206905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档