Hallo,
versuche mich gerade mit den Grundzügen in die Assembler-Sprache ein
zuarbeiten. ( ATmega16)
Ich will anfangs mit einfachste Befehle arbeiten.
Liege ich hiermit richtig :
Port D als Ausgang
LDI r16,0xFF
OUT DDRD ,r16
Port D als Eingang:
LDI r16,0x00
IN DDRD ,r16
Kopieren des Inhaltes von r13 nach r14 :
MOV r14,r13
Über konstruktive Beiträge würde ich mich freuen :)
S. Landolt (Gast) Danke du bist anscheinend ein Richtiger Profi :))
nun zu den Befehlen PUSH und POP ( bzw. Stackpointer)
Um das ganze richtig zu verstehen :
Mit Push starte ich ein Unterprogramm, bzw. hole mir einen Befehl vom
Arbeitsregister mit dem Stackpointer)
Mit Pop beende ich ein Unterprogramm, bzw. lege den Befehl mithilfe des
Stackpointers ins Arbeitsregister zurück)
Assembler-Unterprogramm ( Port D als Ausgang) :
CALL
PUSH r16
LDI r16,0x00
IN DDRD ,r16
POP r16
RET
Liege ich damit auch richtig ?
S. Landolt schrieb:> (ich glaube, ich gehöre ins Bett)>>> LDI r16,0x00>> IN DDRD ,r16>> Das muss natürlich>> out DDRD,r16>> heißen.
Warum wird hier ebenfalls der Befehl "OUT" verwendet ?
Es ist doch ein Eingang ?
Matze schrieb:> Warum wird hier ebenfalls der Befehl "OUT" verwendet ?> Es ist doch ein Eingang ?
Oder lese ich mit dem Befehl "IN " Daten in den Eingang ein ?
Willst du jetzt alle Befehle einzeln durchgehen?
Matze schrieb:> Mit Push starte ich ein Unterprogramm, bzw. hole mir einen Befehl vom> Arbeitsregister mit dem Stackpointer)
nö
> Mit Pop beende ich ein Unterprogramm, bzw. lege den Befehl mithilfe des> Stackpointers ins Arbeitsregister zurück)
nö
> Assembler-Unterprogramm ( Port D als Ausgang) :>> CALL>> PUSH r16>> LDI r16,0x00> IN DDRD ,r16>> POP r16>> RET
Das wiederum ist richtig.
Call /return sichern den PC auf dem stack bzw holen ihn von dort zurück.
Dass passiert automatisch ohne push und pop.
push/pop brauchst du, wenn du in einem Unterprogramm Register
veränderst, die eigentlich das aufrufende Programm verwendet.
Also am Anfang sichern, beliebig verwenden, wiederherstellen und return.
in DDRD,... ist aber immer noch falsch bzw kannst du dir das ldi vorher
sparen.
Das SFR (special function register) DDR wird geschrieben, also muss da
grundsätzlich out stehen. (mal davon abgesehen, dass man es auch lesen
könnte, aber es steht ja nur drin, was man vorher irgendwann mal
hineingeschrieben hat).
1
...
2
rcall D_auf_Eingang
3
...
4
5
6
D_auf_Eingang:
7
push r16
8
ldi r16,0
9
out DDRD,r16
10
pop r16
11
ret
Die Beschreibungen
> Mit Push starte ...> Mit Pop beende ...
sind falsch.
> Oder lese ich mit dem Befehl "IN " Daten in den Eingang ein ?
Sie lesen mit in Daten vom Eingang ein, also z.B. von PIND.
H.Joachim S. schrieb:> Willst du jetzt alle Befehle einzeln durchgehen?
nein, nur diesen Bereich, sry bin neu in diesem Gebiet
> Also am Anfang sichern, beliebig verwenden, wiederherstellen und return.
Sprich ich sichere mit dem Befehl POP das Arbeitsregister um es beliebig
verwenden zu können.
Und mit dem Befehl Pop schiebe ich meine bearbeiteten Befehle wieder ins
Arbeitsregister zurück ??
Matze schrieb:> Sprich ich sichere mit dem Befehl POP das Arbeitsregister um es beliebig> verwenden zu können.>> Und mit dem Befehl Pop schiebe ich meine bearbeiteten Dateb wieder ins> Arbeitsregister zurück ??
Ist es so sinngemäß zu verstehen ? :))
S. Landolt schrieb:> Sagen wir lieber "meine vorher gesicherten Daten".
Ok super, hat licht ins dunkle gebracht :)
Hier mein Verständnis zum Speicher :
EEPROM : nichtflüchtig und Betriebsstunden etc.
Flash : nichtflüchtig und für Programme
RAM : flüchtig und Datenspeicher
Im groben so richtig, oder gibt es noch einen signifikanten Unterschied
?
mit push legt man z.B: die Daten eines Arbeisregisters auf einen
"Stapel" danach kann man das Arbeitsregister für andere Sachen
verwenden, wenn man fertig ist holt man das ganze mit pop wieder vom
Stapel runter.
Man kann auch nach dem Ablegen auf dem Stapel weitere Sachen auf den
Stapel legen um an den untersten wert wieder ranzukommen muss man die
oberen Teile zuerst abholen.