mips Zelfstudie
Aan de slag met mips
Zoeken…
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.
QtSpim voor Windows
- download QtSpim vanaf hier 32,6 MB
- installeer het eenvoudige installatie
- maak uw eerste montagebestand (.s) of gebruik het voorbeeld C: \ Program Files (x86) \ QtSpim \ helloworld.s
- 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
- laad het bestand met Bestand -> Bestand laden
- 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
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.
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 .
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.
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. Metli $v0, 4
het $ v0 register nu4
als waarde, terwijlla $a0, str
de string vanstr
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, terwijlsw
(woord opslaan) van een register naar het geheugen overbrengt. Met de opdrachtlw $s1, 0($t0)
hebben we in$s1
register de waarde geladen die op de LSB van het$t0
register stond (dat is wat de0
hier symboliseert, de offset van het woord), aka256
.$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:
of het inschakelen van "ASCII" uit het gegevenssegment:
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.