Está en la página 1de 2

* ------------------------------------------------- ----------

* Título: Multiplicación de palabras largas sin signo.


* Escrito por: Stuart Haidon
* Fecha: 2014-06-22
* ------------------------------------------------- ----------

* Longword Unsigned Multiplication.


* Pre:
* +4: Multiplicado.
* +0: multiplicador.
* Publicación:
* +4: Resultado bajo.
* +0: Resultado alto.
long_mulu:
move.l a6, - (a7) * A6 = Puntero de argumento.
move.l a7, a6
add.l # 8, a6
movem.l d0-d6, - (a7)

move.l 4 (a6), d0 * D0 = Multiplicado.


move.l 0 (a6), d1 * D1 = Multiplicador.

moveq.l # 0, d2
moveq.l # 0, d3
moveq.l # 0, d4
moveq.l # 0, d5
moveq.l # 0, d6

* Calcula z0.
move.w d0, d2
mulu d1, d2 * D2 = z0

* Calcular el primer término de z1.


* Multiplicado.
move.w d0, d3
swap d0
move.w d0, d5
add.l d5, d3 * D3 = Multiplicado y primer término de z1.

* Multiplicador.
move.w d1, d4
swap d1
move.w d1, d5
add.l d5, d4 * D4 = Multiplicador del primer término de z1.

* Multiplica los dos.


if.l d3 <gt> # $ FFFF OR.l d4 <gt> # $ FFFF then.s
move.l d3, - (a7)
move.l d4, - (a7)
jsr long_mulu
move.l (a7) +, d6 * D6 = Resultado alto.
move.l (a7) +, d3 * D3 = Resultado bajo.
else.s
mulu d4, d3
endi * D3 = Primer término de z1.

* Restar z0.
sub.l d2, d3 * D3 = Primer y tercer término de z1.
if.l <cs> then.s
sub.l # 1, d6
Endi

* Compute z2.
moveq # 0, d4
move.w d0, d4
mulu d1, d4 * D4 = z2.

* Completa z1.
sub.l d4, d3 * D3 = z1.

if.l <cs> then.s


sub.l # 1, d6
Endi

moveq # 0, d0
moveq # 0, d1

* Calcular resultado.
move.l d4, d0 * D0 = Alto.
move.l d2, d1 * D1 = Bajo.

* Agregue una palabra de D0 alta a menor, palabra de D1 de menor a mayor.


swap d3
move.w d3, d5
add.l d5, d0

move.w # 0, d3
add.l d3, d1

if.l <cs> then.s


add.l # 1, d0
Endi

* Agregar D6 << 16 a D0. Se puede cambiar ya que una palabra más alta siempre
es 0.
swap d6
add.l d6, d0

move.l d0,0 (a6)


move.l d1,4 (a6)

movem.l (a7) +, d0-d6


move.l (a7) +, a6
rts

También podría gustarte