Forum: Compiler & IDEs Mips assembler


von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ich nutze die ELDK von Denx als Crosstool für die MIPS. Diese 
Beispielprgramm habe ich aus dem Netz und wollte es asseblieren und 
nutzen. Wenn ich es assebmliere und disassebliere kommt was andereres 
heraus. Was habe ich noch nicht bedacht?
Die genutzen Optionen und Ausgaben habe ich mit angehangen.

Datei a.asm
----------------------------------
  .text
  .globl __start



__start:

  lw  $0, memory
  lh  $1, memory
  lb  $2, memory

  lhu  $3, memory
  lbu  $4, memory

  .data

memory:
  .word 0xABCDE080
------------------------------




[red@laptop-acer1 asm1]$ mips-linux-as -o a.o a.asm
a.asm: Assembler messages:
a.asm:9: Warning: Used $at without ".set noat"
a.asm:9: Warning: Used $at without ".set noat"
[red@laptop-acer1 asm1]$ mips-linux-ld -Ttext 0  -s  -N a.o
[red@laptop-acer1 asm1]$ mips-linux-objdump -D a.out

a.out:     file format elf32-tradbigmips

Disassembly of section .text:

00000000 <.text>:
   0:   3c010000        lui     at,0x0
   4:   8c200030        lw      zero,48(at)
   8:   3c010000        lui     at,0x0
   c:   84210030        lh      at,48(at)
  10:   3c020000        lui     v0,0x0
  14:   80420030        lb      v0,48(v0)
  18:   3c030000        lui     v1,0x0
  1c:   94630030        lhu     v1,48(v1)
  20:   3c040000        lui     a0,0x0
  24:   90840030        lbu     a0,48(a0)
        ...
Disassembly of section .reginfo:

00400094 <.reginfo>:
  400094:       1000001e        b       0x400110
  400098:       00000000        nop
        ...
  4000a8:       00008030        0x8030
Disassembly of section .data:

00000030 <.data>:
  30:   abcde080        swl     t5,-8064(s8)
        ...
[red@laptop-acer1 asm1]$

von Michael E. (cuby)


Lesenswert?

René D. schrieb:
> Wenn ich es assebmliere und disassebliere kommt was andereres
> heraus. Was habe ich noch nicht bedacht?

Das ist völlig in Ordnung so. Der MIPS-Assembler kennt 
Pseudo-Operationen, die dann in mehrere echte Opcodes umgesetzt werden.

Das Problem, das du hier siehst, liegt darin, dass die CPU keine 
32-Bit-Speicheradresse ("memory") in einem 32-Bit Opcode (den MIPS 
nunmal hat) darstellen kann. Deshalb wird ein Pseudobefehl wie z.B. "lw" 
umgesetzt in ein load upper immediate (lui), das erst die höherwertigen 
16 Bit der Adresse in ein Register lädt (die sind hier jeweils 0, weil 
die Adresse von "memory" 0x00000030 ist) und die niederwertigen auf 0 
setzt, gefolgt von einem "echten" load word/halfword/byte mit Offset 
dez. 48 (0x30) zum im vorherigen Befehl geladenen Register. Damit passt 
das also, der Speicherzugriff geht auf Adresse 0x0 + 0x30.

Die Tatsache, dass der objdump aus Wolfgangs Tools auch disassemblierten 
Code für die .reginfo und .data-Section anzeigt, liegt an der Verwendung 
von -D (alles disassemblieren, auch wenn's wenig Sinn macht) anstelle 
von -d.

von Michael E. (cuby)


Lesenswert?

Noch eine Info zum Plasma, die mir grade einfällt - der Interrupt-Vektor 
liegt beim Plasma an einer relativ dämlichen Adresse (0x3C). Das ist 
wohl nur deshalb so, weil der von Hand geschriebene Startup-Code für den 
Plasma exakt die Bytes davor benötigt (siehe tools/boot.asm) :-).

Bei einem "echten" MIPS R3000 liegt der Vektor an Adresse 0xBFC0018 bzw. 
0x8FC0018 (je nach Konfiguration des BEV-Bits). Genauso beginnt die 
Programmausführung bei 0xBFC00000 und nicht bei 0x0 wie beim Plasma. 
Beides lässt sich relativ einfach umbiegen, ist für Eigenentwicklungen 
aber relativ egal.

Zum weiteren Einlesen ins Thema MIPS noch ein Buchtip: "See MIPS Run" 
von Dominic Sweetman, mittlerweile in der zweiten Auflage erhältlich.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ah, der Assembler nutzt Pseudobefehle.

Mit dem Interrupt bin ich noch nicht so weit.
Den Plasma VHDL-Code kann ich mit GHDL simulieren.




> Zum weiteren Einlesen ins Thema MIPS noch ein Buchtip: "See MIPS Run"
> von Dominic Sweetman, mittlerweile in der zweiten Auflage erhältlich.

Der Buchcover hat noch das Wort Linux. Wenn ich so weit bin. Dann wäre 
das heiß. Ein RTOS mit LAN würde mir für den ersten Schritt auch reichen

Wie lange hast du für den Einstieg gebraucht?

von Michael E. (cuby)


Lesenswert?

René D. schrieb:
> Der Buchcover hat noch das Wort Linux. Wenn ich so weit bin. Dann wäre
> das heiß. Ein RTOS mit LAN würde mir für den ersten Schritt auch reichen

Das "Linux" ist ein add-on zum Buch, die erste Auflage kam noch ohne 
Linux aus.
Das Buch ist auch allgemein für MIPS-Entwicklung und Verständnis der 
Architektur sinnvoll.

> Wie lange hast du für den Einstieg gebraucht?

Nicht allzu lange - hauptsächlich aber, weil ich seit den 90ern mit MIPS 
zu tun habe (habe u.a. an den Linux-Portierungen auf DECstations und 
Siemens MIPS-Systeme mitgemacht und diversen embedded-Kram mit MIPS 
entwickelt) und auch schon einiges Vorwissen in VHDL und Hardwareentwurf 
hatte. Der Plasma ist wegen des mitgelieferten kleinen RTOS ganz gut zum 
Einstieg geeignet, der Code ist IMHO gut verständlich. Für (non-uC) 
Linux ist der Plasma mangels MMU übrigens nicht geeignet - wäre aber 
spannend, wenn jemand einen TLB einbauen könnte :-). Virtueller Speicher 
bei MIPS ist vergleichsweise einfach.

Wir bauen hier übrigens u.a. MPSoCs mit dem Plasma (und auch ZPU und 
mb-lite) auf FPGAs (Spartan 3, Virtex 5): 
http://ess.cs.tu-dortmund.de/EN/Research/Projects/LavA/index.html

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

. Für (non-uC)
> Linux ist der Plasma mangels MMU übrigens nicht geeignet - wäre aber
> spannend, wenn jemand einen TLB einbauen könnte :-). Virtueller Speicher
> bei MIPS ist vergleichsweise einfach.
>

Ja die fehlende MMU ist mir auch schon aufgefallen.
mcLinux ist eine Notlösung.

Eine MMU für Plasma wäre ein dufte Diplomarbeit.

Ich schätze ich brauche noch viertel bis ein halbes Jahr für die Plasma, 
bis ich fit bin. Das Buch werde ich mir besorgen.

Ich hatte mit dem Z80 viel zu tun und das ist eine Akkuprozessor. Das 
ist schon ein Unterschied.

von zigzeg (Gast)


Lesenswert?

Michael Engel schrieb:
> Für (non-uC)
> Linux ist der Plasma mangels MMU übrigens nicht geeignet

Gibt es eigentlich irgendwo auch eine freie MIPS Implementation mit MMU 
?

von Michael E. (cuby)


Lesenswert?

zigzeg schrieb:
> Gibt es eigentlich irgendwo auch eine freie MIPS Implementation mit MMU?

Mir fällt so auf Anhieb keine ein - die anderen MIPS-Cores auf opencores 
haben jedenfalls auch keine. Alternativen mit MMU wären OpenRISC oder 
Leon, aber die sind doch ne Größenordnung größer (und natürlich kein 
MIPS :)).

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ich habe gestern den VHDL Code für einen Spartan6 gefittet.

Es werden 60Mhz. Der Report der ISE lässt darauf schließen, dass der 
Knackpunkt die Multiplizier/Division Einheit ist. Datei mult.vhd
Da sind sicher noch 20Mhz drinnen.

Ich glaube, das wird noch eine spannende CPU. Es ist ein Softcore, der 
es mit dem Microblaze aufnehmen könnte.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Wie kann ich dem Assambler beibringen, dass für die Register auch die 
Pseudonamen akzeptiert werden?

bei den Registernamen $a0 oder $t1   bekomme ich


Error illegal operands


Da gibt es bestimmt einen Parameter im Aufruf.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.