J'écris un programme assez basique dans l'assemblage PIC18. Cela nécessite que j'écrive un sous-programme pour multiplier deux nombres de 16 bits. Voilà ce que j'ai en ce moment:Fonction d'assemblage PIC appelant
;***********************************************************************
; 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 façon dont je l'ai écrit en ce moment est qu'il multiplie les numéros enregistrés dans le enregistré mentionné dans le premier commentaire et les stocke dans les 4 registres dans le commentaire. Cela fonctionne bien si je dois faire cette multiplication une ou deux fois, à savoir que je peux dire quelque chose comme:
mul_16ptr1 set 0x45
mul_16ptr2 set 0x47
mul_16res set 0x50
call mul_16bit
Pour multiplier 0x45
et 0x47
et la stocker dans 0x50
. Le problème est quand j'ai besoin d'appeler cela plus d'une fois sur des données différentes, parce que l'assembleur ne me laissera pas "définir" l'un des pointeurs deux fois. J'ai essayé d'utiliser l'accès indirect (c'est-à-dire en utilisant LFSR1, LFSR2 et LFSR0 pour stocker les multiplicandes et le résultat) mais je viens d'entrer dans un énorme gâchis de POSTINC0 etc. Y a-t-il un moyen de rendre cette fonction plus agréable?
Eh bien, beaucoup d'entre eux sont nécessaires si vous voulez garder la puce pas cher. –