汇编器中的绝对差异之和

时间:2019-04-24 17:47:10

标签: assembly mips isa

让我们假设函数使用伪代码。

   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?

1 个答案:

答案 0 :(得分:0)

调用具有四个以上参数的函数的约定是将多余的参数存储在内存中。有关更多详细信息,请参见this answer

在调用abs_diff之前,您需要存储所有其他参数:

sw $s0, 4($sp) # Assuming $s0 = g2
sw $s1, 8($sp) # Assuming $s1 = b2

然后您可以使用以下方法在abs_diff内获取它们:

lw $t0, 20($sp) # Assuming you subtracted $sp by 16
lw $t1, 24($sp)

然后您可以使用$t0$t1执行其余的计算。