Forum: Mikrocontroller und Digitale Elektronik Zähler in Assembler


von O.A. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Jim M. (turboj)


Lesenswert?

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.

von O.A. (Gast)


Lesenswert?

Noch eine Frage, muss bevor dem Befehl brne nicht ein Vergleich z.b mit 
cpi geschehen?

von spess53 (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von O.A. (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
von Peter D. (peda)


Lesenswert?

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.

von Route_66 H. (route_66)


Lesenswert?

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.

von sdfu (Gast)


Lesenswert?

ldi    tmp,10
Marke:
    out    PortB,temp
    dec    temp
    brne  Marke

von Guido Körber (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Hüstel (Gast)


Lesenswert?

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  :-)

von Guido Körber (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.