Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage ASM


von Peter B. (pebez)


Lesenswert?

Hallo,

ich hab da mal eine Verständnisfrage.
Folgender Code:
1
.include"m8def.inc"
2
.def temp  = r16
3
.def temp1 = r17
4
5
main:
6
ldi temp,low(ramend)
7
out spl, temp
8
ldi temp, high(ramend)
9
out sph, temp
10
ldi temp, $ff
11
out ddrd, temp
12
13
loop:
14
15
nali:
16
ror temp
17
out ddrd, temp
18
cpi temp, 0
19
brne nali
20
21
nare:
22
rol temp
23
out ddrd, temp
24
cpi temp, 255
25
brne nare
26
27
rjmp loop


ist ja nun nix besonderes, trotzdem verstehe ich folgendes nicht:

hat "temp" den Wert 255 in "nare" erreicht geht's ja über rjmp loop
in die "nali" Schleife. Direkt nach dem "ror temp" hat temp den Wert 
127.

Hat "temp" den Wert 0 in "nali" geht's über cpi und brne in die "nare" 
Schleife.
Hier bleibt aber nach dem "rol temp" der Wert bei 0 stehen und erst nach 
einem
Schleifendurchlauf in nare hat temp den Wert 1.
Warum ändert sich der Wert für "temp" nicht direkt nach den Sprung von 
nali nach nare?

Gruß  Peter

von Klaus 2. (klaus2m5)


Lesenswert?

...
brne nali
sec        ;nach dem cpi ist carry=0
nare:
...

von Helfer (Gast)


Lesenswert?

1
.include"m8def.inc"
2
.def temp  = r16
3
.def temp1 = r17
4
5
main:
6
  ; Carry = 0 nach Reset
7
  ldi temp,low(ramend)   ; Kein Einfluss auf Carry 
8
  out spl, temp          ; Kein Einfluss auf Carry
9
  ldi temp, high(ramend)
10
  out sph, temp
11
  ldi temp, $ff          ; 11111111
12
  out ddrd, temp         ; PORTD Ausgabe
13
14
loop:
15
nali:
16
  ror temp       ; ROR = Rotate right through Carry 
17
                 ; aus C=0, temp=11111111 wird C=1, temp=01111111
18
  out ddrd, temp ; IMHO Programmfehler: DDRD oder PORTD ???
19
  cpi temp, 0    ; C=1 wenn abs(0)>abs(temp) sonst C=0, also immer C=0
20
  brne nali      ; Kein Einfluss auf Carry
21
                 ; Branch zu nali wird ausgeführt wenn temp<>0 ist
22
23
nare:
24
  ; temp=0, C=0
25
  rol temp       ; ROL = Rotate left through Carry 
26
                 ; aus C=0, temp=00000000 wird C=0, temp=00000000
27
  out ddrd, temp ; IMHO Programmfehler: DDRD oder PORTD ???
28
  cpi temp, 255  ; 
29
  brne nare      ; Branch zu nare wird ausgeführt wenn temp<>255 ist
30
                 ; d.h. immer, d.h. Endlosschleife, d.h. AVR hängt
31
                 ; mit konstanter Ausgabe 0 auf DDRD (PORTD)
32
  rjmp loop      ; nie erreicht

von Helfer (Gast)


Lesenswert?

Oh geschludert...
1
  cpi temp, 255  ; C=1 wenn abs(255)>abs(temp) sonst C=0, also immer C=1
2
  brne nare      ; Branch zu nare wird ausgeführt wenn temp<>255 ist
3
                 ; => keine Endlosschleife!

von Peter R. (pnu)


Lesenswert?

1. Warum nennst Du eine Schleife "nare", wenn da drin rol ausgeführt 
wird?
Du bist doch kein Lehrer oder Zahnarzt - die müssen so denken.

2.die Syntax lässt doch auch "nachrechts" zu, warum dann das "nare"?

3. Nach dem Ende von main, am label loop hat temp den Inhalt 0xFF und 
das carry- bit ist (hoffentlich) 0, Wie soll da durch rol der Zustand 
0x00 in temp entstehen?

Also das hier stehende Programm hat mit dem beschriebenen Verhalten 
nichts zu tun.
es hängt sich doch in der ersten Schleife schon auf, weil 0 1111 1111 
(8bit+carry) ständig im Kreis herumgeschoben wird.

von Klaus 2. (klaus2m5)


Lesenswert?

...
out   ddrd,temp   ;0=high-z / 1=low  (open collector)
...

von Peter R. (pnu)


Lesenswert?

Sorry, aber die Arbeit des carry nicht beachtet.


Der Übergang aus einer Schleife in die andere geschieht jedesmal mit dem 
Carry-Wert 0. In einer der beiden Schleifen muss es erst noch in den für 
die Schleife typischen Wert 1 von Carry gebracht werden, also mit einem 
zusätzlichen Schleifendurchlauf.

von Peter B. (pebez)


Lesenswert?

Peter R. schrieb:
> Sorry, aber die Arbeit des carry nicht beachtet.
>
>
> Der Übergang aus einer Schleife in die andere geschieht jedesmal mit dem
> Carry-Wert 0. In einer der beiden Schleifen muss es erst noch in den für
> die Schleife typischen Wert 1 von Carry gebracht werden, also mit einem
> zusätzlichen Schleifendurchlauf.

Jetzt wo man es liest, ist es logisch (Stirnklatsch).
Nur im Moment des Suchens fiel mir das absolut nicht auf.
Hast mir geholfen ein Stückchen mehr zu verstehen.

DANKE

Gruß  Peter

von Peter R. (pnu)


Lesenswert?

Ich selbst hab auch recht lange gebraucht, auch wenn mir Helfer (der 
Nick stimmt) ziemlich auf die Sprünge geholfen hat. Seine Kommentare im 
Programm waren entscheidend.

In ASM ist fast Alles logisch, nur man sieht es nicht. Bei so einem 
Problem wie diesem hilft am ehesten ein Simulatordurchlauf, bei dem bei 
jedem Schritt der Zustand von temp und Statusregister verfolgt werden 
kann.

Danke also auch an Helfer.

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.