e mul
Transkrypt
e mul
Wykład 10, str. 1 Uproszczony schemat kompilacji program źródłowy ✕ analiza leksykalna ciąg leksemów ✕ drzewo wywodu analiza syntaktyczna analiza semantyczna KOMPILATOR generacja kodu ✕ drzewo i tablice symboli ✯ kod qqqqqqqqqq qqqqq qqq qqqqq qqq docelowy qqq qq qqq qqq qqq q q dane do wyniki programu Wykład 10, str. 2 Uproszczony schemat kompilacji drzewo i tablice symboli ✯ KOMPILATOR generacja kodu kod docelowy Wykład 10, str. 3 PAMIĘĆ Programowanie niskiego poziomu rejestr arytmetyczny (akumulator) 0 1 2 3 4 5 6 7 8 9 10 11 · · · n • adresowana (czyli numerowana) pamięć złożona z komórek, z których każda może pomieścić bajt; dla uproszczenia zakładam, że nie bajt tylko liczbę całkowitą; • rejestr arytmetyczny także mogący pomieścić liczbę całkowitą; większość operacji odbywa się między rejestrem arytmetycznym a komórką pamięci; • komendy (patrz niżej) są kodowane liczbami całkowitymi i wpisywane do komórek pamięci. Wykład 10, str. 4 PAMIĘĆ Programowanie niskiego poziomu 0 1 2 3 4 5 6 7 8 9 10 11 rejestr arytmetyczny (akumulator) e r ... ✛ ...s....t....o........................... ..✒ . . . . . . . . . . . . . . . . . . ...... ..✙ ... ...... . . . . . . ......d..a KOMENDY PRZESYŁANIA: . . . . . . . . . . . . . . ......................... loa loadn n — załaduj do akumulatora liczbę n loada n — załaduj do akumulatora liczbę z komórki o adresie n store n — zapamiętaj zawartość akumulatora w kom. o adresie n · · · n loadn load = ładować store = przechowywać, magazynować Wykład 10, str. 5 PAMIĘĆ Programowanie niskiego poziomu 0 1 2 3 4 5 6 7 8 9 10 11 rejestr arytmetyczny (akumulator) ....... ... ...............✲ ..... .... .............................. .. add KOMENDY ARYTMETYCZNE: . . . .... sub .......................... add n — dodaj do akumulatora mul liczbę z kom. o adresie n; wynik w akumulatorze sub n — odejmij od akumulatora liczbę z kom. o adresie n; wynik w akumulatorze mul n — pomnóż akumulator przez liczbę z kom. o adresie n; wynik w akumulatorze add = dodawać subtract = odejmować multiply = mnożyć · · · n Wykład 10, str. 6 PAMIĘĆ Programowanie niskiego poziomu 0 1 2 3 4 5 6 7 8 9 10 11 rejestr arytmetyczny (akumulator) ....................... incr . . . . . . . . . .. .... ..... .✙ ....... ... decr ............ increment = zwiększać decrement = zmniejszać · · · n KOMENDY DZIAŁAŃ NA KOMÓRKACH: incr n — powiększ o 1 zawartość kom. o adresie n decr n — zmniejsz o 1 zawartość kom. o adresie n Wykład 10, str. 7 PAMIĘĆ Programowanie niskiego poziomu 0 1 2 3 4 5 6 7 8 9 10 11 rejestr arytmetyczny (akumulator) komenda KOMENDY SKOKÓW: komenda ......... komenda ..✛ goto n — przejdź do komórki ... goto . ... o adresie n komenda ..zergoto zergoto n — jeśli w akumul. zero, . komenda ..plsgoto . to przejdź do kom. komenda .. mingoto . . . o adresie n skok ........ plsgoto n — jeśli akum. dodatni, komenda to przejdź do kom. komenda mingoto n — stop — · · · n o adresie n jeśli akum. ujemny, to przejdź do kom. o adresie n zatrzymaj działanie go to = idź do Wykład 10, str. 8 PAMIĘĆ Programowanie niskiego poziomu 0 1 2 3 4 5 6 7 8 9 10 11 297 8 5 -3 1 loada 2 mul 1 add 3 mul 1 add 4 store 0 stop · · · n rejestr arytmetyczny (akumulator) 297 PRZYKŁAD: Obliczenie wartości wielomianu 5x2 − 3x + 1 = (5 · x − 3) · x + 1 (współczynniki w komórkach 2–4) w punkcie x = 8 (komórka 1); wynik w komórce 0. Program należy uruchomić od komórki 5. Wykład 10, str. 9 PAMIĘĆ Programowanie niskiego poziomu 0 loadn 1 1 store 10 2 loada 10 mul 9 3 4 store 10 decr 9 5 6 loada 9 7 plsgoto 2 stop 8 n 0 9 s 6 10 11 · · · rejestr arytmetyczny (akumulator) 0 PRZYKŁAD: Obliczenie silni s=1; do s=s*n; n--; while (n>0); dla początkowej wartości n = 3. Program należy uruchomić od komórki 0; wynik zostaje w kom. 10. n Wykład 10, str. 10 Programowanie niskiego poziomu Prosty adres komendy: liczba całkowita oznaczająca • albo samą liczbę, np. loadn 500 oznacza: załaduj do akumulatora liczbę 500; • albo adres komórki, której dotyczy komenda, np. loada 500 oznacza: załaduj do akumulatora liczbę z komórki 500. Modyfikowany adres komendy: postaci n+[k] — adres n modyfikowany zawartością komórki o adresie k, należy tą zawartość do adresu n dodać. Np. jeśli pod adresem 500 stoi liczba 1, to komenda add 200+[500] oznacza: dodaj do akumulatora zawartość komórki 201; a jeśli pod adresem 500 stoi liczba 5, to ta sama komenda add 200+[500] oznacza: dodaj do akumulatora zawartość komórki 205. Wykład 10, str. 11 PAMIĘĆ Programowanie niskiego poziomu decr 6 0 1 loadn 0 2 store 7+[6] 3 loada 6 4 plsgoto 0 stop 5 5 6 10 7 11 8 12 9 13 10 14 11 · · · n rejestr arytmetyczny (akumulator) PRZYKŁAD: n a0 a1 a2 a3 a4 Zerowanie n komórek: do n--; a[n]=0; while (n>0); (wielkość n obszaru zerowanego zapisana jest w komórce 6; sam obszar zaczyna się w komórce 7). Program należy uruchomić od komórki 0.