$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