Assembly 汇编程序中的绝对差之和

Assembly 汇编程序中的绝对差之和,assembly,mips,instruction-set,Assembly,Mips,Instruction Set,让我们假设该函数为伪代码 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(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
之前,您需要存储任何额外的参数:

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
执行其余的计算。

最简单的方法可能是对三对中的每一对调用
abs\u diff
函数,然后对每个返回值的结果调用
abs\u diff\u new
。另一种选择是将参数推送到堆栈上,但我不熟悉如何在mips上这样做。在mips中管理堆栈不是很困难。但是,由于只有值的差异才重要,最简单(也是最快)的IMHO是使用3个不同的参数。要调用该函数,请不要使用
add$a1、$t5、$0 add$a2、$t6、$0
而是使用
add$a1、$t5、$0 sub$a1、$a1、$t6
,然后只需计算$a1、$a2、$a3的绝对值并求和即可。简单,您将获得3条指令。