Podstawy programowania
systemowego
Dr inż. Zbigniew Lach
konsultacje: poniedziałek, 16:15-17:00
wtorek, 10:15-11:00
OPROGRAMOWANIE
UŻYTKOWE
OPROGRAMOWANIE
SYSTEMOWE
HARDWARE
System komputerowy
oprogramowanie systemowe
• realizuje funkcje konieczne dla działania
systemu komputerowego (świadczy usługi
sprzętowi komputerowemu)
• pojęcie szersze niż systemy operacyjne
• w skład o.s. wchodzi każde oprogramowanie,
z którym użytkownik nie ma bezpośredniej
styczności.
Programowanie systemowe
= rodzaj programowania
systemów oprogramowania
Specyfika:
Programista uwzględnia i aktywnie wykorzystuje cechy
sprzętu i inne właściwości systemu, na którym program
jest uruchomiony
o
język niskiego poziomu
o
środowisko o limitowanych zasobach
o
bezpośredni i surowy dostęp do pamięci i kontroli
wykonania
o
ma małą bibliotekę uruchomieniową (albo wcale)
Program systemowy jest bardzo efektywny i
ma małe narzuty uruchomieniowe
Narzędzia wspomagania programowania systemowego
Język asemblera; ograniczenia asemblera
Makroasembler,
relokowalność, dyrektywy
Konsolidacja i
ładowanie programu
Programowanie
modułowe w języku asemblera
Procedury, parametry, zmienne
wewnętrzne
Wykonywanie
działań na reprezentacjach danych
Struktury danych
Sterowanie programem
Funkcje systemowe
Sterowanie procesami
Program wykładu
Zaliczenie przedmiotu: min. 50% punktów z dwóch
kolokwiów:
(I) 14 kwietnia
(II) 16 czerwca
Literatura podstawowa:
1. A. Silberschatz. P.B. Galwin. "Podstawy systemów
operacyjnych", WNT. Warszawa 2000
2. Gary Syck, "Turbo Assembler. Biblia użytkownika"
LT&P. Warszawa 1994
3. W. Stallings, "Organizacja i architektura systemu
komputerowego", WNT, Warszawa 2000
Wykład 1
Oprogramowanie systemowe
Asembler
Hierarchia oprogramowania
Poziom
Opis
Program aplikacyjny
Oprogramowanie
zaprojektowane dla określonego
zastosowania
Język wysokiego
poziomu (HLL)
Program
y są kompilowane z HLL
na język asemblera lub
maszynowy, n.p. C++, Pascal,
Java, Visual Basic.
Poziom
Opis
System operacyjny
(loadery)
Zawiera procedury, które mogą
być wywoływane z programów
napisanych w HLL lub
asemblerze.
Może być
wyposażony w interfejs
programów aplikacyjnych (API).
Asembler (ASM)
(konsolidatory, edytory,
biblioteki)
Stosuje mnemoniki instrukcji
bezpośrednio odpowiadające
rozkazom języka maszynowego.
Hierarchia oprogramowania.
Poziom
Opis
Język Maszynowy (ML) Instrukcje numeryczne i
operandy, które mogą być
umieszczone w pamięci
komputera i bezpośrednio
wykonywane przez procesor.
Hierarchia oprogramowania.
Planowanie produktu
Projekt. systemu
Projektowanie sprzętu
Projekt. programu
Zgodność z założeniami?
Projektowanie systemu komputerowego
Projektowanie programu
Określenie właściwości
Sporządzanie schematu
blokowego
Kodowanie
Edycja programu
źródłowego
ASEMBLACJA
(TŁUMACZENIE)
Testowanie programu
Testowanie systemu
BŁĘDY
?
BŁĘDY
?
TAK
NIE
TAK
NIE
użycie narzędzi do
programowania
systemowego
Projektowanie systemu komputerowego
Narzędzia programowania systemowego
Narzędzia systemowe wspomagające
poszczególne etapy procesu projektowania
• Programy komputerowe
Posługują się dobrze zrozumiałą dla człowieka symboliką
• Urządzenia pomiarowe (testujące)
Umożliwiają sprawdzenie zgodności z założeniami (testery cyfrowe)
Programy wspomagające projektowanie
• Asembler
- stosuje mnemoniki instrukcji
bezpośrednio
odpowiadające rozkazom języka maszynowego (+linker,
loader)
• Konsolidator/loader -
umożliwia scalenie programu z
odrębnych modułów / załadowanie do pamięci i
przekazanie sterowania
• Biblioteki -
gotowe programy lub fragmenty programów,
wykonujących standardowe operacje (np. mnożenie,
dzielenie liczb, we-wy, itp..)
• Symulator -
symuluje zachowanie się systemu podczas
wykonania programu (tańsze i wygodniejsze niż
debugger)
• Debugger -
umożliwia kontrolowane wykonywanie
programu przez system, na przykład krok po kroku, w
celu obserwacji zgodności działania programu z
zamiarem jego autora
Programy wspomagające projektowanie
Funkcje narzędzi systemowych
Program
źródłowy
asembler
Kod
wynikowy
Loader
Kod wykonywalny
Konsoli-
dator
• Zależność od procesora
– różne formaty instrukcji, różne rozkazy
symulator
debugger
sprzęt
Asembler
Narzędzia programowania systemowego
Język asemblera
• Niskopoziomowy język
programowania związany
z konkretnym procesorem
ściśle odpowiadający
zestawowi instrukcji
języka maszynowego
• Każda instrukcja ASM
odpowiada dokładnie
jednej instrukcji ML
Porównanie HLL i ASM
Typ
zastosowań
HLL
ASM
Oprogramowanie
ogólnego
przeznaczenia na
jedną platformę
komputerową
Struktury
formalne języków
ułatwiają
zorganizowanie
programu
Brak struktur
formalnych
Oprogramowanie
ogólnego
przeznaczenia na
wiele platform
komputerowych
Przenośne
Trudne do
wykonania
Porównanie HLL i ASM
Typ
zastosowań
HLL
ASM
Sterownik
urządzenia
Złożone techniki
programowania
Dostęp do
hardware’u
bezpośredni i
prosty
Systemy
wbudowane i gry
wymagające
bezpośredniego
dostępu do
urządzeń
Dają w wyniku
zbyt długie
programy
maszynowe;
mogą być
nieefektywne
Idealny,
ponieważ
program
maszynowy jest
krótki i może być
wykonywany
szybko
Cechy programów w ASM
• Zwiększenie szybkości aplikacji
– bezpośredni dostęp do hardware’u (np.:
bezpośredni dostęp do portów zamiast
wywołania systemowego)
– dobry program ASM jest szybszy i zajmuje
mniej miejsca (krytyczne fragmenty programu
w ASM)
• Ograniczenia
– Bardzo szybkie i zwarte lecz przystosowane
tylko do jednego typu procesora
;zaczynam pisać program
ORG
0000H
;rozmieść program od adresu 0
DANE
EQU
10H
;przypisz nazwie DANE wartość 10 heks
START:
MOV A, #DANE
;wpisz dane do rejestru A
JMP
START
;skok do linii oznaczonej etykietą START
Przykładowy program w ASM
Formalizm języka asemblera
Język asemblera
-
sposób przedstawiania programu
tak, aby
był on zrozumiały dla asemblera (bliski
językowi maszynowemu – mały nakład pracy przy
tłumaczeniu)
Język asemblera
jest
strukturą sformalizowaną.
Rządzą nim:
reguły leksykalne (znaczeniowe)
reguły składni
W języku asemblera:
-
program składa się z oddzielnych wierszy
-
w jednym wierszu umieszcza się jedno polecenie
- instrukcja mikroprocesora
- dyrektywa asemblera
- opcjonalnie komentarz.
Formalna składnia języka asemblera
Formalizm języka asemblera
Formalizm języka asemblera
Asembler typowo
rozróżnia jednostki leksykalne :
- program
- wiersz
- instrukcja
- operand
<program> ::= <wiersz> <koniec pliku > | <wiersz> <program>
-
program jest ciągiem 1 lub wielu wierszy
<wiersz> ::= <definicja> | <dyrektywa> | <polecenie> | <komentarz>
-
wiersz zawiera definicję, polecenie lub komentarz
<definicja> ::= <symbol >
=
<operand> <komentarz>
-
definicja jest symbolem po którym następuje znak przypisania oraz
operand
<polecenie> ::= <etykieta> <instrukcja> <komentarz> | <instrukcja>
<komentarz> | <komentarz>
-
etykieta i instrukcja są w poleceniu opcjonalne
<etykieta> ::= <symbol> :
-
etykieta jest symbolem po którym umieszczono dwukropek
<instrukcja> ::= <rozkaz> <operand> | <rozkaz>
- operand jest opcjonalny w instrukcji
Formalizm języka asemblera
<komentarz> ::=
;
<tekst> <koniec linii> | <koniec linii>
-
komentarz przed końcem linii jest opcjonalny
<rozkaz> ::= ADD | ADDC | SUB | SUBC | ... | DJNZ
-
rozkazami są: ADD,ADDC,SUB,SUBC,...,DJNZ (
mnemoniki
)
<dyrektywa> ::= DB | ... | ORG
-
dyrektywami są: DB,...,ORG
<operand> ::= <symbol > | <liczba>
-
operand jest symbolem lub liczbą
<tekst>::= <znak alfanumeryczny> ... <znak alfanumeryczny>
<symbol>::= <litera> <znak alfanumeryczny> ...<znak alfanumeryczny>
<znak alfanumeryczny>::=<litera> | <cyfra>
<liczba>::=<cyfra> | <cyfra>
Formalizm języka asemblera
Mnemoniki rozkazów
Mnemonik
+ wskaźnik (wskaźniki) trybu adresowania i
predefiniowane nazwy rejestrów
rozpoznanie instrukcji
procesora (kod instrukcji)
Mnemoniki w przykładowym języku asemblera:
Mnemonik
Opis
LJMP
skocz do adresu podanego w polu argumentów
instrukcji
CPL
neguj bit, którego adres podano w argumencie
MOV
prześlij argument źródłowy do lokalizacji argumentu
przeznaczenia
Mnemonik
Opis
LCALL
wywołaj procedurę, której adres podano w
argumencie
SJMP
skocz do adresu wyznaczonego na podstawie stanu
licznika rozkazów i przesunięcia zawartego w
argumencie
DJNZ
zmniejsz o jeden stan rejestru lub komórki pamięci,
a następnie skocz, jeżeli wynik zmniejszenia jest
różny od zera
RET
wróć z podprogramu
Mnemoniki rozkazów
Tryb adresowania
Wskaźniki trybu adresowania
-
identyfikują tryb adresowania
- zwykle jednoznakowe symbole umieszczone przed
lub po argumencie
W przykładowym języku asemblera:
wskaźnik
Opis
#
adresowanie natychmiastowe
@
adresowanie pośrednie
adresowanie bezpośrednie
Dyrektywy asemblera
Dyrektywy asemblera
• nie odpowiadają instrukcjom ML
• nie są tłumaczone na ML
• służą do sterowania pracą asemblera.
• posiadają przypisane zwykle kilkuznakowe
symbole
-
ORG,
-
ABS, REL
-
IF, ENDIF
-
DB, DW
Dyrektywy asemblera
Dyrektywy między innymi służą do:
• nadawania adresu początkowego kodowi
maszynowemu linii programu
• oznaczenia początku segmentu, który ma być
tłumaczony na postać relokowalną
• sterowania wykonaniem asemblacji
• zarezerwowania obszaru w pamięci i przypisaniu
wartości poszczególnym bajtom
;zaczynam pisać program
ORG
0000H
;rozmieść program od adresu 0
DANE
EQU
10H
;przypisz nazwie DANE wartość 10 heks
START:
MOV A, #DANE
;wpisz dane do rejestru A
JMP
START
;skok do linii oznaczonej etykietą START
Ilustracja elementów składowych programu
dyrektywa inicjalizacji adresu instrukcji
d
yrektywa przypisania wartości
etykieta
mnemonik
komentarz
Realizacja funkcji asemblera (programu
tłumaczącego)
• Zamienić mnemoniki kodów operacji na odpowiedniki
w języku maszynowym
• Zamienić symboliczne operandy na odpowiadające im
adresy ich lokalizacji w komputerze
• Zbudować instrukcje maszynowe we właściwym
formacie
• Zamienić stałe na ich wewnętrzne reprezentacje
maszynowe
• Utworzyć program wynikowy i listing
Funkcje asemblera
Zasada działania asemblera
Asembler pobiera plik źródłowy i zamienia umieszczony tam
tekst (w jęz. asemblera) na ciąg binarnych rozkazów
maszynowych (język maszynowy).
Produktem asemblera są :
- plik wynikowy (zwykle z rozszerzeniem .OBJ lub .HEX)
- plik listingu programu (rozszerzenie .LST).
Plik wynikowy zawiera program w języku maszynowym
zapisany w formacie odpowiednim do dalszego
przetwarzania przez inne programy narzędziowe.
asemblacja
listing
Program w języku
asemblera
Plik wynikowy
Funkcje
asemblera
1 0097 LED
EQU 97H
2 0000: 02 01 00
LJMP
START
3 0100:
ORG 100H
4 0100: B2 97 START: CPL LED
5 0102: 74 0A
MOV A,#10
6 0104: 12 01 09
LCALL DELAY
7 0107: 80 F7
SJMP START
8 0109: 78 FF DELAY: MOV R0,#0FFH
9 010B: D8 FE LOOP:
DJNZ R0, LOOP
10 010D: D5 E0 F9
DJNZ ACC, DELAY
11 0110: 22
RET
Zawartość pliku listingu przykładowego programu
Proces tłumaczenia programu. Zadania.
1.
Analiza leksykalna.
2.
Analiza syntaktyczna (składniowa).
3.
Określenie ilości bajtów zajmowanych przez kod każdej
instrukcji.
4.
Przypisanie instrukcjom odpowiadających im kodów.
a)
tłumaczenie rozkazu na kod maszynowy,
b)
przypisanie wartości stałym,
c)
przypisanie wartości adresom.
5.
Określenie miejsca w pamięci, w którym ma być umieszczony
uzyskany kod maszynowy.
LED EQU
97H
LJMP START
ORG 100H
START: CPL LED
MOV
A,#10
LCALL DELAY
SJMP
START
DELAY: MOV
R0,#0FFH
LOOP: DJNZ
R0, LOOP
DJNZ
ACC, DELAY
RET
Program w przykładowym języku asemblera.
Wiersz
Etykieta/symbol
Mnemonik/dyrektywa
wsk
Arg #1
Arg #2
1
LED
EQU
97H
2
LJMP
START
3
ORG
100H
4
START:
CPL
LED
5
MOV A,
#
10
6
LCALL
DELAY
7
SJMP
START
8
DELAY:
MOV R0,
#
0FFH
9
LOOP:
DJNZ R0,
LOOP
10
DJNZ
ACC,
DELAY
11
RET
Wsk: wskaźnik adresowania
Wyodrębnienie składowych przykładowego programu.
Mnemonik operacji
Liczba bajtów
kod
LJMP
3
02 aa aa
CPL
2
B2 a1
MOV A
2
74 cc
LCALL
3
12 aa aa
SJMP
2
80 aw
DJNZ R0
2
D8 aw
DJNZ
<komórka>
3
D5 a1 aw
RET
1
22
Uwagi:
aa aa
-
dwubajtowy adres bezwzględny, pierwszy najbardziej znaczący bajt
a1
-
jednobajtowy adres bezwzględny
aw
-
jednobajtowy adres względny
cc
-
jednobajtowa stała
<komórka>
-
predefiniowana nazwa komórki lub jednobajtowy adres bezwzględny
Kody maszynowe instrukcji procesora niezbędne do zakodowania
przykładowego programu.
T
a
b
e
la
k
o
d
ó
w
i
n
s
tr
u
k
c
ji
•
02
LJMP
START
•
aa
•
aa
•
B2
START: CPL
LED
•
a1
•
74
MOV
A,#10
•
cc
•
12
LCALL DELAY
•
aa
•
aa
•
80
SJMP
START
•
aw
•
78 DELAY: MOV R0,#0FFH
•
cc
•
D8 LOOP:
DJNZ
R0, LOOP
•
aw
•
D5
DJNZ
ACC, DELAY
•
a1
•
aw
•
22
RET
Częściowe tłumaczenie na język maszynowy przykładowego programu.
LC=0000
LC=0100
LC=0102
LC=0104
LC=0107
LC=0109
LC=010B
LC=010D
LC=0110
Symbol
l. Bajtów
Bajt #1
Bajt #2
LED
1
97
-
START
2
01
00
DELAY
2
01
09
LOOP
2
01
0B
Kompletna tablica symboli dla przykładowego programu.
T
a
b
e
la
s
y
m
b
o
li
•
02
LJMP
START
•
aa
•
aa
•
B2
START: CPL
LED
•
97
•
74
MOV
A,#10
•
0A
•
12
LCALL DELAY
•
aa
•
aa
•
80
SJMP
START
•
F7
•
78 DELAY: MOV R0,#0FFH
•
FF
•
D8 LOOP:
DJNZ
R0, LOOP
•
FE
•
D5
DJNZ
ACC, DELAY
•
E0
•
F9
•
22
RET
Dodatkowe tłumaczenie przykładowego programu z podstawieniem wartości
stałych i wartości przesunięć względnych.
LC=0000
LC=0100
LC=0102
LC=0104
LC=0107
LC=0109
LC=010B
LC=010D
LC=0110
•
02
LJMP
START
•
01
•
00
•
B2
START: CPL
LED
•
97
•
74
MOV
A,#10
•
0A
•
12
LCALL DELAY
•
01
•
09
•
80
SJMP
START
•
F7
•
78 DELAY: MOV R0,#0FFH
•
FF
•
D8 LOOP:
DJNZ
R0, LOOP
•
FE
•
D5
DJNZ
ACC, DELAY
•
E0
•
F9
•
22
RET
Finalne tłumaczenie przykładowego programu z podstawieniem wartości stałych,
przesunięć względnych i adresów.
LC=0000
LC=0100
LC=0102
LC=0104
LC=0107
LC=0109
LC=010B
LC=010D
LC=0110
1 0097 LED
EQU 97H
2 0000: 02 01 00
LJMP
START
3 0100:
ORG 100H
4 0100: B2 97 START: CPL LED
5 0102: 74 0A
MOV A,#10
6 0104: 12 01 09
LCALL DELAY
7 0107: 80 F7
SJMP START
8 0109: 78 FF DELAY: MOV R0,#0FFH
9 010B: D8 FE LOOP:
DJNZ R0, LOOP
10 010D: D5 E0 F9
DJNZ ACC, DELAY
11 0110: 22
RET
Zawartość pliku listingu przykładowego programu
Problem odwołań w przód
• Odwołanie w przód: do etykiety, która zdefiniowana jest w
dalszej części programu
1 0097 LED
EQU 97H
2 0000: 02 01 00
LJMP
START
3 0100:
ORG 100H
4 0100: B2 97 START: CPL LED
……………………….
SYMTAB
xxx
yyy
LED 97H
1
2
START ???
4
97H
Schemat blokowy działania prostego asemblera jednoprzejściowego cz 1.
Next
LC
0
W 1 kolumnie nazwa
Występuje w
tablicy symboli
Błąd
STOP
Wpisz do tablicy
Druga kolumna
W tablicy symboli
przypisz symbolowi
wartość E90
W tablicy symboli przypisz
symbolowi
wartość
Licznika
FIN
START
T
T
T
N
N
N
II ga kolumna
symbol lub liczba?
Schemat blokowy działania prostego asemblera jednoprzejściowego cz.2.
W 2 kolumnie
Dyrektywa
B
łąd
STOP
Wpisz do Licznika
Lokalizacji warto
ść
wyst
ępującą za
dyrektyw
ą ORG
Format instrukcji
zgodny z jednym z
dopuszczalnych
Określ typ
adresowania
Błąd
STOP
Do pliku wynikowego
wpisz kod instrukcji
określony na podstawie...
LC
LC+1
NEXT
N
N
N
T
T
N
FIN
Asembler dwuprzejściowy
A) etap zapisywania tablicy symboli
(odwołań)
pierwsze
przejście
B) etap generacji kodu
drugie
przejście
ad A) Pierwsze
przejście: dla każdego wiersza:
1.
sprawdzenie
składni.
Jeżeli
napotkano
błędy,
odpowiednia informacja wpisywana jest do pliku listingu
(rozszerzenie .LST).
2.
przydzielenie
pamięci niezbędnej dla kodu programu
(alokacja)
3.
jeżeli w pierwszym przejściu wykryto błędy składni
kończy pracę.
Asembler dwuprzejściowy
Ad B)
“obraz” bajtów, które będą załadowane pod poszczególne
adresy w
pamięci operacyjnej (nadanie wartości) .
1.
Dla
każdej linii tworzy odpowiadający jej
finalny
kod.
2.
Rezultat jest zapisywany do pliku listingu (dla analizy
przez
programistę).
3.
Kod programu zostaje zapisany do pliku wynikowego
(.OBJ lub .HEX),
jeżeli nie wystąpiły błędy = koniec
przetwarzanie pliku
źródłowego.
Przejście 1
Przejście 2
Plik
przejściowy
Plik
wynikowy
Program
źródłowy
OPTAB
SYMTAB
SYMTAB
• Tablica kodów instrukcji (OPTAB)
• Tablica symboli (SYMTAB)
• Licznik lokalizacji (LC)
Struktury danych asemblera
Główne składowe i główne operacje asemblera