MIPS64 Simulator


MIPS64 Info

Der MIPS64 Simulator wird als edumips64-1.2.2.jar Datei zur Verfügung gestellt und ist damit auf allen Systemen lauffähig! Es gibt kein Installationsprogramm. Zur Installation legt man einen neuen Ordner auf der Festplatte an und entpackt dort die ZIP Datei. Ein Link auf die JAR Datei kann in das Startmenu unter Programme und auf dem Desktop abgelegt werden. Im Startmenu sollte man unter Programme ein Unterverzeichnis anlegen und in dieses zusätzlich noch einen Link zu Manual.pdf und EduMIPS64 RELEASE NOTES.pdf ablegen. Wird der Simulator nicht durch einen Doppelklick auf die JAR-Datei gestartet, dann eine DOS-Konsole starten und in das Verzeichnis der JAR-Datei wechseln und dann das Kommando:

java -jar edumips64-1.2.jar

eingeben. Aktuelle Version: edumips64-1.2.3.jar , Manual.pdf und EduMIPS64 RELEASE NOTES.pdf.

In der Datei MIPS64-Intro2007.pdf ist eine kurze Beschreibung der MIPS Befehle enthalten.

Bei der Abarbeitung des MIPS Programm isort.s entstand dann das folgende Bild.

MIPS64 mit isort.s

Der Befehlssatz des MIPS-Prozessors ist dem DLX Befehlssatz sehr ähnlich. Der MIPS-Prozessor kann mit einem Pin wahlweise auf Big- oder Little-Endian Speicherzuordnung (Reihenfolge der Byte im Word) eingestellt werden. Der Simulator ist fest auf Little-Endian eingestellt und unterscheidet sich damit von der DLX, die immer Big-Endian Adressierung verwendet. Folgende Unterschiede in den Befehlen sind für die in der Lehrveranstaltung verwendeten Beispiele auch noch von Bedeutung:

DLX-Befehl Bedeutung MIPS-Befehl Bedeutung Funktion
LHI rd, WERT Load high Immediate LUI rd, WERT Load upper Immediate Die Konstante WERT wird in die oberen 16 Bit von rd geladen und die unteren 16 Bit werden gelöscht
SUBI rd,rs, WERT SUB Immediate ADDI rd,rs, -WERT ADD Immediate Die Subtraktion mit einer Konstanten muss mit einer Addition mit negativer Konstanten ausgeführt werden.
SUBUI rd,rs, WERT SUB unsigned Immediate ADDIU rd,rs, -WERT ADD unsigned Immediate Die Subtraktion mit einer Konstanten muss mit einer Addition mit negativer Konstanten ausgeführt werden.
BEQZ rs, LABEL Branch equal zero BEQ rs, r0, LABEL Branch equal r0 Springt zu LABEL, wenn der Inhalt von rs == 0 ist. (Die DLX Syntax ist als Makro implementiert.)
BNEZ rs, LABEL Branch not equal zero BNE rs, r0, LABEL Branch not equal r0 Springt zu LABEL, wenn der Inhalt von rs != 0 ist. (Die DLX Syntax ist als Makro implementiert.)
TRAP 0 SYSCALL 0 Aufruf von Systemfunktionen. Die Funktion 0 ist ein HALT Befehl für das System.
SLLI rd, rs, imm Shift left logical Immediate SLL rd, rs, imm Shift left logical Links Verschiebung um die in der Konstanten angegebenen Bitanzahl.
SLL rd, rs1, rs2 Shift left logical SLLV rd, rs1, rs2 Shift left logical variabel Links Verschiebung um die in rs2 angegebenen Bitanzahl.
SRLI rd, rs, imm Shift right logical Immediate SRL rd, rs, imm Shift right logical Rechts Verschiebung um die in der Konstanten angegebenen Bitanzahl.
SRL rd, rs1, rs2 Shift right logical SRLV rd, rs1, rs2 Shift right logical variabel Rechts Verschiebung um die in rs2 angegebenen Bitanzahl.
SRAI rd, rs, imm Shift right arithmetic Immediate SRA rd, rs, imm Shift right arithmetic Rechts Verschiebung um die in der Konstanten angegebenen Bitanzahl.
SRA rd, rs1, rs2 Shift right arithmetic SRAV rd, rs1, rs2 Shift right arithmetic variabel Rechts Verschiebung um die in rs2 angegebenen Bitanzahl.
SW disp(rs1), rs2 Store Word SW rs2, disp(rs1) Store Word Speichern des Inhalt von rs2 auf der Speicheradresse in Register + disp.
SW disp(rs1), rs2 Store Word SWU rs2, disp(rs1) Store Word Unsigned Speichern des Inhalt von rs2 auf der Speicheradresse in Register + disp.
SH disp(rs1), rs2 Store Half Word SH rs2, disp(rs1) Store Half Word Speichern des Inhalt von rs2 auf der Speicheradresse in Register + disp.
SHU disp(rs1), rs2 Store Half Word Unsigned SHU rs2, disp(rs1) Store Half Word Unsigned Speichern des Inhalt von rs2 auf der Speicheradresse in Register + disp.
SB disp(rs1), rs2 Store Byte SB rs2, disp(rs1) Store Byte Speichern des Inhalt von rs2 auf der Speicheradresse in Register + disp.
SBU disp(rs1), rs2 Store Byte Unsigned SBU rs2, disp(rs1) Store Byte Unsigned Speichern des Inhalt von rs2 auf der Speicheradresse in Register + disp.

Der MIPS-Prozessor besitzt einige Befehle mehr als die DLX und außerdem wird hier eine Variante mit 64 Bit Verarbeitungsbreite realisiert. Bei allen arithmetischen Operationen wird daher vor jeden Befehl noch ein D (z.B.: DADD) geschrieben. Da die DLX nur 32 Bit verarbeitet hat, kann man bei der Überführung eines Programms einfach ADD stehen lassen. Der Speicher des MIPS-Simulators hat nur 12 Bit Adressen, deshalb ist es nicht nötig beim Laden einer Adresse in ein Register die MIPS-Befehlsfolge LUI und ORI einzusetzen.

  • Zum Laden einer Adresse reicht ein ORI r1,r0,adresse oder man schreibt die Adresse gleich als Displacement in den Speicherbefehl und verwendet r0 (direkte Adressierung).
  • Die Reihenfolge von Datenbereich und Textbereich in MIPS-Programmen ist festgelegt auf 1. Daten und 2. Text. Sie muss also bei den meisten DLX Programmen bei der Überführung in ein MIPS-Programm vertauscht werden.
  • Es gibt nur die SET-Befehle SLTI, SLTIU, SLT und SLTU. Alle anderen Vergleiche sind bei der MIPS nur zusammen mit den BRANCH-Befehlen möglich.

  • Das Programm zur Aufgabe 6.2 sieht dann wie folgt aus:
    ;
    ; 6.2 Ermitteln Sie den MIPS-Code für folgende Anweisungen.
    ;     a = b + c;
    ;     d = e - f; a,b,c,d,e,f sind 64-Bit Worte im Speicher mit
    ;     den Labels A,B,C,D,E,F
    ;     Verwenden Sie dabei den nachstehend angegebenen Rahmen.
    ;
    	.data
    ;
    A:	.word	0xffffffff	; A +  0
    B:	.word	0x12345678	; A +  8
    C:	.word	0x87654321	; A + 16
    D:	.word	0xffffffff	; A + 24
    E:	.word	0x98765432	; A + 32
    F:	.word	0x43212310	; A + 40
    ;
    	.text
    ;
    ;
    start:	ori	r1,r0,A		; Adresse von A in r1 laden.
    	lui	r8,#0x1234	; Test des Ladens der oberen 16 Bit von R8
    	ori	r8,r8,#0x5678	; und ergänzen der unteren 16 Bit in R8 für 32 Bit Konstanten
    	lw	r2,8(r1)	; Laden b nach R2
    	lw	r3,16(r1)	; Laden c nach R3
    	add	r3,r3,r2	; b + c
    	sw 	r3,0(r1)	; Speichern der Summe auf A
    	lw	r2,32(r1)	; Laden e nach R2
    	lw	r3,40(r1)	; Laden f nach R3
    	subu	r3,r2,r3	; e - f
    	sw	r3,24(r1)	; Speichern der Differenz auf D
    	syscall	0		; steht hier für eine HALT-Anweisung,
    ;
    
    Aufg53.s
    Aufg62.s
    Aufg62o.s
    Aufg63.s
    Aufg64.s
    Aufg64o.s
    Aufg72.s
    Aufg72o.s
    Aufg73.s
    Aufg73o.s

    Programmieraufgabe aus der Probeklausur
    Pipeline Aufgabe aus der Probeklausur
    Adressierungsarten aus der Probeklausur
    Funktion von AND und OR aus Aufgabe 5 der Probeklausur

    BubleSort.s

    Aufg61neu.s
    Aufg62neu.s
    Aufg63neu.s
    Aufg62o_neu.s
    Aufg63o_neu.s
    Aufg7_neu.s
    Aufg7o_neu.s
    BefehleMips64.s und der Speicherinhalt nach dem Laden des Programms.


    Die MIPS64 Simulator Pipeline


    Beispiele mit Verwendung von syscall 3 zur Eingabe und syscall 5 zur Ausgabe
    beisp4.s Addition zweier Werte mit Nutzung der E/A syscalls
    beisp6.s Test auf Little od. Big Endian
    beisp7.s Kommando Verzweigung mit 2 Tabellen

    Funktionen und Tests mit syscall 3 zur Eingabe und syscall 5 zur Ausgabe
    syscall_3_test.s
    syscall_3_test01.s
    syscall_3_test02.s
    syscall_5_test.s
    syscall_5_test01.s
    syscall_5_test02.s

    input.s
    print.s
    print1.s
    print2.s


    11.10.2017 Siegmar Schöne