Yahoo Groups archive

AVR-Chat

Index last updated: 2026-04-28 22:41 UTC

Message

Re: [AVR-Chat] ASM 32-bit division routine?

2008-07-29 by John Samperi

At 11:15 PM 29/07/2008, you wrote:
>I'm looking for a 32-bit by 16-bit integer division

Will 32 by 32 do?

;-----------------------------------------------------------------------------:
; 32bit/32bit Unsigned Division
;
; Register Variables
;  Call:  var1[3:0] = dividend (0x00000000..0xffffffff)
;         var2[3:0] = divisor (0x00000001..0x7fffffff)
;         mod[3:0]  = <don't care>
;         lc        = <don't care> (high register must be allocated)
;
;  Result:var1[3:0] = var1[3:0] / var2[3:0]
;         var2[3:0] = <not changed>
;         mod[3:0]  = var1[3:0] % var2[3:0]
;         lc        = 0
;
; Size  = 26 words
; Clock = 549..677 cycles (+ret)
; Stack = 0 bytes


div32u:         clr     mod0            ;initialize variables
                 clr     mod1            ;  mod = 0;
                 clr     mod2            ;  lc = 32;
                 clr     mod3            ;
                 ldi     lc,32           ;/
                                         ;---- calcurating loop
                 lsl     var10           ;var1 = var1 << 1;
                 rol     var11           ;
                 rol     var12           ;
                 rol     var13           ;/
                 rol     mod0            ;mod = mod << 1 + carry;
                 rol     mod1            ;
                 rol     mod2            ;
                 rol     mod3            ;/
                 cp      mod0,var20      ;if (mod => var2) {
                 cpc     mod1,var21      ; mod -= var2; var1++;
                 cpc     mod2,var22      ; }
                 cpc     mod3,var23      ;
                 brcs    PC+6            ;
                 inc     var10           ;
                 sub     mod0,var20      ;
                 sbc     mod1,var21      ;
                 sbc     mod2,var22      ;
                 sbc     mod3,var23      ;/
                 dec     lc              ;if (--lc > 0)
                 brne    PC-19           ; continue loop;
                 ret



Regards

John Samperi

********************************************************
Ampertronics Pty. Ltd.
11 Brokenwood Place Baulkham Hills, NSW 2153 AUSTRALIA
Tel. (02) 9674-6495       Fax (02) 9674-8745
Email: john@ampertronics.com.au
Website  http://www.ampertronics.com.au
*Electronic Design * Custom Products * Contract Assembly
********************************************************

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.