PIC Assembler, Dividera heltal

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
PW2000
Inlägg: 38
Blev medlem: 25 mars 2012, 05:46:32

PIC Assembler, Dividera heltal

Inlägg av PW2000 »

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.

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*************************
Hittade den här med en något luddig förklaring på engelska. Där finns även ett 16-bitars (två Byte) exempel.
Senast redigerad av PW2000 2 november 2013, 15:26:12, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26221
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: PIC Assembler, Dividera heltal

Inlägg av Icecap »

Lite petigt men ändå:
MOVF TEMPY8,F ; Flytta TEMPY8 till sig själv

Kommentaren är teoretisk korrekt fast ändå inte. Kommandot utför i verkligheten en uppdatering av Z-flaggan i STATUS till att avspegla huruvida TEMPY8 är icke-noll eller inte.

Så för tydlighetens skull borde kommentaren vara något i stil med:
; Uppdaterar Z-flagga i STATUS

Men annars är själva räknesättet känd sedan länge - och det fungerar strålande. Man kan expandera funktionen till valfritt antal bytes och det viktigaste med den funktionssätt är att en division tar en fast tid nästan varje gång. Detta kan vara trevligt att veta om man t.ex. gör ett program som behöver dela tal och man kanske inte vill dra in ett helt bibliotek som kan ha "överflödiga" delar med som kostar minne som kanske inte finns.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43204
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: PIC Assembler, Dividera heltal

Inlägg av sodjan »

Sen så har ju piclist.com också många varianter:
http://www.piclist.com/techref/microchi ... /index.htm
PW2000
Inlägg: 38
Blev medlem: 25 mars 2012, 05:46:32

Re: PIC Assembler, Dividera heltal

Inlägg av PW2000 »

Icecap skrev:Lite petigt men ändå:
MOVF TEMPY8,F ; Flytta TEMPY8 till sig själv

Kommentaren är teoretisk korrekt fast ändå inte. Kommandot utför i verkligheten en uppdatering av Z-flaggan i STATUS till att avspegla huruvida TEMPY8 är icke-noll eller inte.

Klipp ...
Nja skulle väl jag säga, men jag håller med om att ditt förslag ser bättre ut.

Läser man i Microcips datablad står det
The contents of register f is
moved to a destination dependent
upon the status of d. If d = 0,
destination is W register. If d = 1,
the destination is file register f
itself. d = 1 is useful to test a file
register since status flag Z is
affected.
Jag förstod att det inte var några nyheter, är väl bara jag som inte haft behov av att dividera tidigare. Men jag tyckte det var en rätt liten och smidig rutin som tom. jag fattade hur den fungerade. Tänkte att det säkert är någon mer PIC-pysslare som kan ha nytta av det.
Skriv svar