Продукт комплексных чисел с использованием умножения сдвига и сложения - PullRequest
0 голосов
/ 07 октября 2019

Я очень ржавый на ассемблере и пытаюсь улучшить свою игру. При этом я играю с процедурами, но мои навыки управления стеком (или их отсутствие) доказывают, что это трудная задача.

Я реализовал процедуру в сборке RISC-V, которая может умножаться с использованием умножения с последовательным сдвигом и сложением, что можно увидеть в myMult. Несмотря на недостатки, это работает. Теперь я хочу расширить это с помощью вложенного вызова процедуры на complexMult процедуру, которая должна вычислять произведение двух комплексных чисел z и w. Я совершенно заблудился в том, как поступить, и буду признателен за любую помощь.

Мой код в том виде, в каком он есть сейчас, можно увидеть ниже

# The product of two complex numbers
#       z = a + ib and w = c + id
# expands to
#       (a + ib)(c + id) = (ac - bd) + i(ad + bc)

.data
z = 3 + 2i
a: .word 3
b: .word 2
# w = 9 + 5i
c: .word 9
d: .word 5
# zw = 17 + 33i

.text
.globl main

main:
  lw a0, a
  lw a1, b
  lw a2, c
  lw a3, d
  addi s0, zero, 0 # temp storage for final mult result
  jal complexMult
  nop
  j end
  nop
myMult: 
  beq a1, zero, end
  andi t4, a1, 1
  bne t4, zero, increment
  srli a1, a1, 1
  slli a0, a0, 1
  beq t4, zero, myMult
increment:
  add s0, s0, a0
  srli a1, a1, 1 
  slli a0, a0, 1
  j myMult
complexMult:
  # lost on how to proceed
end:
  addi a0, zero, 0
  addi a0, s0, 0
  addi s0, zero, 0
  nop
...