PIC Assembler, Dividera heltal
Postat: 2 november 2013, 09:05:10
Jag fick behov av att dividera, så jag sökte lite på nätet och sprang på den här rutinen.
Jag har kommenterat så att det förhoppningsvis går att förstå hur den fungerar. Men fungerar gör den.
Kanske det hjälper någon annan med behov.
Hittade den här med en något luddig förklaring på engelska. Där finns även ett 16-bitars (två Byte) exempel.
Jag har kommenterat så att det förhoppningsvis går att förstå hur den fungerar. Men fungerar gör den.
Kanske det hjälper någon annan med behov.
Kod: Markera allt
;**************Test**************************
DIV_X_Y
; Dividerar TEMPX8/TEMPY8 resultat i RESULT8
; Register:
; TEMPX8 ; Täljaren
; TEMPY8 ; Nämnaren
; RESULT8 ; Resultat
; IDX16 ; Basindex
MOVF TEMPY8,F ; Uppdaterar Z-flagga i STATUS
BTFSC STATUS,Z ;
RETURN ; Om nämnaren är noll så ...
CLRF RESULT8 ; Rensa resultatregistret
MOVLW 1
MOVWF IDX16 ; Ladda in 1 i IDX16
SHIFT_IT8
BTFSC TEMPY8,7 ; Skifta nämnaren och basindex vänster
GOTO DIVU8LOOP ; tills MSb i nämnaren är satt
BCF STATUS,C ; Nolla C
RLF IDX16,F ; Rotera basindex vänster
BCF STATUS,C ; Nolla C
RLF TEMPY8,F ; Rotera nämnaren vänster
GOTO SHIFT_IT8 ; På igen
DIVU8LOOP
MOVF TEMPY8,W ; Lägg in den modifierade nämnaren i W
SUBWF TEMPX8, F ; Dra ifrån den modifirade nämnaren från täljaren
BTFSC STATUS,C ; Om reultatet blir ...
GOTO COUNT8 ; ... positivt, lägg basindex till resultatet
ADDWF TEMPX8, F ; ... negativt, lägg den modifierade nämnaren till täljaren
GOTO FINAL8
COUNT8
MOVF IDX16,W ; Positivt, lägg basindex till resultatet
ADDWF RESULT8, F
FINAL8 ; Rotera tillbaka nämnare och basindex
BCF STATUS,C ; Nolla C
RRF TEMPY8,F ; Rotera tillbaka nämnaren
BCF STATUS,C ; Nolla C
RRF IDX16,F ; Rotera tillbaka basindex
BTFSS STATUS,C ; När 1:an i basindex åker ut i C så är vi färdiga
GOTO DIVU8LOOP ; Fortsätt tills basindex = 1
RETURN ; Klart
;**************!Test*************************