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

  1. pobierz QtSpim stąd 32,6 MB
  2. zainstaluj to łatwa instalacja
  3. utwórz plik pierwszego zestawu (.s) lub użyj przykładowego C: \ Program Files (x86) \ QtSpim \ helloworld.s
  4. 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ą

  1. załaduj plik za pomocą Plik -> Załaduj plik
  2. 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. wprowadź opis zdjęcia tutaj

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 . wprowadź opis zdjęcia tutaj

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). wprowadź opis zdjęcia tutaj

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 przypadku li $v0, 4 rejestr $ v0 ma teraz 4 jako wartość, podczas gdy la $a0, str ładuje ciąg str 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 gdy sw (zapisz słowo) przenosi z rejestru do pamięci. Za pomocą komendy lw $s1, 0($t0) załadowaliśmy do rejestru $s1 wartość, która znajdowała się w LSB rejestru $t0 (to właśnie symbolizuje tutaj 0 , przesunięcie słowa), czyli 256 . $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:

wprowadź opis zdjęcia tutaj

lub włączenie „ASCII” z segmentu danych:

wprowadź opis zdjęcia tutaj

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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow