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
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.
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.
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
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.