Estoy escribiendo un programa bastante básico en el ensamblaje PIC18. Requiere que escriba una subrutina para multiplicar dos números de 16 bits. Esto es lo que tengo en este momento:PIC Función de ensamblaje llamando al
;***********************************************************************
; mul_16bit: subroutine that multiplies two 16 bit numbers stored in
; addresses mul_16ptr1, mul_16ptr1+1 and mul_16ptr2,mul_16ptr2+1 and
; returns the 32-bit result in addresses mul_16res1 to mul_16res1+3
;***********************************************************************
mul_16bit:
movf mul_16ptr2, W ;multiply the lower bytes
mulwf mul_16ptr1, W
movff PRODH, mul_16res+1
movff PRODL, mul_16res
movf mul_16ptr2+1, W ;multiply upper bytes
mulwf mul_16ptr1+1, W
movff PRODH, mul_16res+3
movff PRODL, mul_16res+2
movf mul_16ptr2, W ;multiply lower byte of num2
mulwf mul_16ptr1+1, W ; and upper byte of num1
movf PRODL, W
addwf mul_16res+1, F
movf PRODH, W
addwfc mul_16res+2, F
movlw 0 ; add carry
addwfc mul_16res+3, F
movf mul_16ptr2+1, W ;multiply upper byte
;of num1 and lower
mulwf mul_16ptr1, W ; byte of num2
movf PRODL, W ;add the result to mul_16res
addwf mul_16res+1, F ;...
movf PRODH, W ;...
addwfc mul_16res+2, F ;...
movlw 0 ; add carry
addwfc mul_16res+3, F
return
La forma en que he escrito en este momento es que multiplica los números almacenados en el registradas mencionadas en el primer comentario y los almacena en los 4 registros en el comentario. Esto funciona bien si sólo necesito hacer esta multiplicación una o dos veces, es decir, que sólo puede decir algo como:
mul_16ptr1 set 0x45
mul_16ptr2 set 0x47
mul_16res set 0x50
call mul_16bit
Para multiplicar 0x45
y 0x47
y almacenarlo en 0x50
. El problema es cuando necesito llamar a esto más de una vez en diferentes datos, porque el ensamblador no me deja "configurar" ninguno de los punteros dos veces. Intenté usar el acceso indirecto (es decir, usando LFSR1, LFSR2 y LFSR0 para almacenar los multiplicandos y el resultado) pero luego me metí en un lío enorme de POSTINC0, etc. ¿Hay alguna forma de que esta función llame mejor?
Bueno, muchos de ellos son necesarios si desea mantener el chip barato. –