Seltsamer Fehler...

Benutzeravatar
jan_k
Mausschubser
Mausschubser
Beiträge: 66
Registriert: 7. Jul 2009 15:39
Kontaktdaten:

Seltsamer Fehler...

Beitrag von jan_k »

Hallo.
Mein Programm sieht ungefähr so aus:

Code: Alles auswählen

.data
twoway_cache_1: .space 8

.text

li $t5, 136

la $t0, twoway_cache_1
sb $t5, 0($t0)

la $t5, twoway_cache_1
lb $t6, 0($t5)
Der Code soll einfach die 136 abspeichern und später wieder auslesen. Doch nach Ausführen des Codes ist aus der 136 komischerweise eine -120 geworden.
Ich bin hier am verrückt werden, weil ich nicht weiß wieso...

Vielleicht kann jemand helfen :?

Gruß.

Benutzeravatar
jan_k
Mausschubser
Mausschubser
Beiträge: 66
Registriert: 7. Jul 2009 15:39
Kontaktdaten:

Re: Seltsamer Fehler...

Beitrag von jan_k »

Okay, es scheint ein Overflow zu sein, da es mit load word (lw) funktioniert...
Ich frag mich nur wieso, die Zahl ist doch mit 8 bit darstellbar...

Edit: Funzt nur jetzt in meinem eigentlichen Programm nicht mit lw.. AAAAh

chl
Neuling
Neuling
Beiträge: 7
Registriert: 6. Okt 2008 22:40

Re: Seltsamer Fehler...

Beitrag von chl »

136 = 1000 1000
-120 in 2k ist? Richtig 1111 1000 1000
einfach ein andi $t6, $t6, 0xFF nach dem Laden ranhaengen und du hat deine 8Bit.

Benutzeravatar
jan_k
Mausschubser
Mausschubser
Beiträge: 66
Registriert: 7. Jul 2009 15:39
Kontaktdaten:

Re: Seltsamer Fehler...

Beitrag von jan_k »

chl hat geschrieben:136 = 1000 1000
-120 in 2k ist? Richtig 1111 1000 1000
einfach ein andi $t6, $t6, 0xFF nach dem Laden ranhaengen und du hat deine 8Bit.
Wow.. 2k Darstellung erklärt so einiges.
Danke.

ivoch
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 199
Registriert: 3. Mär 2004 10:51

Re: Seltsamer Fehler...

Beitrag von ivoch »

Ja, immer beachten mit was für Wertebereiche man arbeitet - hier lädst und speicherst du bytes, also n=8 bit lange Werte. Solange du dem Rechner nicht explizit sagst, dass du ohne Vorzeichen arbeitest ("unsigned"), nimmt er an, dass es sich um eine 2k-Zahl handelt. Und die haben bekanntlich einen Wertebereich von -2^(n-1) bis 2^(n-1)-1, also in diesem Fall von -128 bis 127. 136 ist ausserhalb des Wertebereichs => Überlauf. :)




[EDIT]
jan_k hat geschrieben:Edit: Funzt nur jetzt in meinem eigentlichen Programm nicht mit lw.. AAAAh
Mit .space 8 reservierst du 8 bytes, also 8 verschiedene Einträge wenn du mit lb/sb arbeitest. Mit lw/sw sind das aber nur 2 Einträge - wenn dein Programm auf das 3., 4. usw Eintrag zugreift (und diesen verändert), und wenn du nach twoway_cache_1 noch ein anderes Label hast, dann werden dessen ersten Einträge überschrieben, was die Inkosistenz erklären könnte.

Nicht vergessen, bei Assembler (und C) hat man keine Gültigkeitsprüfung von Array- und Stringlängen - somit ist es dem Programmierer überlassen, dafür zu sorgen, dass bei Arrayzugriffe keine Out-of-Bounds Probleme auftreten.

Sascha
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 245
Registriert: 13. Apr 2004 19:23
Wohnort: Darmstadt
Kontaktdaten:

Re: Seltsamer Fehler...

Beitrag von Sascha »

chl hat geschrieben:136 = 1000 1000
-120 in 2k ist? Richtig 1111 1000 1000
einfach ein andi $t6, $t6, 0xFF nach dem Laden ranhaengen und du hat deine 8Bit.
Ja, oder mittels lbu laden. (Die u Postfixe hinter vielen Befehlen stehen für unsigned.)

Antworten

Zurück zu „Archiv“