mipsAan de slag met mips


Opmerkingen

Deze sectie geeft een overzicht van wat mips is en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook alle grote onderwerpen binnen mips vermelden en een link naar de gerelateerde onderwerpen bevatten. Aangezien de Documentatie voor mips nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

Installatie of instellingen

Gedetailleerde instructies voor het instellen of installeren van mips.

MARS MIPS Simulator

MARS MIPS simulator is een editor voor assembleertaal, assembler, simulator en debugger voor de MIPS-processor, ontwikkeld door Pete Sanderson en Kenneth Vollmar aan Missouri State University ( src ).

Je krijgt de MARS hier gratis. Wat betreft het installeren van de 4.5-versie, hebt u mogelijk vanaf hier de geschikte Java SDK voor uw systeem nodig

Voor het samenstellen kan de omgeving van deze simulator eenvoudig worden opgesplitst in drie segmenten: de editor linksboven waar alle code wordt geschreven, de compiler / uitvoer rechts onder de editor en de lijst met registers die de "CPU" vertegenwoordigen voor ons programma. voer hier de afbeeldingsbeschrijving in

Na het samenstellen (door eenvoudig op F3 te drukken) verandert de omgeving, waarbij twee nieuwe segmenten de positie van de editor krijgen: het tekstsegment waar

i) elke regel assemblagecode wordt vrijgemaakt van "pseudo-instructies" (we zullen het daar zo over hebben) in de kolom "basic" en

ii) de machinecode voor elke instructie in de kolom "code",

en het gegevenssegment waar we een weergave kunnen bekijken van het geheugen van een processor met een kleine endian-orde . voer hier de afbeeldingsbeschrijving in

Na het samenstellen, kunnen we onze code in één keer uitvoeren (F5) of stap voor stap (F7), en de uitvoering meerdere stappen achteruit (F8) terugspoelen. voer hier de afbeeldingsbeschrijving in

Laten we nu de voorbeeldcode van hierboven bekijken en elke regel uitleggen:

.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 accepteert en exporteert bestanden met het .asm-bestandstype

Maar de bovenstaande code drukt alleen een personage af, hoe zit het met de goede "Hallo wereld"? Hoe zit het met, niet, een nummer of zoiets toevoegen? Welnu, we kunnen veranderen wat we daarvoor hadden:

.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 
 

Voordat u de resultaten via MARS illustreert, is een beetje meer uitleg over deze opdrachten nodig:

  • Systeemoproepen zijn een reeks services die door het besturingssysteem worden geleverd. Om een systeemoproep te gebruiken, moet een oproepcode in het $ v0-register worden gezet voor de benodigde bewerking. Als een systeemaanroep argumenten heeft, worden deze in de registers $ a0- $ a2 geplaatst. Hier zijn alle systeemoproepen.

  • li (onmiddellijk laden) is een pseudo-instructie (daar zullen we het later over hebben) die onmiddellijk een register met een waarde laadt. la (adres laden) is ook een pseudo-instructie die een adres in een register laadt. Met li $v0, 4 het $ v0 register nu 4 als waarde, terwijl la $a0, str de string van str in het $a0 register laadt.

  • Een woord is (zoveel als we het over MIPS hebben) een reeks van 32 bits, waarbij bit 31 de meest significante bit is en bit 0 de minst significante bit is.

  • lw (woord laden) gaat van het geheugen naar een register, terwijl sw (woord opslaan) van een register naar het geheugen overbrengt. Met de opdracht lw $s1, 0($t0) hebben we in $s1 register de waarde geladen die op de LSB van het $t0 register stond (dat is wat de 0 hier symboliseert, de offset van het woord), aka 256 . $t0 hier het adres, terwijl $s1 de waarde heeft. sw $t2, 0($t0) doet precies het tegenovergestelde werk.

  • MARS gebruikt de Little Endian , wat betekent dat de LSB van een woord wordt opgeslagen op het kleinste byte-adres van het geheugen.

  • MIPS maakt gebruik van byte-adressen , dus een adres is 4 en het vorige en het volgende.

Door de code van eerder te verzamelen, kunnen we verder begrijpen hoe geheugen en registers worden uitgewisseld, waardoor "Hexadecimale waarden" uit het gegevenssegment worden uitgeschakeld:

voer hier de afbeeldingsbeschrijving in

of het inschakelen van "ASCII" uit het gegevenssegment:

voer hier de afbeeldingsbeschrijving in

Start het zo

$ java -jar Mars4_5.jar

Maak dit bestand en sla het op.

    .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)
 

Druk op F3 om het te monteren en druk vervolgens op uitvoeren. Nu begint u met het compileren en uitvoeren van MIPS-code.

QtSpim voor Windows

  1. download QtSpim vanaf hier 32,6 MB
  2. installeer het eenvoudige installatie
  3. maak uw eerste montagebestand (.s) of gebruik het voorbeeld C: \ Program Files (x86) \ QtSpim \ helloworld.s
  4. voer het programma uit vanaf de snelkoppeling op het bureaublad of C: \ Program Files (x86) \ QtSpim \ QtSpim.exe

er zijn twee vensters voor het programma, het hoofdvenster met het label QtSpim, hier ziet u het programma dat u uitvoert (tekst met label), het geheugen (gegevens met label), de waarden van de registers (met FP Regs voor floating point en Int Regs voor integer) en de besturing voor de simulator

het andere venster met het label console is waar u de uitvoer ziet en de invoer van uw programma invoert als die er is

  1. laad het bestand met Bestand -> Bestand laden
  2. u kunt click run (f5) gebruiken om het eindresultaat te zien of stap voor stap (p10) om de status van het register en geheugen te zien terwijl het programma wordt uitgevoerd om te debuggen