Ich schreibe ein ziemlich einfaches Programm in PIC18 Assembly. Es erfordert, dass ich eine Subroutine schreibe, um zwei 16-Bit-Zahlen zu multiplizieren. Das ist es, was ich jetzt:PIC Assembly Funktionsaufruf
;***********************************************************************
; 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
Die Art, wie ich es jetzt geschrieben habe, ist, dass sie Zahlen in der in den ersten Kommentar ab und speichert sie in den vier Registern im Kommentar erwähnt registriert gespeichert multipliziert. Das funktioniert gut, wenn ich nur diese Multiplikation einmal oder zweimal tun müssen, das heißt kann ich nur wie etwas sagen:
mul_16ptr1 set 0x45
mul_16ptr2 set 0x47
mul_16res set 0x50
call mul_16bit
0x45
und 0x47
multiplizieren und speichert sie in 0x50
. Das Problem ist, wenn ich dies mehr als einmal auf verschiedenen Daten aufrufen muss, weil der Assembler mir nicht erlauben wird, einen der Zeiger zweimal zu setzen. Ich habe versucht, indirekten Zugang zu verwenden (d. H. Mit LFSR1, LFSR2 und LFSR0, um die Multiplikanden und das Ergebnis zu speichern), aber dann bekomme ich nur ein riesiges Durcheinander von POSTINC0 usw. Gibt es trotzdem etwas, das diese Funktion netter macht?
Nun, viele von ihnen sind notwendig, wenn Sie den Chip billig halten wollen. –