www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Register Verständniss probleme


Autor: vlplayer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.....
und zwar habe ich folgende frage bin eigentlich ziemlich unerfahren auf 
dem gebiet Mikroprozessorentechnik und wollte nun von euch wissen , wie 
sich die register im laufe eines codes verändern . Das heisst verändert 
der befehl "add" jedesmal das register gleich?! Wer kann mir das ein 
bisschen erläutern eine kleine aufgabe hab ich angehängt

Danke im vorraus


.cseg bzw. .text
00000c 940e 000f call test
00000e 9598 break
test:
00000f 920f push r0
000010 900d lo: ld r0,x+
000011 9209 st y+,r0
000012 2000 tst r0
000013 f7e1 brne lo
000014 900f pop r0
000015 9508 ret
000016 940e 000f call test
000018 9598 break
.dseg bzw. .data
000100: 01 02 CA BB AC 9D 8E 7F 41 42 00 AC CA FF FF 12
000110: 01 02 CA BB AC 9D 8E 7F 8E 7F 9D AC CA FF 00 18
000120: 01 02 CA BB AC 9D 8E 7F 8E 7F 9D AC CA FF FF 12

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vlplayer schrieb:

> und zwar habe ich folgende frage bin eigentlich ziemlich unerfahren auf
> dem gebiet Mikroprozessorentechnik und wollte nun von euch wissen , wie
> sich die register im laufe eines codes verändern . Das heisst verändert
> der befehl "add" jedesmal das register gleich?!

Das wollen wir doch schwer hoffen, dass es dafür genaue Regelungen gibt, 
was jeder einzelne Befehl exakt zu machen hat. Und zwar jedesmal wenn er 
ausgeführt wird.

> Wer kann mir das ein
> bisschen erläutern eine kleine aufgabe hab ich angehängt

Deine beste Quelle ist das 'Instruction Set Manual (gibts bei Atmel
http://www.atmel.com/dyn/resources/prod_documents/...
)

Dort ist für jeden Befehl exakt aufgelistet, was er genau macht. 
Inklusive aller Änderungen und Auswirkungen auf sonstige Register bzw. 
die CPU-Flags

Du hast dieselbe Information auch im AVR-Studio zur Verfügung. Einfach 
den Cursor auf den fraglichen Befehl stellen und F1 drücken. AVR-Studio 
sucht dann die zu diesem Befehl gehörende Dokumentation raus, in der 
genau dasselbe drinnen steht.

Am Beispiel des 'ADD'
ADD – Add without Carry

Description:
Adds two registers without the C Flag and places the result in the destination register Rd.

Also: der Name des Befehls und eine Kurzbeschreibung der Funktion. ADD 
addiert 2 Register und legt das Ergebnis in einem destination Register 
(also dem Ziel; engl. Destination: Ziel) ab
Operation:
(i) Rd ← Rd + Rr

Das ist dasselbe nocheinmal, nur in der Kurznotation. Rd (das 
Destination Register) erhält die Summe aus Rd und Rr
Syntax:          Operands:                Program Counter:
(i) ADD Rd,Rr    0 ≤ d ≤ 31, 0 ≤ r ≤ 31   PC ← PC + 1
16-bit Opcode:

Hier wird erklärt wie die Schreibweise im Assembler ist, und welche 
Restriktionen es gibt. Man kann also für Rd und Rr jedes beliebige 
Register nehmen. Der Befehl funktioniert mit allen 32 in der CPU 
vorhandenen Registern.
Der Abschnitt wie der Opcode gebildet wird, ist für einen 
Assembler-Programmierer nicht so interessant. Das ist mehr für die Leute 
die den Assembler selber oder Compiler oder Debugger schreiben, also die 
Werkzeuge, die du als normaler Programmierer dann einfach benutzt.
Status Register (SREG) and Boolean Formula:
H: Rd3•Rr3+Rr3•R3+R3•Rd3           Set if there was a carry from bit 3; cleared otherwise
S: N ⊕ V,                          For signed tests.
V: Rd7•Rr7•R7+Rd7•Rr7•R7           Set if two’s complement overflow resulted from the operation; cleared otherwise.
N: R7                              Set if MSB of the result is set; cleared otherwise.
Z: /R7•/R6•/R5•/R4•/R3•/R2•/R1•/R0 Set if the result is $00; cleared otherwise.
C: Rd7 •Rr7 +Rr7 •R7+ R7 •Rd7      Set if there was carry from the MSB of the result; cleared otherwise.

R (Result) equals Rd after the operation.

Der Teil ist dann wieder wichtig. Hier werden die Auswirkungen des 
Befehls auf die Status Flags beschrieben. Das Zero Flag Z (welches 
anzeigt ob ein Ergebnis 0 war), wird zb gebildet, indem die Einzelbits 
miteinander multipliziert werden. Kommt da 1 raus, wird das Zero Flag 
gesetzt und ansonsten gelöscht. Das mit dem Flag überhaupt etwas 
passiert, kann man dem unmittelbar vorhergehenden Schaubild der Flags 
entnehmen. Das I und das T Flag werden von diesem Befehl überhaupt nicht 
verändert. Alle anderen schon.


Und so gibt es für jeden Befehl eine exakte Beschreibung, was er tut, 
welche Nebenbedingungen es gibt und welche Nebeneffekte er hat.

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: vlplayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok soweit so gut.... danke schonmal
nun hab ich jedoch wirklich noch die probleme zu verstehen wie sich der 
programm counter nach push oder add ändert?! ändert er sic überhaupt?

Autor: vlplayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zbsp wenn ich ein brne mache bricht es doch die operation ab und der PC 
fängt doch von anfang an oder?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vlplayer schrieb:
> zbsp wenn ich ein brne mache bricht es doch die operation ab und der PC
> fängt doch von anfang an oder?

Nein. Ist die Bedingung unwahr, dann erhöht sich der PC um 1 (nächster 
Befehl). Ist die Bedingung wahr, so wird der zum Branch-Befehl gehörige 
Parameter zum PC addiert. Dieser gibt die relative Entfernung zum 
Sprungziel an. Einzelheiten kannst Du in der Befehlsbeschreibung zu 
BRNE.

...

Autor: VLplayer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ok danke
nun versteh ich eine sache noch nicht und zwar bei der Lösung zu der 
aufgabe. Verstehe ich den speicher inHalt von R0 nicht wie finde ich den 
heraus?!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 000100: 01 02 CA BB AC 9D 8E 7F 41 42 00 AC CA FF FF 12
                                  ^^
X hat zu Beginn den Wert 0x108. Der Inhalt der Speicheradresse auf die X 
zeigt wird nach R0 übertragen (0x41) und X wird um eins erhöht (X+). 
Damit hast du die erste Änderung des Inhalts von R0 durch den ld R0,X+ 
Befehl. Die zweite und dritte Änderung sind analog. Die vierte Änderung 
durch das pop R0 ist das Zurückladen des Wertes 0x12, der am Anfang mit 
push R0 auf den Stack (SP = Stackpointer) geschrieben wurde.

Autor: VLplayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank
hat mir sehr weiter geholfen

mfg

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.