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