Stručný návod k pouití simulátoru SPIM
1. Základní vlastnosti
SPIM je jednoduchý simulátor procesorů MIPS řady R2000 a R3000. Vstupem simulátoru je program napsaný v jazyku symbolických adres. Simulátor čte přímo zdrojový kód, take není nutné před simulací program přeloit a sestavit. V simulátoru lze volitelně zapnout simulaci zpoděného provedení instrukcí typu LOAD a skokových instrukcí.
2. Syntaxe asembleru
Jazyk symbolických adres akceptovaný simulátorem SPIM má velmi jednoduchou syntaxi, která vyhovuje pro psaní jednoduchých programů.
Direktivy překladače
V následující tabulce (Tab. 1) je uveden seznam direktiv, akceptovaných překladačem simulátoru SPIM.
|
Direktiva |
Význam |
|---|---|
| .align n | Zarovnání počítadla adres na hranici 2n. |
| .ascii str | Definice řetězce ASCII. Řetězec není zakončen nulovým znakem. |
| .asciiz str | Definice řetězce ASCII. Řetězec je zakončen nulovým znakem. |
| .byte b1,...bn | Definice bytů s obsahem b1, ... bn |
| .data <addr> | Označení datového segmentu. Následující poloky budou ukládány do datového segmentu. Volitelně lze zadat adresu ukládání addr. |
| .double d1,...dn | Definice dat ve formátu double precision float. Jednotlivé poloky mají hodnotu d1, ... dn. |
| .extern sym size | Definice externího symbolu sym o velikosti size bytů. |
| .float f1,...fn | Definice dat ve formátu single precision float. Jednotlivé poloky mají hodnotu f1, ... fn. |
| .globl sym | Definice globálního symbolu sym. |
| .half h1,...hn | Definice 16bitových hodnot h1, ... hn. |
| .kdata <addr> | Označení segmentu jádra (kernel). Následující poloky budou ukládány do datového segmentu jádra. Volitelně lze zadat adresu ukládání addr. |
| .ktext <addr> | Označení segmentu jádra (kernel). Následující instrukce budou ukládány do programového segmentu jádra. Volitelně lze zadat adresu ukládání addr. |
| .set noat | Potlačení varovných zpráv při pouití registru $at. |
| .set at | Povolení varovných zpráv při pouití registru $at. |
| .space n | Posunutí počítadla adres v aktivním segmentu o n bytů. |
| .text <addr> | Označení kódového segmentu. Následující poloky budou ukládány do datového segmentu. Volitelně lze zadat adresu ukládání addr. |
| .word w1,...wn | Definice 32bitových hodnot w1, ... wn. |
Poznámka: V terminologii, pouívané v souvislosti s procesorem MIPS je pojmem word označována 32bitová poloka a pojmem halfword 16bitová poloka.
Struktura programu
Program je tvořen jedním kódovým segmentem (v originální terminologii označovaným jako text, v programu uvozeným direktivou .text) a jedním datovým segmentem (označeným direktivou .data). Zásobníkový segment je ve SPIM vytvořen automaticky.
Segment jádra obsahuje procedury pro zpracování výjimek (Exceptions) a některé systémové sluby. V simulátoru je standardní modul jádra zaváděn automaticky.
Po inicializaci simulátoru a zavedení programu je programový segment (text segment) uloen od adresy 0040 0000h. Na této adrese je krátká rutina, která zabezpečuje předání parametrů do programu. Uivatelský program je sputěn instrukcí
jal main .
Datový segment je uloen od adresy 1000 0000h. Data v něm uloená jsou obvykle adresována pomocí registru $gp, který je při inicializaci simulátoru nastaven na hodnotu 1000 8000h.
Zásobník je standardně umístěn na adrese 7FFF FFFF. Registr $sp je inicializován na hodnotu 7FFF EFF0h.
Jednoduchý program
Následující příklad velmi jednoduchého programu ukazuje některé základní postupy:
.data
var1: .word 0x11223344
var2: .word 0xAABBCC00
var3: .word 0x00
.text
.globl main
main: lw $t0,var1 # prvni operand do $t0
lw $t1,var2 # druhy operand do $t1
nop
nop
addu $t2,$t1,$t0 # $t2 = $t1 + $t0
sw $t2,var3 # vysledek z $t2 do var3
j $ra # navrat
nop
j $ra
na konci programu vrací výpočet do úvodní rutiny, odkud je potom je volána systémová sluba exit. Protoe simulátor procesoru umoňuje i simulaci zpoděných skoků, měla by být za instrukcí j $ra instrukce nop .
3. Systémové sluby
V simulátoru SPIM lze pouít simulované volání některých systémových slueb operačního systému. Postup volání je následující:
Sluby vstupu a výstupu spolupracují se simulovanou konzolou, její okno se v případě potřeby automaticky otevře na pracovní ploe.
|
Sluba |
Číslo sluby |
Argumenty |
Výsledek |
|---|---|---|---|
|
print_int |
1 |
$a0 = integer |
|
|
print_float |
2 |
$f12 = float |
|
|
print_double |
3 |
$f12 = float |
|
|
print_string |
4 |
$a0 = string |
|
|
read_int |
5 |
|
integer ve $v0 |
|
read_float |
6 |
|
float v $f0 |
|
read_double |
7 |
|
double v $f0 |
|
read_string |
8 |
$a0 = buffer, |
|
|
sbrk |
9 |
$a0 = amount |
|
|
exit |
10 |
|
|
Následující část programu ilustruje pouití systémové sluby print_string:
.data
t_ahoj: .asciiz Ahoj\n
...
.text
...
li $v0,4 # cislo sluzby do $v0
la $a0,t_ahoj # adresa textu do $a0
syscall # volani systemovych sluzeb
nop
...
4. Příklady
V přiloených souborech jsou ukázky velmi jednoduchých programů, které demonstrují některé jevy probírané na cvičení:
Program skok.asm demonstruje zpodění skokových instrukcí. Ze dvou instrukcí, které jsou v programu za instrukcí J lbl1 se první provede - do registru $t0 vloí hodnotu 0xFF. Druhá instrukce se neprovede a $t1 proto zůstane beze změny.
Program secitani.asm demonstruje zpodění čtení dat z paměti. Protoe instrukce ADDU $t2,$t1,$t0 je bezprostředně za instrukcí lw $t1,var2, která naplní $t1 daty z paměti, je výsledek sečítání nesprávný.
Program secitani_NOP obsahuje předchozí program upravený vloením instrukcí NOP tak, aby sečítání dávalo správný výsledek.
Program vystup.asm demonstruje pouití sluby pro výstup řetězce na konzolu.
Program pole.asm demonstruje práci s indexovanou proměnnou resp. s textem. Program kopíruje text z jednoho místa paměti na jiné. Kopírování je ukončeno po nalezení bytu s hodnotou 0x00. Pro čtení bytu z paměti je pouita instrukce LBU ... , která neprovádí znaménkové rozíření bytu (signum extension) na 32 bitů.
5. Některá nastavení simulátoru SPIM
V okně, které otevřeme pomocí příkazu Simulator Settings lze nastavit některé vlastnosti simulátoru (viz Obr. 1).

Předevím se jedná o povolení nebo zákaz simulace zpodění instrukcí typu load a skokových instrukcí. Porovnání průběhu výpočtu s povolenou a zakázanou simulací těchto zpodění je velmi uitečné pro pochopení činnosti procesorů s architekturou RISC.
Při simulaci je nutné mít na paměti, e MIPS je procesor s architekturou RISC, která klade značná omezení na instrukční soubor. Překladač asembleru usnadňuje v některých případech práci programátora tím, e dovoluje pouívat takzvané pseudoinstrukce. Ty se svým významem podobají normálním instrukcím, jsou vak na rozdíl od nich překládány způsobem 1:n, tj. jedna pseudoinstrukce v asembleru je přeloena do několika strojových instrukcí. Příkladem můe být běná pseudoinstrukce
lw $t0,var1 ,
která byla pouita v ukázkovém programu. Protoe instrukční soubor procesoru MIPS nedovoluje pouít instrukci lw s adresním polem dostatečně dlouhým pro adresování v celém rozsahu paměti, je nutné pouít pro práci s proměnnou var1 nepřímé adresování pomocí registru. Překladač pro tyto účely standardně pouívá registr $at (tj. $1). Výe uvedenou instrukci proto přeloí do dvou strojových instrukcí:
lui $1,4097
lw $8,0($1) .
Konstanta 4097, zavedená do vyí poloviny $at instrukcí lui ukazuje do datového segmentu (obsah $at po jejím provedení je 1001 0000h). Konstanta 0, pouitá v operandovém poli instrukce lw $8,0($1) je offset proměnné var1 v tomto segmentu (var1 je první definovaná proměnná, proto je její offset = 0. Proměnná var2 má offset 4 atd.).
Protoe simulátor SPIM zobrazuje obsah kódového segmentu po překladu, je moné způsob činnosti překladače snadno prostudovat.
6. Reference
Simulátor SPIM ve verzi pro Windows s názvem QTspim lze najít na adrese http://sourceforge.net/projects/spimsimulator/files/.
V případě zájmu lze najít i dalí verze pro jiné operační systémy .
Na stejné adrese je ke staení i přehledný manuál k simulátoru SPIM, včetně instrukčního souboru procesoru MIPS. Tento manuál obsahuje i uitečné kapitoly, týkající se programování v asembleru.
Dále je k dispozici stručný návod pro první kroky se SPIM.
Architektura procesoru MIPS32 je popsána ve referenčních manuálech , které jsou po registraci ke staení na www stránkách společnosti Imagination Technologies.
Na stránkách Imagination Technologies je k nalezení i doplňující literatura o MIPS.
Pro ilustraci odkaz na 32bitové verze známých mikrokontrolérů PIC firmy Microchip, které pouívají architekturu MIPS.
Návrat na úvodní stránku předmětu ÚPA.
Poslední změna stránky byla provedena 18.09.2015