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!
Ja, diese Warnungen sind nervig. Eine Mehrfachnutzung von Registern ist ja normal. Du kannst sie aber umgehen, durch
1 | #define t2 r26
|
Peter
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? :)
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.