我们都知道通常一个程序只会返回一个值,但我注意到我们有两个值返回寄存器$v0
和$v1
MIPS。我看到的代码都只有$v0
but $v1
,而且我还没有找到任何使用的汇编语言示例代码$v1
。
谁能告诉我为什么我们在 MIPS 中有两个 $v 寄存器,并向我展示一个何时可以使用它的示例?
我们都知道通常一个程序只会返回一个值,但我注意到我们有两个值返回寄存器$v0
和$v1
MIPS。我看到的代码都只有$v0
but $v1
,而且我还没有找到任何使用的汇编语言示例代码$v1
。
谁能告诉我为什么我们在 MIPS 中有两个 $v 寄存器,并向我展示一个何时可以使用它的示例?
有很多用途
如@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::pair
有std::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 对,以返回两倍于寄存器大小的值
也可以看看
另一个用例是在 32 位 MIPS 上返回 64 位数字(或在 64 位 MIPS 上返回 128 位数字)。
我可以想到很多例子,但这可能只是取决于你的判断力。最好的例子可能是一个在 $v0 中返回值并可能在 $v1 中设置错误代码的函数。