2

我们都知道通常一个程序只会返回一个值,但我注意到我们有两个值返回寄存器$v0$v1MIPS。我看到的代码都只有$v0but $v1,而且我还没有找到任何使用的汇编语言示例代码$v1

谁能告诉我为什么我们在 MIPS 中有两个 $v 寄存器,并向我展示一个何时可以使用它的示例?

4

3 回答 3

3

有很多用途

  • 如@Martin Rosenau 所述,返回两倍于寄存器长度的值(MIPS32 中的 64 位值和 MIPS64 中的 128 位值)

    long long mult(int x, int y) {
        return  (long long)x * y;
    }
    

    输出组件

    mult(int, int):
        mult    $4,$5
        mflo    $2
        mfhi    $3
        j       $31
        nop
    
  • 返回适合像这样的 2 个寄存器的结构

    typedef struct {
        int a, b;
    } ret_struct2x32;
    
    ret_struct2x32 return_struct2x32() {
        return ret_struct2x32{2, 3};
    }
    
    typedef struct {
        short a, b, c, d;
    } ret_struct4x16;
    
    ret_struct4x16 return_struct4x16() {
        return ret_struct4x16{(short)2, (short)0, (short)3, (short)0};
    }
    

    或返回以某些语言(如 python)出现的元组

    def func(x,y):
        # code to compute x and y
        return x,y
    
    a, b = 1, 2
    u, v = func(a, b)
    

    在 C++ 中,我们std::pairstd::tuple

    std::pair<int, int> return_pair()
    {
        return std::make_pair(2, 3);
    }
    
    std::tuple<short, short, short, short> return_tuple()
    {
        return std::make_tuple((short)2, (short)0, (short)3, (short)0);
    }
    

    请参阅Compiler Explorer上的演示。不幸的是,MIPS 的 gcc 版本太旧,无法使用寄存器中的结构优化,所以查看 x86 输出,您会看到整个元组仅在一条指令中返回

它类似于 x86 中的 (E/R)DX:(E/R)AX 对,以返回两倍于寄存器大小的值

也可以看看

于 2014-06-15T13:23:56.523 回答
2

另一个用例是在 32 位 MIPS 上返回 64 位数字(或在 64 位 MIPS 上返回 128 位数字)。

于 2013-10-06T15:18:25.397 回答
1

我可以想到很多例子,但这可能只是取决于你的判断力。最好的例子可能是一个在 $v0 中返回值并可能在 $v1 中设置错误代码的函数。

于 2013-10-06T01:53:41.410 回答