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č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í 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.

Tab. 1

 

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

 

 

  • V datovém segmentu jsou definovány proměnné var1, var2 a var3 typu word, tj. 32bitové.
  • Vstupní bod programu musí být označen návěštím s názvem main, které musí být deklarováno jako globální.
  • Instrukce
  • 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 .

  • Na konci programu není direktiva end.

  •  

    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í:

    1. Do registru $v0 se vloží číslo systémové služby (viz Tab. 2).
    2. Argumenty volání se vloží do registrů $a0 - $a3 (resp. do $f12 pro argumenty v pohyblivé řádové čárce).
    3. Systémové služby se volají instrukcí syscall.
    4. Případné výsledky jsou vraceny v registru $v0 resp. $f0.

    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,
    $a1 = length

     

    sbrk

    9

    $a0 = amount

     

    exit

    10

     

     

    Tab. 2

    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í:

     


     

    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).

    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.

    Poznámka:

    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