【问题标题】:Sum of Absolute Differences in Assembler汇编程序中的绝对差异之和
【发布时间】: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


【解决方案1】:

调用具有四个以上参数的函数的惯例是将多余的参数存储在内存中。详情请见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 执行其余的计算。

【讨论】:

    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2016-12-31
    • 2014-05-21
    相关资源
    最近更新 更多