mips Samouczek
Pierwsze kroki z mipsami
Szukaj…
Uwagi
W tej sekcji omówiono, czym są mips i dlaczego deweloper może chcieć z nich korzystać.
Powinien również wymieniać wszelkie duże tematy w mipsach i link do powiązanych tematów. Ponieważ Dokumentacja dla mipsów jest nowa, może być konieczne utworzenie początkowych wersji tych pokrewnych tematów.
Instalacja lub konfiguracja
Szczegółowe instrukcje dotyczące konfigurowania lub instalowania mipsów.
QtSpim dla Windows
- pobierz QtSpim stąd 32,6 MB
- zainstaluj to łatwa instalacja
- utwórz plik pierwszego zestawu (.s) lub użyj przykładowego C: \ Program Files (x86) \ QtSpim \ helloworld.s
- uruchom program ze skrótu na pulpicie lub C: \ Program Files (x86) \ QtSpim \ QtSpim.exe
są dwa okna dla programu, główne z etykietą QtSpim, tutaj widzisz program, który uruchamiasz (tekst z etykietą), pamięć (dane z etykietami), wartości rejestrów (z etykietami FP Regs dla liczb zmiennoprzecinkowych i Int Regs dla liczb całkowitych) i sterowanie symulatorem
w drugim oknie oznaczonym konsolą zobaczysz dane wyjściowe i wprowadź dane wejściowe programu, jeśli takie istnieją
- załaduj plik za pomocą Plik -> Załaduj plik
- możesz użyć kliknięcia (f5), aby zobaczyć wynik końcowy, lub przejść krok po kroku (p10), aby zobaczyć stan rejestru i pamięci podczas wykonywania programu w celu debugowania
MARS MIPS Simulator
MARS MIPS Simulator to edytor języka asemblerowego, asembler, symulator i debugger dla procesora MIPS, opracowany przez Pete Sanderson i Kenneth Vollmar z Missouri State University ( src ).
Dostajesz MARS za darmo tutaj . Co do instalacji wersji 4.5, może być konieczne odpowiednie Java SDK dla systemu z tutaj
Przed złożeniem środowisko tego symulatora można w prosty sposób podzielić na trzy segmenty: edytor w lewym górnym rogu, w którym zapisywany jest cały kod, kompilator / wyjście bezpośrednio pod edytorem oraz lista rejestrów reprezentujących „CPU” dla naszego programu.
Po złożeniu (po prostu naciśnięciu F3) środowisko zmienia się, a dwa nowe segmenty otrzymują pozycję edytora: segment tekstowy, w którym
i) każda linia kodu asemblera jest usuwana z „pseudoinstrukcji” (porozmawiamy o nich za sekundę) w kolumnie „podstawowej” i
ii) kod maszynowy dla każdej instrukcji w kolumnie „kod”,
oraz segment danych, w którym możemy spojrzeć na reprezentację pamięci procesora o kolejności little-endian .
Po złożeniu możemy wykonać nasz kod zarówno naraz (F5) lub krok po kroku (F7), a także przewinąć wykonanie kilku kroków wstecz do tyłu (F8).
Zobaczmy teraz przykładowy kod z góry i wyjaśnijmy każdą linię:
.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 akceptuje i eksportuje pliki o typie plików .asm
Ale powyższy kod wypisuje tylko znak, a co z dobrym starym „Hello World”? Co powiesz, nie wiem, dodając numer czy coś? Cóż, możemy zmienić to, co mieliśmy po prostu za to:
.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
Przed zilustrowaniem wyników za pomocą MARS potrzebne jest trochę więcej wyjaśnień na temat tych poleceń:
Wywołania systemowe to zestaw usług świadczonych z systemu operacyjnego. Aby użyć wywołania systemowego, należy wprowadzić kod połączenia do rejestru $ v0 dla potrzebnej operacji. Jeśli wywołanie systemowe ma argumenty, są one umieszczane w rejestrach $ a0- $ a2. Oto wszystkie wywołania systemowe.
li
(ładuj natychmiast) to pseudo-instrukcja (o tym porozmawiamy później), która natychmiast ładuje rejestr z wartością.la
(adres ładowania) to także pseudo-instrukcja, która ładuje adres do rejestru. W przypadkuli $v0, 4
rejestr $ v0 ma teraz4
jako wartość, podczas gdyla $a0, str
ładuje ciągstr
do rejestru$a0
.Słowo to (o ile mówimy o MIPS) sekwencja 32-bitowa, przy czym bit 31 jest bitem najbardziej znaczącym, a bit 0 jest bitem najmniej znaczącym.
lw
(ładuj słowo) przenosi z pamięci do rejestru, podczas gdysw
(zapisz słowo) przenosi z rejestru do pamięci. Za pomocą komendylw $s1, 0($t0)
załadowaliśmy do rejestru$s1
wartość, która znajdowała się w LSB rejestru$t0
(to właśnie symbolizuje tutaj0
, przesunięcie słowa), czyli256
.$t0
tutaj ma adres, a$s1
ma wartość.sw $t2, 0($t0)
wykonuje dokładnie odwrotną robotę.MARS używa Little Endian , co oznacza, że LSB słowa jest przechowywany pod najmniejszym bajtem adresu pamięci.
MIPS używa adresów bajtów , więc adres jest oddzielony od poprzedniego i następnego o 4.
Dzięki złożeniu kodu z wcześniejszego etapu możemy lepiej zrozumieć, w jaki sposób pamięć i rejestry wymieniają się, wyłączając „Wartości szesnastkowe” z segmentu danych:
lub włączenie „ASCII” z segmentu danych:
Zacznij to tak
$ java -jar Mars4_5.jar
Utwórz ten plik i zapisz go.
.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)
Naciśnij F3, aby go złożyć, a następnie naciśnij uruchom. Teraz zaczynasz kompilowanie i wykonywanie kodu MIPS.