Forum: Mikrocontroller und Digitale Elektronik Warning bei .DEF von 32bit Divisionsroutine


von Ben _. (burning_silicon)


Lesenswert?

hi!

ich habe hier im forum/tutorial die divisionsroutine für zwei 32bit 
zahlen in assembler gefunden. eigentlich brauche ich nur 32bit/16bit, 
würde aber die 32/32 dafür nehmen. rechenzeit sollte genug da sein und 
ich brauch nur eine solche division pro sekunde.

diese routine .DEFiniert sich 12 registernamen, wovon die letzten beiden 
(t2 und t3) probleme bereiten.

.def t2=r26 -> warning: register r26 already defined by the .def 
directive
.def t3=r27 -> warning: register r27 already defined by the .def 
directive

was mich wundert, die anderen 10 .DEFs gehen problemlos durch. und wieso 
regt er sich über die registernamen R26 und R27 auf und nicht über T2 
und T3? kann ich die beiden warnings ignorieren? würde ich ungerne 
machen, irgendwas muß ja komisch daran sein. den fehler beheben der die 
beiden warnings erzeugt wäre mir aber lieber.

plan B wäre eine 32/16bit divisionsroutine falls jemand sowas parat hat. 
danke!

von Peter D. (peda)


Lesenswert?

Ja, diese Warnungen sind nervig.
Eine Mehrfachnutzung von Registern ist ja normal.

Du kannst sie aber umgehen, durch
1
#define t2 r26


Peter

von Ben _. (burning_silicon)


Lesenswert?

okay danke dir, dann werde ich das ändern.

noch eine frage weil du sonst immer alles an code hast:
liegt bei dir eine 32/16bit divisionsroutine in AVR assembler in der 
schublade? :)

von Peter D. (peda)


Lesenswert?

Ben _ schrieb:
> okay danke dir, dann werde ich das ändern.
>
> noch eine frage weil du sonst immer alles an code hast:
> liegt bei dir eine 32/16bit divisionsroutine in AVR assembler in der
> schublade? :)

Nur 56 / 24, das Prinzip sollte aber leicht zu erkennen sein:
1
;                               Division 56 / 24 bit
2
;-------------------------------------------------------------------------
3
;input:  a6..0: Dividend
4
;        b2..0; Divisor
5
;
6
;output: a6..0: Quotient
7
;        t2..0: Remainder
8
;        T = 1: Quotient > 0
9
;
10
div56:  clt
11
        clr     t0
12
        clr     t1
13
        clr     t2
14
        ldi     i0, 56
15
_div1:  lsl     a0
16
        rol     a1
17
        rol     a2
18
        rol     a3
19
        rol     a4
20
        rol     a5
21
        rol     a6
22
        rol     t0
23
        rol     t1
24
        rol     t2
25
        brcs    _div2
26
        cp      t0, b0
27
        cpc     t1, b1
28
        cpc     t2, b2
29
        brcs    _div3
30
_div2:  sub     t0, b0
31
        sbc     t1, b1
32
        sbc     t2, b2
33
        inc     a0
34
        set                     ;Quotient not zero
35
_div3:  dec     i0
36
        brne    _div1
37
        ret
38
;------------------------------------------------------------------------


Peter

von Ben _. (burning_silicon)


Lesenswert?

56bit... weiaaa wozu braucht ihr solche zahlen! :D

im moment blick ich durch solche routinen noch nicht so gut durch, daß 
ich eigene schreiben könnte, daher muß ich hier auch so oft wegen dem 
kram fragen. ziel ist im moment eine eigene sammlung solcher routinen 
anzulegen wo man weiß sie funktionieren alle und man kann sie sich von 
dort holen wenn man sie braucht.

von Flo (Gast)


Lesenswert?

r26 und r27 sind halt über die AVR-Includes schon als XL und XH 
(X-Pointer) definiert.

von Peter D. (peda)


Lesenswert?

Z.B. für nen Frequenzmesser:

F_in = F_Quarz * count_in / count_timebase
1
;                               Division 32 / 16 bit
2
;-------------------------------------------------------------------------
3
;input:  a3..0: Dividend
4
;        b1..0; Divisor
5
;
6
;output: a3..0: Quotient
7
;        t1..0: Remainder
8
;        T = 1: Quotient > 0
9
;
10
div32_16:
11
        clt
12
        clr     t0
13
        clr     t1
14
        ldi     i0, 32
15
_div1:  lsl     a0
16
        rol     a1
17
        rol     a2
18
        rol     a3
19
        rol     t0
20
        rol     t1
21
        brcs    _div2
22
        cp      t0, b0
23
        cpc     t1, b1
24
        brcs    _div3
25
_div2:  sub     t0, b0
26
        sbc     t1, b1
27
        inc     a0
28
        set                     ;Quotient not zero
29
_div3:  dec     i0
30
        brne    _div1
31
        ret
32
;------------------------------------------------------------------------


Peter

von Ben _. (burning_silicon)


Lesenswert?

klasse, danke dir für deine mühe!

habe allerdings doch noch ein byte mehr gebraucht als ich gedacht hatte 
(24 bit divisor anstatt 16 bit), geht jetzt super mit der 32/32bit 
routine.

frequenzmesser ist schon einigermaßen dicht dran. allerdings wirds doch 
nur ein elektronischer stromzähler. :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.