Я пишу довольно базовую программу в сборке PIC18. Это требует, чтобы я написал подпрограмму для умножения двух 16-разрядных чисел. Это то, что я прямо сейчас:PIC Сборка функции вызова
;***********************************************************************
; 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 и т. Д. Есть ли способ сделать эту функцию более привлекательной?
Ну, многие из них необходимы, если вы хотите сохранить чип дешево. –