Seite 1 von 3

"Spitzenklausur"

Verfasst: So 20. Jul 2008, 10:34
von Jochen
Tach,

mal wieder was von mir.

in der letzten Aufgabe sollen 75 und 38 (binär) logisch AND verknüpft werden.

mMn sollte das wohl 1 sein, die freunde von der Musterlösung bekommen aber 2 raus. wo liegt der Fehler

75 -> 1001011
38 -> 0100110

da ist bei mir nur eine eins doppelt..

Re: "Spitzenklausur"

Verfasst: So 20. Jul 2008, 10:59
von K-Bal
Habs grad mal im durchgeschaut, du müsstest wohl recht haben. Vielleicht fängt der Assembler ja bei 1 an zu zählen :lol: Ich würde es jedenfalls mal im AVR-Studio testen.

Re: "Spitzenklausur"

Verfasst: So 20. Jul 2008, 15:01
von mkloeckner
Ich hab auch ne Frage zur Spitzenklausur.

Bei der Assembler-Stack Aufgabe 3.1:

Code: Alles auswählen

.include "m8def.inc"
0:   LDI r16, LOW(RAMEND)
1:   OUT SPL, r16
2:   LDI r16, HIGH(RAMEND)
3:   OUT SPH, r16
4:   LDI r31, 1
5:   LDI r30, 1
6:   LDI r16, 0
7:   PUSH r30
8:   LD r30,Z
9:   PUSH r30
10:  PUSH r16
11:  RET
12:  ADD r31,r30
13:  PUSH r31
14:  POP r31
15:  NOP ;Programmende
Dort soll man den Stack bei jedem Schritt aufschreiben.
Die Musterlösung schreibt ab Zeile 9 steht eine "14" an oberster Stelle. Z = 14? Wieso das?!
Und: Meiner Meinung nach (habs auch im AVR Studio überprüft) werden Zeilen 12-15 nie erreicht. Das RET in Zeile 11 bewirkt ne Endlosschleife. Wieso wird laut Lösung 13 & 14 erreicht (angeblich steht dann nichts im Stack)?!

Bin für Erklärungen sehr dankbar. :lol:

Re: "Spitzenklausur"

Verfasst: So 20. Jul 2008, 16:11
von Chris087
@Jochen
Damit ist wohl nicht die Anzahl der Einsen gemeint, sondern:
Das Ergebnis wäre ja:
0000010
was der Binärcode für eine "2" ist.
Hoffe dir is damit geholfen :)

Re: "Spitzenklausur"

Verfasst: So 20. Jul 2008, 16:26
von testuser
mkloeckner hat geschrieben:Ich hab auch ne Frage zur Spitzenklausur.

Dort soll man den Stack bei jedem Schritt aufschreiben.
Die Musterlösung schreibt ab Zeile 9 steht eine "14" an oberster Stelle. Z = 14? Wieso das?!
Weil die Quersumme aus 257 eine 14 ergibt, denn r30 und r31 sind jeweils 1 => Z = 0b0000000100000001 = 257.
Deswegen springt der programm counter bei "ret" auf die stelle 14.

Re: "Spitzenklausur"

Verfasst: Mo 21. Jul 2008, 16:58
von Chris087
Was passiert denn genau beim Befehl:

LD r30, Z in Zeile 8?

Welches Register oder welche Adresse wird da wo reingeladen?? Was ist Z?
Danke schonmal

Re: "Spitzenklausur"

Verfasst: Mo 21. Jul 2008, 18:09
von testuser
LD r30, Z : In register r30 wird der inhalt des Speichers an der Stelle Z reingeladen. Z ist die verknüpfung von r30 und r31 mit r30 = ZH und r31 = ZL

Re: "Spitzenklausur"

Verfasst: Di 22. Jul 2008, 10:09
von ZeTa
testuser hat geschrieben:LD r30, Z : In register r30 wird der inhalt des Speichers an der Stelle Z reingeladen. Z ist die verknüpfung von r30 und r31 mit r30 = ZH und r31 = ZL
ich kapier jetzt immer noch nich wieso das dann 257 sind, und warum nimmt der davon die quersumme ?

wäre nett wenn du das nochmal gaaanz langsam schritt für schritt erklären könntest :D

und was genau macht der befehl RET, irgendwie is danach ja im stack nur noch ne 1... :?:

Dann noch bei Aufgabe 3.2:
wie funktioniert der befehl STS 0x0100, R17 ?

Re: "Spitzenklausur"

Verfasst: Di 22. Jul 2008, 12:32
von Chris087
Z ist die Verknüpfung von R30 und R31. Das heisst, Z besteht aus 2 Byte und nicht aus einem. R30 stellt dabei das niedrige und R31 das hohe Byte.
Wenn R30 und R31 jeweils 1 sind, ist Z also:
0000 0001 0000 0001
Das ist 257. Die Quersumme wird genommen weils in der Aufgabenstellung so steht ;)
(steht im Skript Seite 144f)
Was ich aber auch nicht verstehe ist, warum der Befehl RET gleich 2 Zahlen vom Stack runternimmt?
Warum nimmt er nicht nur die 0 runter und springt an Stelle 0?

Re: "Spitzenklausur"

Verfasst: Di 22. Jul 2008, 13:01
von testuser
weil falls ret nur eine Zahl nehmen würde, wäre die Anzahl der Zeilen im Programm auf 256 beschränkt, und das ist zu wenig