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 등의 거대한 엉망이 생겼습니다.이 함수를 더 멋지게 호출하는 방법이 있습니까?
칩을 싼 상태로 유지하려면 많은 경우가 필요합니다. –