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
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.
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?
zbsp wenn ich ein brne mache bricht es doch die operation ab und der PC fängt doch von anfang an oder?
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. ...
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?!
> 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.
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.