Сумма абсолютных различий в ассемблере - PullRequest
2 голосов
/ 24 апреля 2019

Предположим, что функция в псевдокоде.

   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 голосов
/ 27 апреля 2019

Соглашение для вызова функций с более чем четырьмя аргументами заключается в хранении дополнительных аргументов в памяти. См. этот ответ для более подробной информации.

Перед вызовом 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 для выполнения оставшихся вычислений.

...