MIPS und der Global Pointer

OP (Firma: fritzler-avr.de) #4261785
Moinsen,
habe hier ein komisches Problem mit dem Global Pointer beim MIPS.

Im Linkerscript steht folgendes:
1
ENTRY(_start)
2
SECTIONS
3
{
4
  /*resetvector*/
5
  . = 0x00000000;
6
  reset : {
7
    *(.text.reset)
8
  }
9
  
10
  /*main*/
11
  . = 0x00000400;
12
  .text : {
13
    *(.text)
14
    main.o (.text)
15
  }
16
  
17
  /*.sbss und .sdata benutzt das Global Pointer Register
18
  daher passendes Symbol setzen fuer start.s*/
19
  _gp = .;
20
  
21
}

In der start.s setze ich dann auch den gp mit:
1
.section .text.reset
2
.extern main
3
_start:
4
  li $sp, 0x100000 /*1MB*/
5
  li $gp, _gp
6
  j main

li ist ein Pseudobefehl, der nach Größe von _gp ein lui, ein ori oder 
eine Kombination aus beiden erzeugt um die Variable ins Register zu 
bekommen.

Nun ist mein Programm etwas größer und der Globalpointer wird 17 Bit 
lang.
Allerdings werden mit dem li Pseudobefehl nur die untersten 16Bit nach 
$gp geladen und das Bit16 wird ignoriert.
Der Offset im restlichen Programm (wenn was aus .sdata geladen werden 
soll) ist auch nicht groß genug um über die 64k Grenze zu kommen.

Erst wenn ich das Bit16 manuell in das $gp schreibe funktioniert mein 
Programm:
1
.section .text.reset
2
.extern main
3
_start:
4
  li $sp, 0x100000 /*1MB*/
5
  lui $gp, 0x1
6
  ori $gp, $gp, _gp
7
  j main

Kann mir wer erklären was ich da falsch mache?
Zum Globalpointer findet sich leider nicht viel an Anleitung, außer:
"Zeigt in die Mitte des 64k Bereichs der .sdata und .sbss"

Nutze den GCC.
OP (Firma: fritzler-avr.de)
Mit la gings dann auch, habs dann einfach mal eiskalt ausprobiert.
Kannte das la schon, aber das läd ja eigentlich die Adresse einer 
Variablen in das Register.
Bei Linkerscriptsymbolen ist das dann auf einmal anders.
1
main:
2
  la $1, var #load address 
3
  li $2, 0x80818283
4
  lw $3, 0($1)
5
idle:
6
  j idle
7
  
8
.text
9
var: .word 0x80818283

nach dem Ausführen:
$1 -> RAM Adresse von var
$2 -> 0x80818283
$3 -> 0x80818283

li erkennt eben einfach nicht, dass der immediate keine 16bit, sondern 
32bit hat.
Warum auch immer...

Inzwischen läufts und wurde hier verwendet:
http://www.fritzler-avr.de/spaceage2/soft_start.php
OP (Firma: fritzler-avr.de)
Hehe,
nen kleinen MIPS Kern mussten wir schon im 2. Semester in VHDL hacken.
Als Singlecycle, Multicycle und Pipelined.
Er musste zum Glück nur 5 Befehle können.
Dafür musste dann ein ARM9 Kern im 4. Semester komplett entworfen 
werden.

Zum Spaceage2 MIPS existiert ja auch VHDL Code, nur wurden eben erst die 
TTL ICs nachgebaut und dann in VHDL nach den Schaltplänen verdrahtet.
Ost ja auch nur zur Bugsuche vorhanden, jedenfalls kann die Synthese da 
fast garnichts optimieren.
-> 15MHz Maximaltakt auf nem ZYNQ7010

Wieso sind bei deinem MIPS die Branch Likely durchgestrichen aufgeführt?
Das sind MIPS II Befehle, also müssten die beim MIPS I nichteinmal 
erwähnt werden?
Sagt man dem GCC, dass man MIPS1 hat so nutzt er diese likely auch nicht 
mehr.

Das Pipelining ist mit forwarding, sehr schön.
Pipelining in TTL wär dann aber etwas zu hardcore geworden.
(Firma: www.dossmatik.de)
> fast garnichts optimieren.
> -> 15MHz Maximaltakt auf nem ZYNQ7010

Auf dem Spartan6 bin ich bei 100Mhz. Da bremmst micht die Multiplikation 
etwas aus. Beim ZYNQ7010 wäre noch mal eine Steigerung drinnen.



> Wieso sind bei deinem MIPS die Branch Likely durchgestrichen aufgeführt?
Historisch bedingt. Ich wollte gleich die Befehle von einer höheren Mips 
vorhalten. Die likely sind einfach misst.

> Das sind MIPS II Befehle, also müssten die beim MIPS I nichteinmal
> erwähnt werden?
Richtig, habe ich auch erst später gelernt, es gibt auch eine GCC option 
um Branch likely auszuschalten.

> Sagt man dem GCC, dass man MIPS1 hat so nutzt er diese likely auch nicht
> mehr.
>
> Das Pipelining ist mit forwarding, sehr schön.
> Pipelining in TTL wär dann aber etwas zu hardcore geworden.

Habt Ihr auch einfache AHA Software geschrieben?
So zur Demonstration.
OP (Firma: fritzler-avr.de)
Meinste jetz den Spaceage2 MIPS oder den kleinen VHDL MIPS?

Beim Spaceage2 MIPS gibts ne IO Plarine die aussieht wie nen 
Taschenrechner und das Gerät verhält sich dann auch so:
http://www.fritzler-avr.de/spaceage2/gallery/main.php?cmd=imageview&var1=SAM_1244k.jpg
Wird natürlich alles noch erweitert.

Beim kleinen VHDL MIPS sollte am Ende nen kleines Modulo geschrieben 
werden, welches aus den 5 möglichen Befehlen bestand:
lw/sw
add/sub
and/or
slt
beq

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.