H2.1 LW/SW Speicherzugriff?!

André R.
Windoof-User
Windoof-User
Beiträge: 33
Registriert: 16. Okt 2008 12:17

H2.1 LW/SW Speicherzugriff?!

Beitrag von André R. »

Hallo,
kann mir mal jemand erklären, wie man mit LW und SW auf den Speicher zugreift?

Ich ging immer davon aus, ich kann einfach irgendein Register mit einem Wert (z.b. 0) als Startpunkt wählen und dann z.b. in 4er Schritten ein Array darauf abbilden.

Allerdings sagt mir der MARS Simulator durchgehend: Runtime exception at 0x00400034: address out of range 0x00000000

Was ist also nun eine gültige Startadresse?

z.B:
addi $t0,$zero,1
sw $t0, 0($s0)

geht bei mir nicht.

Benutzeravatar
s!mon
Computerversteher
Computerversteher
Beiträge: 373
Registriert: 20. Okt 2007 18:24
Wohnort: Höchst i. Odw

Re: H2.1 LW/SW Speicherzugriff?!

Beitrag von s!mon »

Ja du musst vorher Speicher adressieren mit .space im .data Segment. Guck mal in die Praktikumsvorlage

.data

speicher: .space 1024

zb

und dann lw $t0, space($t1)
Zuletzt geändert von s!mon am 8. Nov 2009 19:59, insgesamt 1-mal geändert.

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

Re: H2.1 LW/SW Speicherzugriff?!

Beitrag von ivoch »

Die MIPS-Adressen von 0x00000000 bis 0x00400000 sind reserviert und man darf damit nichts anrichten. Ab 0x00400000 fangen dann die Programminstruktionen, also der Text-Segment. Ab 0x10000000 fängt der Datenbereich, wo auch dein Array anfangen soll. Der Stack fängt ab der letzten Speicheradresse, also 0x7FFFFFFF und wächst nach unten in Richtung Datenbereich - deswegen wird auch vom Stack Pointer subtrahiert, wenn man Rekursion benutzt und/oder irgendwelche Register auf dem Stack sichern will und dessen Pointer anpassen muss.

Wenn du also dein Array aufbauen willst, müsstest du deinen "Array-Register" mit dem Wert 0x10000000 (oder größer) laden und dann mit

Code: Alles auswählen

  lw $s0, ($t0)        #wobei die Daten die du speichern willst in $s0 liegen und die Adresse des Arrays in $t0 liegt
  lw $s0, 0($t0)         #so gehts auch
Diese Art, auf den Speicher zuzugreifen ist aber nicht so effizient, da du ja immer mit Adressen hantieren musst und auch aufpassen musst, dass sich die Adressbereiche zweier Arrays (zum Beispiel) nicht überschneiden. Viel bequemer geht es, wenn du den benötigten Speicherbereich vorher im Datenbereich reservierst und dann auf das entsprechende Label zugreifst.

Code: Alles auswählen

.data   #hier wird Speicher für die benötigten Daten reserviert. Hier speichert man auch Strings, Zahlen/Buchstaben, die im Speicher vorliegen sollen usw
array: .space 1024         #1024 Bytes reservieren

.text   #hier fängt der Code an
  la $t0, array
  lw $s0, ($t0)
  addi $t0, $t0, 4         #oder sll $t0, $t0, 2
  lw $s1, ($t0)
  #usw...

  #alternativ geht es so:
  li $t0, 0
  lw $s0, array($t0)
  addi $t0, $t0, 4
  lw $s1, array($t0)
EDIT: s1mon, so geht es nicht - in den Klammern muss ein Register stehen. Siehe meine Beispiele oben.

Benutzeravatar
s!mon
Computerversteher
Computerversteher
Beiträge: 373
Registriert: 20. Okt 2007 18:24
Wohnort: Höchst i. Odw

Re: H2.1 LW/SW Speicherzugriff?!

Beitrag von s!mon »

Ja habs schon gesehen. Hatte es ausm Kopf gemacht und dann nochmal in meinem Programm nachgeschaut :P

robert.n
Nerd
Nerd
Beiträge: 673
Registriert: 29. Sep 2008 19:17

Re: H2.1 LW/SW Speicherzugriff?!

Beitrag von robert.n »

Wie genau sieht eigentlich das Zusammenspiel zwischen Labels und load address (la) aus? Ich habe es bisher einfach angewendet, aber ich würde gerne wissen, was da intern passiert.
Zu was werden die Labels beim Assemblieren umgewandelt und wieso braucht man dann noch la (letzteres wird sich wahrscheinlich klären durch ersteres)?

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

Re: H2.1 LW/SW Speicherzugriff?!

Beitrag von ivoch »

robert.n hat geschrieben:Wie genau sieht eigentlich das Zusammenspiel zwischen Labels und load address (la) aus? Ich habe es bisher einfach angewendet, aber ich würde gerne wissen, was da intern passiert.
Zu was werden die Labels beim Assemblieren umgewandelt und wieso braucht man dann noch la (letzteres wird sich wahrscheinlich klären durch ersteres)?

Code: Alles auswählen

.data
array: .space 256   #in Java würde das etwa so aussehen: Object[] array = new Object[64] (warum?)

.text
la $t0, array   #jetzt steht in $t0 die ADRESSE (also nicht der Wert!) von array[0]
                #also wenn es im Datenbereich sonst nichts gibt, könnte in $t0 dann 0x10000000 stehen
                #(siehe meinen vorherigen Beitrag)

lw $t1, ($t0)   #jetzt wird in $t1 der WERT kopiert, der im Speicher auf Adresse $t0 abgelegt ist
Mit anderen Worten "wandelt" der Befehl la ein gegebenes Label in eine entsprechende Speicheradresse um, die vom Compiler für dieses Label reserviert wurde.

mister_tt
Kernelcompilierer
Kernelcompilierer
Beiträge: 502
Registriert: 29. Sep 2008 15:54

Re: H2.1 LW/SW Speicherzugriff?!

Beitrag von mister_tt »

Ich hab da mal ein Problem... Denke, das passt hier auch rein...

Sagen wir, ich reserviere mir Platz für mein "Array"... Jetzt will ich das Array erstmal mit 1en auffüllen... Wie mache ich das!?
Folgender Versuch scheitert, weil meine "Zählvariable" $t2 nicht vom richtigen Typ ist (was ich ja einigermaßen einsehe)... Aber ich kann das ja nicht händisch machen, oder!?

Code: Alles auswählen

.data
array: .space 16

.text
addi $t0, $zero, 1		# $t1 saves constant 1
la $s0, array			# $s0 saves address of array
add $t2, $zero, $zero
Loop:
sw $t0, $t2($s0)
addi $t2, $t2, 4
blt $t2, 164, Loop
Für jedwede Hilfe bin ich dankbar.
Viele Grüße,
Simon

Benutzeravatar
martin-t
Erstie
Erstie
Beiträge: 21
Registriert: 5. Nov 2009 02:38
Kontaktdaten:

Re: H2.1 LW/SW Speicherzugriff?!

Beitrag von martin-t »

Du inkrementierst einfach dein Basisregister:

.data
array: .space 16

.text
la $s0, array # $s0 points to current element/word in array
li $t0, 0 # loop index
li $t1, 1 # value store in the array elements
Loop:
addi $t0, $t0, 1
sw $t1, ($s0)
addi $s0, $s0, 4 # move to next element
blt $t0, 16, Loop

mister_tt
Kernelcompilierer
Kernelcompilierer
Beiträge: 502
Registriert: 29. Sep 2008 15:54

Re: H2.1 LW/SW Speicherzugriff?!

Beitrag von mister_tt »

Manchmal sind es eben die Kleinigkeiten...

Danke für die prompte Hilfe!!!

Antworten

Zurück zu „Archiv“