$Id: doc-draft.txt,v 1.1 2003/01/05 01:38:28 batonik Exp $
Dokumentacja projektu *SmArc*
Autorzy:
Michał Stochmiałek
Tomasz Poradowski
Politechnika Wrocławska, Wrocław, (c) 2002-2003
--- Wstęp
Wirtualna maszyna SmArc powstała jako projekt akademicki, mający
na celu bliższe poznanie architektury oraz sposobu działania procesora
SPARC. SmArc (od "Small spArc") zawiera jego wersję uproszczoną, jednakże
wiernie oddaje ona realia i większość aspektów projektowych oraz
technologicznych zastosowanych w oryginale (więcej informacji w
[SPARC manual]).
--- Elementy SmArc
W skład pakietu SmArc wchodzą następujące składniki (szczegółowy opis
znajduje się w dalszej części):
- vmachine - wirtulana maszyna oparta na uproszczonej wersji procesora
SPARC
- spasm - asembler programów napisanych w języku SmArcAs (uproszczonej
wersji asemblera SPARC)
- despasm - deasembler plików wykonywalnych zapisanych w formacie maszyny
wirtualnej SmArc
- smarcgui - interfejs graficzny wirtualnej maszyny SmArc
- examples - przykładowe programy źródłowe w języku SmArcAs
-- vmachine --
(wstęp - co to jest za moduł, co robi, gdzie się z niego korzysta)
- Założenia
(uproszczony (z mniejszą liczbą rozkazów) procesor SPARC, 5-cio potokowy,
forwarding, stall; brak: annul bit, koprocesora, połowy PSR, etc.)
- Realizacja
(z czego się składa, jakie rejestry, co zawierają, jaka pamięć i ile jej jest)
(okna rejestrów - jak się zmieniają)
(loader binarek)
Funkcje realizowane w wirtualnej maszynie SmArc są zgodne z opisem
zawartym w [SPARC manual].
-- spasm --
Program "spasm" służy do tłumaczenia plików źródłowych napisanych w
języku SmArcAs (uproszczonej wersji asemblera SPARC) do kodu wykonywalnego
(binarnego) w formacie maszyny wirtualnej SmArc.
Wywołanie: spasm [-h] [-v] [-q] [-o ]
gdzie to plik źródłowy zawierający program w języku SmArcAs.
Opcje wywołania:
"-h" wyświetla krótką informację o składni wywołania programu
"-v" włącza tryb "debug" - program będzie wtedy wyświetlał sporą
ilość informacji dotyczących analizy składniowo-leksykalnej;
nie zostaną także usunięte osobne pliki tymczasowe programu
zawierające sekcje danych oraz kodu
"-q" wyłącza informacje ostrzegawcze (o braku niektórych elementów
składni języka, których brak nie powoduje jednakże błędów przy
generowaniu pliku wynikowego) (użycie NIE ZALECANE)
"-o " określa nazwę pliku wynikowego, do którego ma zostać zapisany
program wykonywalny (); jeżeli parametr ten zostanie
pominięty, to zostanie użyta domyślna nazwa pliku wynikowego
'spasm.output'
Jeżeli podczas analizy pliku źródłowego nie wystąpiły żadne błędy, "spasm"
nie wypisze żadnego komunikatu (zachowanie podobne do standardowych
kompilatorów) oraz utworzy plik wykonywalny w formacie maszyny wirtualnej
(opis poniżej); w przeciwnym przypadku na ekranie pojawią się komunikaty
błędów i plik wynikowy nie zostanie utworzony (lub będzie pusty).
- Założenia języka SmArcAs
Składnia języka SmArcAs ("Small spArc Assembler"):
program ::= [linia]*
linia ::= [wyrażenie] [!komentarz]
wyrażenie ::= [etykieta:] [instrukcja]
instrukcja ::= rozkaz | pseudorozkaz | dyrektywa
gdzie:
[] - element opcjonalny
* - powtórzenie 0 lub więcej razy
| - alternatywa
Rozpoznawane przez "spasm" rozkazy obejmują (liczby w nawiasie oznaczają
składnię rozkazu/grupy rozkazów - opisane dalej):
* rozkazy arytmetyczne (1):
add, addx, addcc, addxcc, sub, subx, subcc, subxcc
* rozkazy logiczne (1):
and, andcc, or, orcc, xor, xorcc, andn, andcc, orn, orncc,
xorn, xorncc
* rozkazy przesunięć (1):
sll, srl, sra
* rozkazy skoków warunkowych branch (2) (w nawiasach [] nazwy alternatywne):
bn, bleu, ba, bgu, be [bz], bcs [blu], bne [bnz], bcc [bgeu]
ble, bneg, bg, bpos, bl, bvs, bge, bvc
* rozkazy dostępu do pamięci (3):
ld, ldub, ldsb, lduh, ldsh, st, stb, sth, std
* rozkazy sterujące:
call (4), jmpl (5)
* inne rozkazy:
sethi (6), save (1), restore (1)
składnia rozkazów:
(1) "instr" , /,
(2) "branch"
(3) "load" [ ],
"store" , [ ]
(4) call
(5) jmpl ,
(6) sethi ,
gdzie:
- pierwszy rejestr źródłowy
- drugi rejestr źródłowy
- stała 13 bitowa
- rejestr docelowy wyniku
- etykieta (adres) w sekcji kodu
- stała liczbowa (lub adres wskazywany przez etykietę
danych/kodu)
to kombinacja kilku powyższych składników:
+
+
-
Dokładniejsze informacje dot. składni, formatu słów rozkazowych i kodowania
rozkazów można znaleźć w [SPARC manual]. Tam również znajdują się
rozkazy procesora SPARC, których implementacja SmArc nie obejmuje (inne
rozkazy arytmetyczne, rozkazy korzystające z koprocesora, itp.)
Pseudorozkazy rozpoznawane przez "spasm" oraz ich interpretacja znajdują się
w poniższej tabeli:
Pseudorozkaz Rozkaz(y)
mov %src, %dst or %g0, %src, %dst
cmp %reg1, %reg2 subcc %reg2, %reg1, %g0
tst %reg orcc %g0, %reg, %g0
not %reg xnor %g0, %reg, %reg
neg %reg sub %g0, %reg, %reg
inc %reg add %reg, 1, %reg
dec %reg sub %reg, 1, %reg
clr %reg or %g0, %g0, %reg
restore restore %g0, %g0, %g0
save save %g0, %g0, %g0
ret jmpl %i7 + 8, %g0
jmp jmpl , %g0
skipz bnz . + 8 *
skipnz bz . + 8 *
set ,%reg sethi %hi(),%reg
or %reg,%lo(),%reg
lub
or %reg, , %reg
(gdy <= )
nop sethi 0, %g0
* Kropka (.) w polu argumentu oznacza adres bieżącego rozkazu; SmArc nie
obsługuje "annul bit", więc generowane rozkazy nie ustawiają tego bitu(!)
Dyrektywy SmArcAs
Postać dyrektywy Funkcja Uwagi
.text Początek sekcji programu (rozkazów)
.data Początek sekcji danych
.align k Wyrównanie adresu do granicy k bajtów (k = 2 lub 4)
.skip n Rezerwacja n kolejnych bajtów
.byte w1,w2,w3,... Nadanie wartości w1, w2, .. kolejnym bajtom
.half w1,w2,w3,... Nadanie wartości w1, w2, .. kolejnym półsłowom
.word w1,w2,w3,... Nadanie wartości w1, w2, .. kolejnym słowom
.ascii 'znaki..' Umieszczenie w kolejnych bajtach kodów znaków ASCII **
= Przypisanie nazwie (lewostronnej) wartości (prawostronnej)
** Znaki sterujące zapisuje się następująco:
\b - backspace, \n - new line, \r - carriage return, \t - horizontal tab.
Inne założenia:
- małe i duże litery są rozróżniane za wyjątkiem nazw symboli specjalnych,
- rozkazy są pisane wyłącznie małymi literami,
- symbole specjalne zaczynają się od znaku procentu (%)
- etykiety i nazwy zaczynaja się od litery; po etykiecie musi być
dwukropek (:).
- liczby mogą być w zapisie dziesiętnym lub szesnastkowym; w zapisie
szesnastkowym liczby muszą być poprzedzone znakiem zera i litery 'x'
(0x....),
- łańcuch znaków umieszczany jest w pojedynczym cudzysłowie ('),
- dostępne operatory unarne:
%lo () - wydziela 10 m.zn. bitów stałej (32-bitowej)
%hi () - wydziela 22 b.zn. bity stałej (32-bitowej)
- nazwy rejestrów mogą być zapisywane w formie "%r" lub alternatywnie jako
"%g", "%o", "%i", "%l", "%sp" oraz "%fp" (gdzie 0 <= N <= 31,
0 <= M <= 7).
- Format pliku wykonywalnego maszyny wirtualnej
Asembler "spasm" scala część danych oraz część kodu programu do
pliku wynikowego o następującym formacie:
NAGŁÓWEK|WERSJA|ID_DANYCH|DL_DANYCH|DANE|ID_KODU|DL_KODU|KOD
gdzie poszczególne pola to:
// może jakaś tabelka? "Pole | Długość | Zawartość"
NAGŁÓWEK (4 bajty)
- ciąg ASCII; stały ciąg 'SMARC' identyfikujący plik wykonywalny
WERSJA (1 bajt)
- cyfra 0-9 w kodzie ASCII; numer wersji pliku wykonywalnego
(obecnie jedyna obsługiwana wersja to '0')
ID_DANYCH (4 bajty)
- ciąg ASCII; stały ciąg 'DATA' zapowiadający sekcję danych
DL_DANYCH (4 bajty)
- słowo 32-bitowe (big-endian); zawiera długość bloku danych (w bajtach)
wyrównanego do granicy słowa 32-bitowego
DANE (DL_DANYCH bajtów)
- sekcja danych
ID_KODU (5 bajtów)
- ciąg ASCII; stały ciąg 'INSTR' zapowiadający sekcję kodu
DL_KODU (4 bajty)
- słowo 32-bitowe (big-endian); zawiera długość bloku kodu (w bajtach)
KOD (DL_KODU bajtów)
- sekcja kodu
-- despasm --
Program "despasm" to prosty deasembler kodu binarnego wygenerowanego
za pomocą asemblera "spasm".
Wywołanie: despasm [-b] [-n]
gdzie to plik binarny w formacie wykonywalnym maszyny wirtualnej SmArc.
Opcje wywołania:
"-b" powoduje, że pomijane jest wyświetlanie adresu danego rozkazu (liczonego
od początku, czyli adresu 0x0) na początku każdej linii
"-n" modyfikuje domyślny tryb wyświetlania nazw rejestrów w argumencie
rozkazu z zapisu "%r" do bardziej przyjaznego programiście zapisu
alternatywnego - "%g", "%o", "%i", "%l", "%sp" oraz "%fp"
(gdzie 0 <= N <= 31, 0 <= M <= 7).
Domyślnie wyświetla on dla każdego słowa rozkazowego na standardowym wyjściu
linię postaci:
"adres: rozkaz argumenty"
-- smarcgui --
"smarcgui" to graficzny interfejs maszyny wirtualnej SmArc. Intuicyjna
realizacja zapewnia łatwy i zorganizowany dostęp do wewnętrznych elementów
maszyny wirtualnej, takich jak rejestry i pamięć, oraz do stanów pośrednich w
poszczególnych krokach przetwarzania potokowego.
-- examples --
W katalogu "examples" zawarte zostały poglądowe programy mające na
celu pokazanie jednej lub więcej właściwości procesora SPARC. Niektóre z nich
to zwykłe, typowe programy testowe.
addloop.asm - pętla wykonywana zadaną ilość razy
arith.asm - instrukcje arytmetyczne
forward.asm - demonstracja "forwardingu" w procesorze SPARC
load.asm - odczyt i zapis z/do pamięci DCache
logic.asm - operacje logiczne na rejestrach
loop.asm - instrukcje branch
memcpy.asm - kopiowanie danych
procedure.asm - instrukcja call
wywołanie fragmentu programu (procedury)
recurence.asm - instrukcje call, save, restore
rekurencyjne wywołanie fragmentu programu (procedury)
stall.asm - demonstracja wystąpienia "stall" w procesorze SPARC
--- INSTALACJA ---
-- Wymagania
flex-devel, bison-devel, stdc++-devel, Gtk-devel, glade-devel, etc.
-- Budowanie pakietu SmArc
$ tar xzf smarc-XX.tar.gz
$ cd smarc
$ make