Ich habe mal ne frage zu der Codestelle:
1 | subi r16,minimum ; Nullpunkt verschieben
| 2 | cpi r16,(maximum-minimum+1) ; Index auf Maximum prüfen
| 3 | brsh kein_Treffer ; Index zu gross -> Fehler
|
was geschieht hier genau? Ich Interpretiere das jetzt so, dass ein
Fegler kommt wenn minimum>maximum ist...ist das korrekt?
Florentin Schirmer wrote:
> Ich habe mal ne frage zu der Codestelle:
>
> 1 | > subi r16,minimum ; Nullpunkt verschieben
| 2 | > cpi r16,(maximum-minimum+1) ; Index auf Maximum prüfen
| 3 | > brsh kein_Treffer ; Index zu gross -> Fehler
| 4 | >
|
>
> was geschieht hier genau? Ich Interpretiere das jetzt so, dass ein
> Fegler kommt wenn minimum>maximum ist...ist das korrekt?
Nein.
Angenommen minimum habe den Wert 5 und maximum den Wert 8,
dann überprüft (im Prinzip) der Code ob der Wert in r16
zwischen 5 und 8 liegt.
Er tut das, in dem er von r16 zunächst mal die 5 abzieht
und das Ergebnis dann mit (8-5+1 = 4) vergleicht. Wenn das
Ergebnis 4 oder größer war, dann liegt r16 ausserhalb des
zulässigen Bereichs
r16 r16-5 (r16-5 >= 4)
3 3 - 5 = 254 ja -> Wert ausserhalb
6 6 - 5 = 1 nein -> Wert im Bereich
9 9 - 5 = 4 ja -> Wert ausserhalb
@ Florentin Schirmer (tuxianer)
>Ich habe mal ne frage zu der Codestelle:
> subi r16,minimum ; Nullpunkt verschieben
> cpi r16,(maximum-minimum+1) ; Index auf Maximum prüfen
> brsh kein_Treffer ; Index zu gross -> Fehler
>was geschieht hier genau? Ich Interpretiere das jetzt so, dass ein
Das steht doch im Tutorial. Es wird geprüft, ob der Wert in r16 zwischen
minimum und maximum liegt
minimum <= r16 <= maximum
Wenn nicht, wird zu kein_Treffer gesprungen.
>Fegler kommt wenn minimum>maximum ist...ist das korrekt?
Nein.
MfG
Falk
achso...r16 ist der zu prüfende wert....
noch ne Frage zum 2. Teil:
1 | ldi ZL,low(Sprungtabelle) ; Tabellenzeiger laden, 16 Bit
| 2 | ldi ZH,high(Sprungtabelle)
| 3 | add ZL,r16 ; Index addieren, 16 Bit
| 4 | ldi r16,0
| 5 | adc ZH,r16
| 6 | ijmp
|
wie genau funktioniert das...der Index wird ja irgeendwie in den Z
Pointer addresiert und das der 16 bit hat muss das ganze ausgesplittet
werden...aber wie kommt es dann zur finalen adresse?
@ Florentin Schirmer (tuxianer)
????
Das wird ja nun alles HAARKLEIN beschrieben. Ist das WIRKLICH SOO
unverständlich.
Ist mir unverständlich ;-)
>wie genau funktioniert das...der Index wird ja irgeendwie in den Z
>Pointer addresiert und das der 16 bit hat muss das ganze ausgesplittet
>werden
Ja, eben! Dafür gibt es zwei Befehle. Die laden das LOW und das HIGH
Byte von Z, auch als ZL und ZH bekannt. Das machen die zwei ersten
Zeilen.
>...aber wie kommt es dann zur finalen adresse?
Durch Addition des Index. Und da der Index nur eine 8-Bit Zahl ist, muss
er erweitert werden (HIGH Byte ist Null) und als 16 Bit-Wert addiert
werden.
Das machen die drei nächsten Zeilen.
MFG
Falk
>>...aber wie kommt es dann zur finalen adresse?
>
> Durch Addition des Index. Und da der Index nur eine 8-Bit Zahl ist, muss
> er erweitert werden (HIGH Byte ist Null) und als 16 Bit-Wert addiert
> werden.
> Das machen die drei nächsten Zeilen.
>
> MFG
> Falk
ja und genau das versteh ich nicht...kannst du mir das mal anhand von
Zalen erläutern...?
r16 wird zu ZL adsiert aber was ist ZL jetzt Zahlenmäsig und was kommt
raus?
Florentin Schirmer (tuxianer)
Datum: 03.08.2007 15:39
>>...aber wie kommt es dann zur finalen adresse?
>
> Durch Addition des Index. Und da der Index nur eine 8-Bit Zahl ist, muss
> er erweitert werden (HIGH Byte ist Null) und als 16 Bit-Wert addiert
> werden.
> Das machen die drei nächsten Zeilen.
>
> MFG
> Falk
ja und genau das versteh ich nicht...kannst du mir das mal anhand von
Zalen erläutern...?
r16 wird zu ZL adsiert aber was ist ZL jetzt Zahlenmäsig und was kommt
raus?
@ Florentin Schirmer (tuxianer)
>ja und genau das versteh ich nicht...kannst du mir das mal anhand von
>Zalen erläutern...?
Das ist wie das Addieren mit Papier und Bleistift (kann das die
Generation PISA noch? :-)
Man muss mit Übertrag rechnen.
Also, sagen wir in ZH steht 5, in ZL steht 252, unser Index in r16 ist
26. Das Z-Register zeigt also nach 5*256+252 = 1532 = 0x05FC
ZL + r16 = 252 + 26 = 278
Diese Zahl ist zu gross für 8 Bit, es kommt zum arithmetischen Überlauf.
Der setzt das Carry-Flag. In ZL steht dann 278-256 = 22
Danach wird r16 mit 0 geladen. Danach werden R16 + das Carry-Flag zu ZH
addiert
ZH + R16 + Carry = 5 + 0 + 1 = 6
Damit zeigt das Z-Register auf 6*256 + 22 = 1558 = 0x0616
>r16 wird zu ZL adsiert aber was ist ZL jetzt Zahlenmäsig und was kommt
>raus?
Das kann man im AVR-Studio wunderbar simulieren.
MfG
Falk
dasist ja alles soweit klar...nur wie kommen die Zahlen ins Th bzw. ZL?
@ Florentin Schirmer (tuxianer)
>dasist ja alles soweit klar...nur wie kommen die Zahlen ins Th bzw. ZL?
???
Sie werden geladen?
Mit ldi?
Mfg
Falk
ja...hier:
ldi ZL,low(Sprungtabelle) ; Tabellenzeiger laden, 16 Bit
ldi ZH,high(Sprungtabelle)
aber wie nimmt der aus Sprungtabele nen Wert???
"Sprungtabelle" ist ein Label. Und jedes Label kann zu einer (16-Bit)
Adresse aufgelöst werden. Das macht der Assemblierer.
Irgendwo im Code hast du dieses Label stehen. Das sieht ungefähr so aus:
1 | Sprungtabelle:
| 2 | .db 1, 3
| 3 | .db 2, 7
|
EDIT: Ups, es geht ja garnicht um eine Datentabelle. Dann ist mein
Codeausschnitt natürlich mumpitz. Für eine richtige Sprungtabelle siehe
2 Posts unter diesem.
Oder was auch immer. Die Daten (.db) müssen ja an irgendeiner
Flash-Adresse stehen - "Sprungtabelle" eben.
@ Florentin Schirmer (tuxianer)
>aber wie nimmt der aus Sprungtabele nen Wert???
Das steht doch nun WIRKLICH im Tutorial. Hast du das überhaupt mal in
RUHE gelesen?
Kopfschütelnd
Falk
naja ich habe den Code hier:
.include "m8def.inc"
; Mehrfachverzweigung Version B
; Clevere Version mit Sprungtabelle
; minimum und maximum sind auf 0..255 begrenzt!
.equ minimum = 3
.equ maximum = 7
start_vergleich:
subi r16,minimum ; Nullpunkt verschieben
cpi r16,(maximum-minimum+1) ; Index auf Maximum prüfen
brsh kein_Treffer ; Index zu gross -> Fehler
ldi ZL,low(Sprungtabelle) ; Tabellenzeiger laden, 16 Bit
ldi ZH,high(Sprungtabelle)
add ZL,r16 ; Index addieren, 16 Bit
ldi r16,0
adc ZH,r16
ijmp ; indirekter Sprung in
Sprungtabelle
kein_treffer:
; hier stehen jetzt alle Anweisungen für den Fall, dass keiner der
Vergleiche erfolgreich war
rjmp ende_vergleich
Sprungtabelle:
rjmp zweig_0
rjmp zweig_1
rjmp zweig_2
rjmp zweig_3
rjmp zweig_4
zweig_0:
; hier stehen jetzt alle Anweisungen für diesen Zweig
rjmp ende_vergleich
zweig_1:
; hier stehen jetzt alle Awneisungen für diesen Zweig
rjmp ende_vergleich
zweig_2:
; hier stehen jetzt alle Anweisungen für diesen Zweig
rjmp ende_vergleich
zweig_3:
; hier stehen jetzt alle Anweisungen für diesen Zweig
rjmp ende_vergleich
zweig_4:
; hier stehen jetzt alle Anweisungen für diesen Zweig
rjmp ende_vergleich
ende_vergleich:
; hier geht das Programm weiter
rjmp ende_vergleich ; nur für Simulationszwecke!
ENTFERNEN!
wo steht das?
Falk Brunner wrote:
> @ Florentin Schirmer (tuxianer)
>
>>aber wie nimmt der aus Sprungtabele nen Wert???
>
> Das steht doch nun WIRKLICH im Tutorial. Hast du das überhaupt mal in
> RUHE gelesen?
>
> Kopfschütelnd
> Falk
@ Florentin Schirmer (tuxianer)
>wo steht das?
Soll ich dir das Tutorial jetzt vorlesen?
Unter Programmbeschreibung.
MfG
Falk
sryy das mit de adresse habe ich echt überlesen...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|