Ich habe mal zwei Fragen zu einem Assembler Code welchen unser Dozent an der Tafel hatte. Es soll in dem Programm darum gehen von 10 auf 0 zu zählen. Was ich schonmal nicht verstehe.. Der Befehl ldi akku, 0 ist doch überflüssig, da gleich danach immer der Wert aus temp nach Akku geladen wird. ? Oder sehe ich das falsch.? der Befehl ldi temp, 10 direkt danach ist auch überflüssig, da bereits vorher temp mit dem Wert 10 geladen wird und temp anschließend nicht verändert wird. einmal reicht also aus oder? Sorry für die Bilddatei.
Da gibt es noch wesentlich mehr überflüssige Instruktionen. Bei solchen Beispielen wird aber oftmals in späteren Lektionen weiterer Code eingefügt, der dann die "sinnlosen" Instuktionen ausnutzt.
Noch eine Frage, muss bevor dem Befehl brne nicht ein Vergleich z.b mit cpi geschehen?
Hi >Noch eine Frage, muss bevor dem Befehl brne nicht ein Vergleich z.b mit >cpi geschehen? Nö. Das passende flag wird mit "dec temp2". Der mov-Befehl ändert daran nichts. MfG Spess
O.A. schrieb: > Ich habe mal zwei Fragen zu einem Assembler Code welchen unser Dozent an > der Tafel hatte. Man sieht doch deutlich an der unterschiedlichen Formatierung (Space bzw. Tab), daß da jemand 2 Programmteile von 2 Autoren zusammen gepappt hat, ohne sie zu verstehen.
Immerhin ist es schon AVR und nicht mehr Z80 oder MCS51... Dafür kann man ja schon dankbar sein :-P Alle Unklarheiten beseitigt ein Blick in das Dokument 'AVR Instruction Set', bei dem alle Befehle mit allen Auswirkungen auf Flags etc. beschrieben sind.
:
Bearbeitet durch User
Jim M. schrieb: > Da gibt es noch wesentlich mehr überflüssige Instruktionen. > > Bei solchen Beispielen wird aber oftmals in späteren Lektionen weiterer > Code eingefügt, der dann die "sinnlosen" Instuktionen ausnutzt. ok.. das habe ich mir schon gedacht. Eine andere frage. ich verstehe nicht wie dieser Zähler funktionieren soll. Denn vor dem Vergleich brne steht der Befehl mov akku, temp. Das heißt akku und temp sind immer gleich. Der Befehl brne prüft ja die Ungleichheit. Somit wäre es ja nie ungleich. Oder wie kann man das verstehen.?
Jim M. schrieb: > Da gibt es noch wesentlich mehr überflüssige Instruktionen. Ja, das sieht wirklich gruslig aus. Z.B. dieses völlig sinnlose Umherladen zwischen "akku" und "temp".
O.A. schrieb: > Oder wie kann man das > verstehen.? MOV verändert nun mal keine Flags. Die sind immer noch vom DEC Befehl übrig. Schau dir das Instruction Set an.
Matthias S. schrieb: > Immerhin ist es schon AVR und nicht mehr Z80 oder MCS51... Warum um alles in der Welt definiert man in einer Mehrregistermaschine einen "Akku"? Die zugrundeliegende Denkweise ist offenbar immer noch 8051... O.A. schrieb: > Das heißt akku und temp sind immer gleich. Der Befehl brne prüft ja die > Ungleichheit. brne fragt nur das Zero-Flag ab. Das wird aber durch mov nicht verändert. Der letze auf dieeses Flag wirkende Befehl ist dec temp. EDIT: Hoppla, zu lang gewartet... ;-)
:
Bearbeitet durch Moderator
Lothar M. schrieb: > Die zugrundeliegende Denkweise ist offenbar immer noch > 8051... DEC geht beim 8051 auch auf Register und direkt RAM. Auch verändert beim 8051 DEC keine Flags, man kann z.B. DJNZ nehmen.
Peter D. schrieb: > DEC geht beim 8051 auch auf Register und direkt RAM. Auch verändert beim > 8051 DEC keine Flags, man kann z.B. DJNZ nehmen. Da erkennt man wo der obige Programmablauf herkommt: vom 8051. Dort wird das Zero-Flag bei DEC nicht beeinflusst. Es wird dann gesetzt, wenn der Akku Null ist! Delhalb hier das Gewusel mit temp und AKKU.
Yupp, so wie sdfu das geschrieben hat. Der ganze Beispielcode ist völlig ineffizient. Offensichtlich wird nach der Schleife dann der Zähler neu geladen und wahrscheinlich nach "mainloop" gesprungen? Dann würde man einfach noch einen Tick weiter nach oben springen und hat die Zählerinitialisierung nur ein mal im Code stehen. Das spart etwas Speicher (ja, interessiert heute niemanden mehr, bis sie dann vor die Wand klatschen weil der Microcontroller doch voll ist…), macht den Code besser lesbar weil der Kontext klarer wird und es reduziert die Anzahl der Stellen an denen man ggf. etwas ändern muss wenn man einen anderen Schleifenwert braucht. Also dem Dozenten fehlt die Routine mit Assembler zu programmieren.
Route 6. schrieb: > Da erkennt man wo der obige Programmablauf herkommt: vom 8051. In 8051 hätte man eher geschrieben:
1 | mov P1, #10 |
2 | marke: |
3 | djnz P1, marke |
Dann würde auch der Wert 0 auf dem Port 1 erscheinen. Bzw. nur von 10..1:
1 | mov r7, #10 |
2 | marke: |
3 | mov p1, r7 |
4 | djnz r7, marke |
Lothar M. schrieb: > Die zugrundeliegende Denkweise ist offenbar immer noch > 8051... Route 6. schrieb: > Da erkennt man wo der obige Programmablauf herkommt: vom 8051. Ihr habt recht - es fällt mir wie Schuppen aus den Haaren :-P Der Schreiberling hat sich anscheinend nie wirklich von MCS-51 verabschiedet. Und ich versuche die ganze Zeit, in dem Rumschieben zwischen akku und temp einen Sinn zu sehen, schade um die Zeit...
:
Bearbeitet durch User
Route 6. schrieb: > Da erkennt man wo der obige Programmablauf herkommt: vom 8051. > Dort wird das Zero-Flag bei DEC nicht beeinflusst. Es wird dann > gesetzt, wenn der Akku Null ist! Delhalb hier das Gewusel mit temp und > AKKU. Denkt ihr dass ein DEC einer SRAM-Speicherstelle (Temp) ein Zeroflag setzen müsste bei 0 ? Ich habe mich schon gewundert was ihr meint und dachte schon dass meine 8051-Kenntnisse nicht viel wert sind :-)
Hüstel schrieb: > Denkt ihr dass ein DEC einer SRAM-Speicherstelle (Temp) ein Zeroflag > setzen müsste bei 0 ? Das ist bei allen mir bekannten Prozessoren die Operationen auf Speicher ausführen können so. Aber ich kenne nicht alle… ;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.