Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Blatt 3, Aufgabe 5: Registerwerte Programmfragment
Hallo,
kann mir jemand sagen, was der Scale-Faktor d = 4 bedeutet?
Wenn die CPU Daten in Big-Endian-Darstellung verarbeitet, dann muss man beim Adressieren der Speicherzellen von rechts zählen oder?
4e30 : 40 4e 00 00 00 00 00 01 00 02 00 00 00 00 00 05
4e40 : 75 13 fe aa 00 12 89 ce 98 12 76 11 12 34 56 78
Hier bei diesem Speicherbereich wäre 0x4e3f = 40 und 0x4e30 = 05 oder?
Der Scale Faktor wird an 2 Stellen bei der Adressierung benötigt.
Die Registerbreite soll 32 Bit (=4 Byte) betragen also ist - wenn man die jeweiligen Adressen in Register lädt: 0x4e3f = 0x057514fe und 0x4e30 = 0x404e0000
Müsste es nicht heissen: 0x4e3f=0x fe 13 75 05
0x4e30 = 0x 00 00 4e 40
wegen BigEndian?
Okay, danke. Und wenn die Darstellung Low-Endian wäre, stünde dann ein anderer Wert beim Laden von 0x4e3f im Register?
Eben nicht. In der Big-Endian Darstellung werden die höherwertigeren Bytes zuerst dargestellt und so verlangt auch die Angabe.
Spätestens dann, wenn ihr den Scaled-Zugriff auf den Speicher macht, dann wird auffallen, dass 0x01000000 als Offset nicht in Frage kommt sondern vielmehr 0x00000001
Ok, ich hab jetzt trotzdem nochmal eine Frage bzgl. des scale-factor.
In wie fern wirkt er sich aus, wenn ich was aus dem Speicher ins Register lade?
Ich hab verstanden, dass man via scale-factor groeszere Zahlen auf einem kleineren Zahlenformat speichern kann.
z.B.
durch d=0.5 kann mein unsigned int mit einem eigentlichen platz fuer max
(65,535)10 jetzt (131,070)10
speichern. das geht dann allerdings auf kosten der genauigkeit und ich kann keine 3 mehr darstellen.
1 => 2
2 => 4
3 => 6 (!)
usw.
aber wie sieht das jetzt bei nem scale-factor von 4 aus 0.o
oder steh ich grade total auf dem schlauch?
edit:
ok des raetsels lsg ist, dass es nichts mit diesem scale factor zu tuen hat.
Hinweis in den Folien: 2.1.3. Seite 19.
Nein. Endianess (Big-Endian, Little-Endian) verändert nur die Interpretation der Bytes, nicht von wo sie gelesen werden.
[m]0x4e3f = 0x05[/m] und [m]0x4e30 = 0x40[/m], falls du nur ein Byte liest (bei einzelnen Bytes gibt es keinen Unterschied bei unterschiedlicher Endianess). Falls du mehr als ein Byte liest, kommt der Wert auf die Endianess an, aber die Bytes bleiben die selben. Wenn zum Beispiel 4 Bytes gelesen werden sollen, dann werden einfach die 4 Bytes an dieser Adresse gelesen ([m]0x4e4f „=“ 0x05 0x75 0x13 0xfe[/m]) und wie /dev/null schon schrieb, entsprechend interpretiert.
Falls im Speicher an einer bestimmten Adresse [m]0xaa 0xbb 0xcc 0xdd[/m] steht und ein 4-Byte Wert gelesen wird (was meist ein [m]int[/m] auf 32-Bit ist), dann ist das bei Little-Endian die Zahl [m]0xddccbbaa = 3721182122[/m] und bei Big-Endian [m]0xaabbccdd = 2864434398[/m].
Nein, das wäre Little-Endian.
Siehe oben. Bei Little-Endian (nicht Low-Endian) werden die Bytes anders interpretiert, aber im Speicher stehen sie immer noch in derselben Reihenfolge.