Я пишу довольно простую программу на ассемблере PIC18. Это требует, чтобы я написал подпрограмму для умножения двух 16-битных чисел. Это то, что у меня есть прямо сейчас:
;***********************************************************************
; 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
То, как я написал это прямо сейчас, заключается в том, что он умножает числа, хранящиеся в зарегистрированных, упомянутых в первом комментарии, и сохраняет их в 4 регистрах в комментарии. Это хорошо работает, если мне нужно сделать это умножение только один или два раза, т.е. я могу просто сказать что-то вроде:
mul_16ptr1 set 0x45
mul_16ptr2 set 0x47
mul_16res set 0x50
call mul_16bit
Чтобы умножить 0x45
и 0x47
и сохранить в 0x50
. Проблема в том, что мне нужно вызвать это более одного раза для разных данных, потому что ассемблер не позволит мне дважды "установить" какой-либо из указателей. Я пытался использовать непрямой доступ (т.е. использовать LFSR1, LFSR2 и LFSR0 для хранения множимых и результата), но потом я просто попадаю в огромный беспорядок POSTINC0 и т. д. Можно ли как-то сделать эту функцию, вызывающую вещь, более приятной?