Dělení čísel

Pre pochopenie ako rutiny funguju, je v aplikacnej poznamke AVR200.pdf na strane 11 (8b)a strane 16 (16b) vyvojovy diagram s podrobnym popisom co to robi.
Deli sa opacne ako sa nasobi.
Nasobi sa tak, ze s pripocitanim sa posunie rad (podobne ako na papieri v desiatkovej sustave - tiez sa pri nasobeni N * M nepripocitava M krat cislo N, ale sa postupne spocitavaju jednotlive medzivysledky s posunom o rad)

Deli sa zas presne ako na papieri, s odpocitavanim sa posuva rad. Ani pri vypoctoch s ceruzkou N/M nezistujeme vysledok tak, ze by sme od N neustale odpocitavali M.
Obdobne je tomu pri vypoctoch v binarnej sustave. Skus si pozriet ten dokument AVR200.pdf. Zdrojaky z AVR200.zip si kopirovat nemusis.

ATmega Ti vydeli dve znamienkove 16b cisla 61302x za sekundu (v najhorsom pripade).

No a x51 je holt x51. :slight_smile:

Pokial viem, instrukciou DIV sa daju delit iba dve neznamienkove cisla.
Ako uvadzas, cely vypocet treva 48 hodinovych taktov. Da sa tato instrukcia pouzit i pre znamienkove viacbajtove delenia? Neviem, mozno nejako ano.

AVR spravi to iste za 97 taktov (podla AVR200, ale to neznamena, ze sa to neda spravit i inak, napriklad nie tak uspone na kod ale rychlejsie - caven pise nieco podobne ale rychlejsie) a zaberie to v pamati 14 instrukcii. Takze zhruba 164900x za sekundu. Okrem toho bezne AVR slape do 16MHz a bezna x51 do 24MHz. Takze v tomto pripade AVR vychadza

97/48*24/16 = 3x pomalsie.

A to este neuvazujem o rychlejsich jadrach x51 na 6/4/2/1 clk. Ako som pisal, niektore veci ostanu jednoducho neprekonane :slight_smile:

No malokedy staci delit len unsigned 8bit (napr. pri kalibracii AD hodnot a tak podobne )na NETe

8052.com/codelib

som ale napriklad nasiel (vytrhavam kusok z celej kniznice):

;====================================================================
; subroutine UDIV16
; 16-Bit / 16-Bit to 16-Bit Quotient & Remainder Unsigned Divide
;
; input: r1, r0 = Dividend X
; r3, r2 = Divisor Y
;
; output: r1, r0 = quotient Q of division Q = X / Y
; r3, r2 = remainder
;
; alters: acc, B, dpl, dph, r4, r5, r6, r7, flags
;====================================================================

UDIV16: mov r7, #0 ; clear partial remainder
mov r6, #0
mov B, #16 ; set loop count

div_loop: clr C ; clear carry flag
mov a, r0 ; shift the highest bit of
rlc a ; the dividend into…
mov r0, a
mov a, r1
rlc a
mov r1, a
mov a, r6 ; … the lowest bit of the
rlc a ; partial remainder
mov r6, a
mov a, r7
rlc a
mov r7, a
mov a, r6 ; trial subtract divisor
clr C ; from partial remainder
subb a, r2
mov dpl, a
mov a, r7
subb a, r3
mov dph, a
cpl C ; complement external borrow
jnc div_1 ; update partial remainder if
; borrow
mov r7, dph ; update partial remainder
mov r6, dpl
div_1: mov a, r4 ; shift result bit into partial
rlc a ; quotient
mov r4, a
mov a, r5
rlc a
mov r5, a
djnz B, div_loop
mov a, r5 ; put quotient in r0, and r1
mov r1, a
mov a, r4
mov r0, a
mov a, r7 ; get remainder, saved before the
mov r3, a ; last subtraction
mov a, r6
mov r2, a
ret

ak ani nepocitam slucky, len jednoduchym spocitanim instrukcii (co je velmi v prospech x51) vychadza cislo 43 * 12 = 516 taktov clk. Uz asi v tomto pripade asi bude mat to AVRko ci PICko (PLL 4x :slight_smile:) navrch.

Ale to sa divim spolu s Tebou, ze do tychto 8bitov nedavaju mat. koprocesor aspon an to delenie a nasobenie, ale aj odmocnina a goniometria by sa obcas hodili.
V tomto smere su omnoho lepsie vybavene ARM7, Cortex a im podobne, to je ale uz uplne ina kategoria.
Ku podivu instrukcie delenia, alebo nejaku hw delicku neimplementoval Atmel ani do Atxmegoveho radu.