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.