Verständnisfrage ASM

OP #2344062
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
Gast #2344120
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
#2344134
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.
#2344202
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.
OP #2344499
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
#2344505
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.

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