Forum: Mikrocontroller und Digitale Elektronik AVR Assembler Division


von Max M. (maxmicr)


Lesenswert?

Ich habe versucht, in Assembler eine Division von zwei 8-bit Zahlen zu 
berechnen, allerdings funktioniert das Programm bei einigen Zahlenwerten 
nicht (z.B. bei 130 / 2, bei 129 / 2 jedoch einwandfrei):
1
div:
2
  mov    r18,r16
3
  clr    r16
4
divD:
5
  sub    r18,r17
6
  brmi  end
7
  inc    r16
8
  rjmp  divD
9
end:
10
  ret

Mein Verdacht ist, dass der
1
inc
 Befehl das *N*-Flag beeinflusst, aber mir kommt nicht in den Sinn, wie 
und wann das passieren sollte?

: Bearbeitet durch User
von asdfasd (Gast)


Lesenswert?

Statt brmi nen brcs?

von Klaus 2. (klaus2m5)


Lesenswert?

130 = 0b10000010
130 - 2 = 128 = 0b10000000
Danach bricht der Loop ab da bit 7 (N) gesetzt ist.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Schau Dir dazu folgende Seite an:
http://avr-projekte.de/rechnen.htm

MfG

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe versucht, in Assembler eine Division von zwei 8-bit Zahlen zu
>berechnen, allerdings funktioniert das Programm bei einigen Zahlenwerten
>nicht (z.B. bei 130 / 2, bei 129 / 2 jedoch einwandfrei):

AppNote: AVR200: Multiply and Divide Routines

MfG Spess

von Grober Klotz (Gast)


Angehängte Dateien:

Lesenswert?

Hi Max

So könnte man die Division 8Bit / 8Bit in PIC-Assembler programmieren
1
;-----------------------------------------------------
2
Main
3
   movlw .179
4
   movwf Dividend_0        ;Dividend
5
   movlw .22
6
   movwf Divisor_0         ;Divisor
7
   clrf  Quotient_0        ;Quotient
8
   ;
9
   CALL  DIV8_8
10
   ;
11
Main_End   
12
   GOTO  Main_End
13
;------------------------------------------------------
14
DIV8_8
15
Div8_8_Loop:
16
   bsf      STATUS,C       ;C=1, wird bei negativer Subtraktion = 0
17
   ;                       ;     Subtraktion ist dann beendet
18
   movf     Divisor_0,w    ;Divisor ins WREG
19
   subwf    Dividend_0,f   ;Subtraktion Dividend - WREG, Ergebnis
20
                           ;steht im Dividend
21
   btfss    STATUS,C       ;C=0? dann ist Ergebnis negativ - Ende
22
                           ;     der Division
23
   GOTO     Div8_8_Rest    ;JA, Division beendet, Rest berechnen
24
   incf     Quotient_0,f   ;NEIN, Qoutient +1
25
   GOTO     Div8_8_Loop    ;erneute Subtraktion Divisor-Dividend
26
   ;
27
Div8_8_Rest:               ;Rest berechnen
28
   movf     Dividend_0,w   ;Dividend (Differenz der Subtraktion 
29
                           ;Divisor - Dividend ins WREG
30
   addwf    Divisor_0,w    ;Divisor addieren
31
   movwf    Rest_0         ;Summe ist der Rest 
32
                           ;Achtung: z.B. 237+22 -> Überlauf = 3
33
   RETURN
mfG
Grober Klotz

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.