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.