Apéndice B: Ejemplos Matemáticos y Tablas
Multiplicación, División, y Raíz Cuadrada
Multiplicación, división, y raíz cuadrada pueden realizarse usando instrucciones de suma,
resta y movimiento. Aquí se muestra una rutina multiplicador no signado que multiplica dos
valores 16-bit para alcanzar un producto 32-bit:
'' Multiply x[15..0] by y[15..0] (y[31..16] must be 0)
' on exit, product in y[31..0]
'
multiply
shl
mov
shr
c
:loop if_c
add
al producto
rcr
c, mueve el producto
djnz
multiply_ret
ret
y[31..0]
El tiempo de la rutina de arriba podría cortarse en ~1/3 si el ciclo no fuera rotado, repitiendo
ADD
RCR
la secuencia
/
y descartando la instrucción
La división es como la multiplicación, pero en reversa. Es potencialmente mas compleja,
porque una prueba de comparación debe hacerse antes de que se realice la resta. Para
remediar esto hay una instrucción especial
hacer sin ocasionar sobre flujo. SI no hay sobre flujo la resta se realice y la salida C es 1. Si
hay sobre flujo D se deja solo y la salida C es 0.
Aqui hay una rutina divisora que divide un valor de 32-bit por un valor 16-bit pata obtener in
cociente 16-bit y un sobrante 16-bit.
' Divide x[31..0] by y[15..0] (y[16] must be 0)
' on exit, quotient is in x[15..0] and remainder is in x[31..16]
'
divide
shl
mov
:loop
cmpsub x,y
Appendix B: Math Samples and Function Tables
x,#16
'obtiene el multiplicando en x[31..16]
t,#16
y,#1
wc
y,x
wc
'si c es activo, suma el multiplicando
y,#1
wc
t,#:loop
CMPSUB
y,#15
'Obtiene el divisor en y[30..15]
t,#16
wc
'y =< x? resta, bit cociente en C
'listo para multiplicar 16 bits
'obtiene el multiplicador inicial en
'pone el siguiente multiplicador en
'cicla hasta completar
'regresa con el producto en
DJNZ
.
D, S la cual prueba si una resta se puede
'Listo para los cocientes de 16 bits
Propeller Manual v1.1 · Page 397