Register Verständniss probleme

Gast #1648989
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
Angehängte Dateien:
#1649002
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/doc0856.pdf
)

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'
1
ADD – Add without Carry
2

3
Description:
4
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
1
Operation:
2
(i) Rd ← Rd + Rr

Das ist dasselbe nocheinmal, nur in der Kurznotation. Rd (das 
Destination Register) erhält die Summe aus Rd und Rr
1
Syntax:          Operands:                Program Counter:
2
(i) ADD Rd,Rr    0 ≤ d ≤ 31, 0 ≤ r ≤ 31   PC ← PC + 1
3
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.
1
Status Register (SREG) and Boolean Formula:
2
H: Rd3•Rr3+Rr3•R3+R3•Rd3           Set if there was a carry from bit 3; cleared otherwise
3
S: N ⊕ V,                          For signed tests.
4
V: Rd7•Rr7•R7+Rd7•Rr7•R7           Set if two’s complement overflow resulted from the operation; cleared otherwise.
5
N: R7                              Set if MSB of the result is set; cleared otherwise.
6
Z: /R7•/R6•/R5•/R4•/R3•/R2•/R1•/R0 Set if the result is $00; cleared otherwise.
7
C: Rd7 •Rr7 +Rr7 •R7+ R7 •Rd7      Set if there was carry from the MSB of the result; cleared otherwise.
8

9
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.
#1662720
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.

...
Persönliche Seite #1666380
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren