Du har ett tal/värde i en 16-bitars variabel som ett rent binärt värde, eller hur ?
Och du vill ha detta 16-bitars binära värde dividerat med konstanten 10 (decimalt, eller 0A i HEX), not ?
Det är exakt det som det som jag postade gör !!
Det som man gör är att skriva om (faktorisera) "dela med 10" så att det
skrivs som en serieutveckling av additioner av delningar med jämna
potenser av 2 (vilket är enkelt att fixa med shift/rotate).
Ta t.ex (för tydlighets skull omskrivet decimalt, men det spelar inge roll).
Säg att du vill dela 12.850 med 10 (och få 1,285)
12850/16 = 803
12850/32 = 401
12850/256 = 50
12850/512 = 25
803 + 401 + 50 + 25 = 1279
Notera att det blev ett visst fel, det beror på att jag hade kört med
ett 0.5% acceptabalt fel. Om jag ändrar det till 0.05% så får jag istället :
; ALGORITHM:
; Clear accumulator
; Add input / 16 to accumulator
; Add input / 32 to accumulator
; Add input / 256 to accumulator
; Add input / 512 to accumulator
; Add input / 4096 to accumulator
; Add input / 8192 to accumulator
; Move accumulator to result
Och om vi kör med det så blir det :
12850/16 = 803
12850/32 = 401
12850/256 = 50
12850/512 = 25
12850/4096 = 3
12850/8192 = 1
803 + 401 + 50 + 25 + 3 + 1 = 1283
Om jag ändrar till 0.01% precission och även lägger till "round result" så får man:
; ALGORITHM:
; Clear accumulator
; Add input / 8 to accumulator
; Add input / 16 to accumulator
; Add input / 128 to accumulator
; Add input / 256 to accumulator
; Add input / 2048 to accumulator
; Add input / 4096 to accumulator
; Add input / 32768 to accumulator
; Shift accumulator right (LSb to carry)
; If carry set, increment accumulator
; Move accumulator to result
;
Vilket ger :
12850/8 = 1606
12850/16 = 803
12850/128 = 100
12850/256 = 50
12850/2048 = 6
12850/4096 = 3
12850/32768 = 0
1606 + 803 + 100 + 50 + 6 + 3 + 0 = 2568
Ett shift till höger ger 1284.
Ingen carry, så ingen extra ADD.
Resultatet ligger 1 från rätt värde.
Du kan köra fram andra algoritmer för andra precissioner eller nämnare
här :
http://www.piclist.com/techref/piclist/ ... divmul.htm
Där får du även den kompletta koden (kommenterad och allt).
86 instruktioner för den mest komplexa algoritmen ovan.