Seite 1 von 1
Seltsamer Fehler...
Verfasst: 15. Dez 2009 22:19
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ß.
Re: Seltsamer Fehler...
Verfasst: 15. Dez 2009 22:31
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
Re: Seltsamer Fehler...
Verfasst: 15. Dez 2009 23:11
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.
Re: Seltsamer Fehler...
Verfasst: 15. Dez 2009 23:19
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.
Re: Seltsamer Fehler...
Verfasst: 16. Dez 2009 00:15
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.
Re: Seltsamer Fehler...
Verfasst: 16. Dez 2009 09:38
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.)