Stru
čný návod k použití 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, takže není nutné před simulací program přeložit a sestavit. V simulátoru lze volitelně zapnout simulaci zpoždě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čeV 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í položky 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é položky 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é položky 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í položky 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 použití registru $at. |
.set at | Povolení varovných zpráv při použití 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í položky 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á položka a pojmem „halfword“ 16bitová položka.
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é služby. V simulátoru je standardní modul jádra zaváděn automaticky.
Po inicializaci simulátoru a zavedení programu je programový segment (text segment) uložen od adresy 0040 0000h. Na této adrese je krátká rutina, která zabezpečuje předání parametrů do programu. Uživatelský program je spuštěn instrukcí
jal main
.Datový segment je uložen od adresy 1000 0000h. Data v něm uložená 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á služba exit. Protože simulátor procesoru umožňuje i simulaci zpožděných skoků, měla by být za instrukcí j $ra instrukce nop .
3. Systémové služby
V simulátoru SPIM lze použít simulované volání některých systémových služeb operačního systému. Postup volání je následující:
Služby vstupu a výstupu spolupracují se simulovanou konzolou, jejíž okno se v případě potřeby automaticky otevře na pracovní ploše.
Služba |
Č íslo služby |
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 použití systémové služby 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řiložených souborech jsou ukázky velmi jednoduchých programů, které demonstrují některé jevy probírané na cvičení:
Program skok.asm demonstruje zpoždě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 zpoždění čtení dat z paměti. Protože 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ý vložením instrukcí NOP tak, aby sečítání dávalo správný výsledek.
Program vystup.asm demonstruje použití služby 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 použita 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 zpoždění instrukcí typu load a skokových instrukcí. Porovnání průběhu výpočtu s povolenou a zakázanou simulací těchto zpoždění je velmi užiteč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 však na rozdíl od nich překládány způsobem 1:n, tj. jedna pseudoinstrukce v asembleru je přeložena do několika strojových instrukcí. Příkladem může být běžná pseudoinstrukce
lw $t0,var1 ,
která byla použita v ukázkovém programu. Protože 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, použitá 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.).
Protože simulátor SPIM zobrazuje obsah kódového segmentu po „překladu“, je možné 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 stažení i přehledný manuál k simulátoru SPIM, včetně instrukčního souboru procesoru MIPS. Tento manuál obsahuje i užiteč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 stažení 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