Teilen durch 200 in ASM

Gast #2420133
Lesenswert?

Hi

>ich suche Möglichkeiten, in AVR-Assembler  durch 200 zu teilen, und zwar
>möglichst effezient. Also fast ohne Speicherplatzverbrauch.

Kommt darauf an , was du durch 200 teilen willst. 8,16 32,64... Bit?

MfG Spess
Gast #2420165
Lesenswert?

Von Atmel gibts feine Appnotes :)
Da ist auch ne 32bit/32bit Division aufgeführt. Einmal auf Code Größe 
und einmal auf Leufzeit optimiert. Die kannst du ja direkt nehmen oder 
weiter optimieren. Bei dir würde ja auch 32bit/8bit reichen :)
Persönliche Seite #2420184
Lesenswert?

Hallo,

im Beispiel unten, die 10 in 200 ändern.
Lässt sich auch leicht auf 24 oder 32 Bit erweitern.

1
  ;--------------------------------------------------------------------------------
2
  ;    16Bit Division durch 8Bit Konstante. In diesem Fall 10.
3
  ;    Übergaberegister & Ergebniss in temp2/temp3 (low/high), Rest = temp1
4
  ;--------------------------------------------------------------------------------
5
div:  ldi    temp4,16    ;16* schieben
6
    clr    temp1      ;Rest =0
7
dv1:  lsl    temp2      
8
    rol    temp3
9
    rol    temp1
10
    cpi    temp1,10    ;Solange Bits in temp1 (Rest) schieben bis >= 10
11
    brcs  dv2        ;Wenn der Rest <10 ist, das 0-Bit in temp2 (LSL, oben) stehen lassen
12
    inc    temp2      ;Ansonsten Bit0 setzen und 10 vom Rest abziehen
13
    subi  temp1,10    
14
dv2:  dec    temp4      ;Das ganze 16 mal
15
    brne  dv1  
16
  ;-------------------------------------------------
17
  ;        Ende Div Routine.
18
  ;-------------------------------------------------
19
    ret
Gast #2420346
Lesenswert?

Wer Code-sparend rechnen will, sollte bedenken:

- Addieren / Subtrahieren ist "billig".
- Multiplizieren "teuer"
- Dividieren (außer durch Vielfache von 2) "Luxus"

Also, wenn du vorher vielleicht schon multiplizieren
musstest: Multipliziere doch so, dass du durch 256
teilen musst!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren