Division 64bit/32bit=32bit

This page is also available in English.


Beschreibung:
Die Divisionsroutine FDIV64 erwartet im Register r0 die niederwertigen 32 Bit und im Register r1 die höherwertigen 32 Bit des Dividenden sowie im Register r2 den Divisor. Weitere Register werden nicht verwendet. Als Ergebnis erhält man im Register r0 den Quotienten und im Register r1 den Rest. Ganz wichtig: Die Divisionsroutine funktioniert nur für vorzeichenlose Zahlen, und wenn der Quotient in 32 Bit passt!

FDIV64 ist insgesamt 520 Bytes lang. Die Ausführungszeit ist unabhängig von den Operanden und beträgt 131 Zyklen.


C-Prototypen:
typedef struct {
  unsigned int quot;
  unsigned int rem;
} udiv_t;

/* Wenn Quotient und Rest benötigt werden */
extern __value_in_regs udiv_t FDIV64(unsigned int dvd_lo,
                                     unsigned int dvd_hi,
                                     unsigned int dvs);

/* Wenn nur der Quotient interessiert */
extern unsigned int FDIV64(unsigned int dvd_lo, unsigned int dvd_hi,
                           unsigned int dvs);


Assembler-Sourcecode:
|FDIV64|

        adds    r0,r0,r0
        adc     r1,r1,r1
        
        GBLA    i
i       SETA    31
        WHILE   i >0
        
        cmp     r1,r2            ;Also die 4 Zeilen
        subcs   r1,r1,r2         ;31 mal wiederholen !
        adcs    r0,r0,r0
        adc     r1,r1,r1
        
i       SETA    i-1
        WEND
        
        cmp     r1,r2
        subcs   r1,r1,r2
        adcs    r0,r0,r0

        movs    pc,r14
        

Und zurück!


Wer mich mit elektronischer Post beglücken will, kombiniere die Bestandteile peter, peter-teichmann und de in sinnvoller Art und Weise, um eine Adresse zu erhalten.