Suche…


Bemerkungen

In diesem Abschnitt erhalten Sie einen Überblick darüber, was Mips sind und warum ein Entwickler sie verwenden möchte.

Es sollte auch alle großen Themen in Mips erwähnen und auf die verwandten Themen verweisen. Da die Dokumentation für mips neu ist, müssen Sie möglicherweise erste Versionen dieser verwandten Themen erstellen.

Installation oder Setup

Detaillierte Anweisungen zum Einrichten oder Installieren von Mips.

QtSpim für Windows

  1. Laden Sie QtSpim hier herunter. 32.6 MB
  2. Installieren Sie es einfach zu installieren
  3. Erstellen Sie Ihre erste Assembly-Datei (.s) oder verwenden Sie das Beispiel C: \ Program Files (x86) \ QtSpim \ helloworld.s
  4. Führen Sie das Programm über die Desktop-Verknüpfung oder über C: \ Programme (x86) \ QtSpim \ QtSpim.exe aus

Es gibt zwei Fenster für das Programm, das Hauptfenster mit der Bezeichnung QtSpim. Hier sehen Sie das von Ihnen ausgeführte Programm (beschrifteter Text), den Speicher (beschriftete Daten), die Werte der Register (bezeichnet als FP Regs für Fließkomma und Int Regs für Ganzzahl) und die Steuerung für den Simulator

Im anderen Fenster mit der Bezeichnung Konsole sehen Sie die Ausgabe und geben ggf. die Eingabe Ihres Programms ein

  1. Laden Sie die Datei mit Datei -> Datei laden
  2. Sie können Click Run (F5) verwenden, um das Endergebnis anzuzeigen, oder Schritt für Schritt (S10), um den Status des Registers und des Speichers anzuzeigen, während das Programm das Debugging ausführt

MARS MIPS Simulator

Der MARS MIPS-Simulator ist ein Assembler, Assembler, Simulator und Debugger für den MIPS-Prozessor, der von Pete Sanderson und Kenneth Vollmar an der Missouri State University ( src ) entwickelt wurde.

Sie erhalten die MARS kostenlos hier . Zur Installation der Version 4.5 benötigen Sie von hier aus möglicherweise das für Ihr System geeignete Java SDK

Vor dem Zusammenbauen kann die Umgebung dieses Simulators vereinfacht in drei Segmente aufgeteilt werden: Der Editor oben links, in dem der gesamte Code geschrieben wird, der Compiler / die Ausgabe rechts unter dem Editor und die Liste der Register , die die "CPU" darstellen. für unser Programm. Geben Sie hier die Bildbeschreibung ein

Nach dem Zusammenfügen (durch einfaches Drücken von F3) ändert sich die Umgebung, wobei zwei neue Segmente die Position des Editors erhalten: das Textsegment wohin

i) In jeder Zeile des Assembler-Codes werden in der Spalte "Basis" und "Pseudoinstruktionen" (wir sprechen in Sekunden) darüber gesprochen

ii) den Maschinencode für jede Anweisung in der Spalte "Code",

und das Datensegment, in dem wir eine Darstellung des Speichers eines Prozessors mit Little-Endian-Reihenfolge betrachten können . Geben Sie hier die Bildbeschreibung ein

Nach dem Zusammensetzen können wir unseren Code entweder alle gleichzeitig (F5) oder schrittweise (F7) ausführen und die Ausführung um einige Schritte zurück nach hinten (F8) zurückspulen. Geben Sie hier die Bildbeschreibung ein

Nun sehen wir uns den Beispielcode von oben an und erläutern jede Zeile:

.text
.globl main
main:            #main function

li    $v0, 11    #11=system code for printing a character, $v0=register that gets the system code for printing as value
la    $a0, 'a'   #'a'=our example character, $a0=register that accepts the character for printing
syscall          #Call to the System to execute our instructions and print the character at the a0 register 

li $v0, 10       #11=system code for terminating, $v0=register that gets the system code for terminating (optional, but desirable)
syscall          #Call to the System to terminate the execution

MARS akzeptiert und exportiert Dateien mit dem .asm-Dateityp

Aber der obige Code gibt nur einen Buchstaben aus. Wie sieht es mit der guten alten "Hallo Welt" aus? Was ist, weißt du nicht, eine Zahl oder etwas hinzuzufügen? Nun, wir können das ändern, was wir gerade für das hatten:

.data               #data section 
str: .asciiz "Hello world\n"  
number: .word 256
 
.text                 #code section 
.globl main 
main: 
li       $v0, 4                #system call for printing strings 
la       $a0, str              #loading our string from data section to the $a0 register
syscall  
       
la       $t0, number        #loading our number from data section to the $t0 register
lw       $s1, 0($t0)        #loading our number as a word to another register, $s1 

addi     $t2, $s1, 8         #adding our number ($s1) with 8 and leaving the sum to register $t2

sw       $t2, 0($t0)        #storing the sum of register $t2 as a word at the first place of $t0

li       $v0, 10               # system call for terminating the execution
syscall 

Bevor Sie die Ergebnisse mit MARS veranschaulichen, müssen Sie diese Befehle ein wenig näher erläutern:

  • Systemaufrufe sind eine Reihe von Diensten, die vom Betriebssystem bereitgestellt werden. Um einen Systemaufruf zu verwenden, wird ein Anruf - Code benötigt , um für die notwendige Operation $ v0 Register zu setzen. Wenn ein Systemaufruf Argumente enthält, werden diese in die Register $ a0- $ a2 gestellt. Hier sind alle Systemaufrufe.

  • li (load instant) ist eine Pseudo-Anweisung (wir sprechen später darüber), die ein Register sofort mit einem Wert lädt. la (Adresse laden) ist auch ein Pseudo-Befehl, der eine Adresse in ein Register lädt. Mit li $v0, 4 das $ v0 Register hat nun 4 als Wert, während la $a0, str die Zeichenfolge von lädt str an die $a0 Register.

  • Ein Wort ist (so viel wie wir über MIPS sprechen) eine 32-Bit-Sequenz, wobei Bit 31 das höchstwertige Bit und Bit 0 das geringste signifikante Bit ist.

  • lw ( lw ) wird vom Speicher in ein Register übertragen, während sw (Speicherwort) von einem Register in den Speicher übertragen wird. Mit dem lw $s1, 0($t0) haben wir den Wert des Registers $s1 Registers $t0 (das ist, was die 0 hier symbolisiert, der Versatz des Wortes), alias 256 , in das Register $s1 geladen. $t0 hier die Adresse, während $s1 den Wert hat. sw $t2, 0($t0) führt genau den umgekehrten Job aus.

  • MARS verwendet den Little Endian , was bedeutet, dass das LSB eines Wortes in der kleinsten Byteadresse des Speichers gespeichert wird.

  • MIPS verwendet Byteadressen , so dass sich eine Adresse um 4 von der vorherigen und der nächsten unterscheidet.

Durch das Zusammenstellen des Codes von vorhin können wir besser verstehen, wie Speicher und Register ausgetauscht werden, wobei "Hexadezimalwerte" aus dem Datensegment deaktiviert werden:

Geben Sie hier die Bildbeschreibung ein

oder Aktivieren von "ASCII" aus dem Datensegment:

Geben Sie hier die Bildbeschreibung ein

Starten Sie es so

$ java -jar Mars4_5.jar

Erstellen Sie diese Datei und speichern Sie sie.

    .text
main:
    li    $s0,0x30
loop:
    move    $a0,$s0        # copy from s0 to a0
    
    li    $v0,11        # syscall with v0 = 11 will print out
    syscall            # one byte from a0 to the Run I/O window

    addi    $s0,$s0,3    # what happens if the constant is changed?
    
    li    $t0,0x5d
    bne    $s0,$t0,loop
    nop            # delay slot filler (just in case)

stop:    j    stop        # loop forever here
    nop            # delay slot filler (just in case)

Drücke F3, um es zusammenzubauen, und drücke dann Run. Nun werden Sie mit dem Kompilieren und Ausführen von MIPS-Code begonnen.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow