【发布时间】:2019-09-14 02:11:25
【问题描述】:
让我们假设函数是伪代码。
int abs_diff(int l, int r) {
int abs_diff = abs(l - r);
return abs_diff;
}
我能够在汇编程序中实现这个功能。
abs_diff:
sub $t1, $a0, $a1
sra $t2,$t1,31
xor $t1,$t1,$t2
sub $v0,$t1,$t2
jr $ra #Return
现在我想在汇编程序中实现这个函数的扩展。新函数的伪代码是
int abs_diff_new(int r1, int g1, int b1, int r2, int g2, int b2) {
int abs_diff_new = abs(r1-r2) + abs(g1-g2) + abs(b1-b2);
return abs_diff_new;
}
我不知道如何实现这个功能,因为这个新功能 需要 6 个参数,但 MIPS 只提供 4 个寄存器 ($a0-$a3) 来传递参数。如何修改我的 abs_diff ?
【问题讨论】:
-
最简单的方法可能是对三对中的每一对调用
abs_diff函数,然后对每个返回值的结果调用abs_diff_new。另一种选择是将参数推送到堆栈上,但我不熟悉如何在 mips 上执行此操作。 -
在 MIPS 中管理堆栈并不是很困难。但由于只有价值观的差异很重要,所以最简单(也是最快)的恕我直言,是使用 3 个不同的参数。要调用该函数,不要使用
add $a1,$t5,$0 add $a2, $t6, $0,而是使用add $a1,$t5,$0 sub $a1,$a1, $t6,然后您只需计算$a1、$a2、$a3 的绝对值并将它们相加。很简单,您可以获得 3 条指令。
标签: assembly mips instruction-set