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]$
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.
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.
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?
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
. 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.
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 ?
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 :)).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.