Lieber Thomas!
Tust Du mir den gefallen und schaust Du Dir das mal im Simulator an?
Immer mit F11 weiter und beobachte die Register uvm. ...
Nichts fertigNochmal ganz langsam:
ldi temp , LOW ((daten * 2) + daten_laenge)
daten ist die Adresse, zu der gesprungen werden soll.
Das nimmt man wie gewohnt mal zwei.
Dazu addieren wir dann 6 (Bytes), um das Ende festzulegen.
Das vergleichen wir dann mit der Funktion cp mit ZL, dem LOWbyte.
Das ganze dann nochmal mit dem Highbyte.
Fertig, das ist alles!
Ich verstehs einfach nicht.
Wir haben doch dort eine Schleife, also rufen wir doch auch 6x diesen Befehl hier auf:
ldi temp , LOW ((daten * 2) + daten_laenge)
Wenn nun das Zeichen "!" kommt, dann sind wir ja nicht mehr bei 6 Byte, sondern schon beim 12 Byte.
Hmm..egal![]()
Lieber Thomas!
Tust Du mir den gefallen und schaust Du Dir das mal im Simulator an?
Immer mit F11 weiter und beobachte die Register uvm. ...
Hab ich doch schon alles gemacht.
ldi reg1, 0b00000000
ldi reg2, 0b11111111
cp reg2, reg1
Dann hat sich im SREG was geändert, schau ich hier nach: http://www.avr-asm-tutorial.net/avr_...tail.html#SREG
S und N sind auch 1. Was sagt mir das?
Dass das Vorzeichen negativ ist und das Ergebnis dann logischerweise auch negtativ. Was schließe ich daraus? das der Befehl cp reg1 - reg2 rechnet. Aber das ist ja nicht so, denn bei deinem Bild, was du hier eingefügt hast, steht:
cp Rd, Rr Compare Rd - Rr
Müsste dann bei "cp reg2, reg1" wohl reg2 - reg1 sein. Aber da ist das Ergebnis ja nicht negativ, sonder = reg2.
Bei cpc kommt bei den Werte oben dasselbe raus, soweit so gut, doch bei folgenden Werten:
ldi reg1, 0b11111111
ldi reg2, 0b11111111
kommt bei cp reg2, reg1
Z von SREG = 1, also Ergebnis ist 0, also die Werte beider Register sind
gleich, logisch. Aber bei "cpc reg2, reg1" kommt auf einmal nichts raus. Also alle Bits von SREG sind 0. Somit heißt es unter anderem auch, dass die Werte der Register reg1 und reg2 ungleich sind, sind sie aber doch nicht.
Ich hoffe, du weißt nun, wo mein Problem liegt![]()
Lieber Thomas! ;o)
Also bei mir funktioniert das richtig!
Ich komme irgendwie mit dem Problem nicht zurecht! ;o9 *schmunzel*
Naja, dann is auch egal, muss ich eben so hinnehmen.
*g* Ist die Funktion trotzdem in etwa klar?
Naja, weniger...
Nach diesem Befehl hierCode:main: lpm ;Daten laden mov tmp, lpm_reg ;in temp verschieben adiw ZL, 1 ;Z um eins erhöhen ldi tmp, LOW ((daten1 * 2) + daten_laenge) ;vergleiche LOW-Byte cp ZL, tmp ldi tmp, HIGH ((daten1 * 2) + daten_laenge) ;vergleiche HIGH-Byte cpc ZH, tmp breq ende ;springe zu ende, wenn letztes Byte ausgelesen rjmp main ;nochmal ende: ;Endschleif rjmp ende
mov tmp, lpm_reg
erhöhen wir den Zeiger ja um 1, ne? Damit wir das nächste Byte bekommen, also den nächsten Buchstaben. Und dann benutzt du aber wieder das gleich Register, wo wir ja eigentlich das Wort "Hallo!" drinne haben wollten:
ldi tmp, LOW ((daten1 * 2) + daten_laenge)
Da schreiben wir dann in tmp wieder einen völlig anderen Wert.
[EDIT]
Was mir grad auffällt, nach der Zeile hier:
cp ZL, tmp
da werten wir den Vergleich gar nicht aus, sonder nur nach cpc wird ausgewertet. Wieso das denn?![]()
In dem Moment, wo wir die main-Schleife betreten haben wir ja noch die Adresse von 'H' in Z stehen, also daten1 + 0.
Wir lesen dann das 'H' aus.
Danach erhöhen wir auf daten1 + 1 und vergleichen mit dem Wert für das erste Byte nach dem String, also daten1 + 6 (das siebte Byte).
Nun springen wir wieder an den Anfang.
und mache das gleiche mit 'a', 'l', 'l', 'o' und '!'.
Sobald wir nach dem '!' wiederholen, sieht das ganze so aus:
Wir haben im Z daten1 + 5 (6. Byte) und laden mit lpm das Byte in r0.
Das verschieben wir nach temp.
Danach erhöhen wir Z um 1, also haben wir daten1 + 6 (7.Byte, was nciht mehr da ist).
Wir vergleichen nun die Register mit jeweils dem Endwert und da glaich, springen wir mit breq zum Ende!
Ich hoffe es war verständlicher?
Ja, schon ein wenig, zwar nicht ganz...naja, für manche Sachen ist mal wohl zu doof. Das wird auch nicht das wichtigste sein, denk ich. Ich hoffe ich kann auch weitermachen, wenn ich das jetzt hier nicht so richtig verstanden habe.
Aber wenn wir beim "!" angekommen sind, dann ist doch das aktuelle Byte das Byte 6 oder? Weil ja das Ausrufezeichen das 6. Zeichen ist. Und wenn wir dann noch mit daten1+6 vergleichen, dann sind wir ja bei 12, denn 6 (Byte 6 = !) + 6 (Das Ende von der Zeichenkette) = 12.
Hallo Thomas!
Du würfelst jetzt alles durcheinander!
Nur zu Anfang wird die Adresse mal 2 genommen!
Zum Schluss wird immer nur + 1 genommen, ohne dass mal 2 genomnmen wird!
'H' ist das 1. Byte und wird bei (daten1 * 2) + 0 ausgelesen.
'a' ist das 2. Byte und wird bei (daten1 * 2) + 1 ausgelesen.
'l' ist das 3. Byte und wird bei (daten1 * 2) + 2 ausgelesen.
'l' ist das 4. Byte und wird bei (daten1 * 2)1 + 3 ausgelesen.
'o' ist das 5. Byte und wird bei (daten1 * 2) + 4 ausgelesen.
'!' ist das 6. Byte und wird bei (daten1 * 2) + 5 ausgelesen.
FF ist das leere Byte nach dem Strin (Zeichenkette) und wird mit (daten1 * 2) + 6 ausgelesen.
ich glaube ich habe Dich durcheinander gebracht! *lol*
Lesezeichen