Projektowanie programu I
Proces przygotowania programu dla systemu komputerowego
Przebieg procesu projektowania systemu komputerowego
Poziom |
Opis |
Program aplikacyjny |
Oprogramowanie zaprojektowane dla określonego zastosowania |
Język wysokiego poziomu (HLL) |
Programy są kompilowane z HLL na język asemblera lub maszynowy, n.p. C++, Pascal, Java, Visual Basic. |
System operacyjny |
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) |
Stosuje mnemoniki instrukcji bezpośrednio odpowiadające rozkazom języka maszynowego. |
Język Maszynowy (ML) |
Instrukcje numeryczne i operandy które mogą być umieszczone w pamięci komputera i bezpośrednio wykonywane przez procesor. |
1. Oprogramowanie systemowe:
asemblery, loader-y i konsolidatory, makroasemblery, kompilatory, systemy operacyjne, systemy baz danych, edytory tekstu, interaktywne debuggery.
2. Różnica pomiędzy programowaniem
aplikacyjnym a programowaniem systemowym
Funkcje narzędzi
Program
źródłowy
• Zależność od procesora
- różne formaty instrukcji, różne rozkazy
Narzędzia wspomagające poszczególne etapy procesu projektowania
• Programy komputerowe
- kompilator
k — asembler (ew. makroasembler)
\\ konsolidator („ linker” - program łączący) y\loader (program ładujący)
• Urządzenia pomiarowe (testujące)
\ - wspomaganie projektowania
\ - weryfikacja drogą symulacji
\ Posługują się dobrze zrozumiałą dla człowieka symboliką.
•Elementami wspomagającymi programowanie -biblioteki gotowych programów, O.S. -debugger -symulator
• Biblioteki - gotowe programy lub fragmenty programów, wykonujących standardowe operacje (np. mnożenie, dzielenie liczb itp..)
• Debuger - 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.
• Symulator - symuluje zachowanie się systemu podczas wykonania programu (tańsze i wygodniejsze niż debuger).
Urządzenia pomiarowe służą do wspomagania weryfikacji. Najczęściej używane są testery cyfrowe, które umożliwiają wizualizację lub rejestrację stanów logicznych.
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 |
• 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
( ASM ML )
• Poznawanie jak instrukcje HLL są tłumaczone na ML
- Poznawanie szczegółów „ukrytych” w implementacji instrukcji HLL
• Poznawanie architektury komputera
- Bezpośredni dostęp do pamięci, sterownika wideo, karty dźwiękowej, klawiatury...
• 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)
Aplikacje ASM
• Programy aplikacyjne rzadko są w całości pisane w ASM
- tylko krytyczne (ze względu na czas) części pisane są w ASM
° np. (1): procedura interfejsu (wywoływana z programów HLL) dla zapewnienia bezpośredniego dostępu do
hardware5 u
° np. (2): sterowniki urządzeń (wywoływane przez OS)
• ASM często używany do „wbudowanych” programów (zapisanych w PROM))
• urządzenia mobilne do gier, mikrokontrolery (samochody, maszyny przemysłowe...), sprzęt telekomunikacyjny...
• Bardzo szybkie i zwarte lecz przystosowane tylko do jednego typu procesora
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 reguły składni
Asembler typowo rozróżnia jednostki leksykalne (znaczeniowe):
- program,
- wiersz,
- instrukcja,
- operand.
;zaczynam pisać program
ORG 0000H
jrozmieść program od adresu 0
DANE EQU 10H
;przypisz nazwie DANE wartość 10
heksadec.
START: MOV A, #DANE ;wpisz dane do rejestru A
JMP START
;skok do linii oznaczonej etykietąSTART
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.
<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
Mnemonik + wskaźnik (wskaźniki) trybu adresowania i predefiniowane nazwy rejestrów -» rozpoznanie instrukcji procesora (kod instrukcji)
Mnemoniki w przykładowym języku asemblera:
• 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,
• 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
<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
<dyrektywa> ;:= DB |... | ORG
- dyrektywami są: DB,...,ORG
<operand> ::= <symbol > [ <liczba>
- operand jest symbolem lub liczbą
<symbol>::~ <litera> <znak alfanumerycznym ...<znak alfanumerycznym <znak alfanumerycznym::=<literam | <cyfram
Wskaźniki trybu adresowania
- identyfikują tryb adresowania
- są zwykle jednoznakowymi symbolami, które umieszcza się przed, lub po argumencie
W przykładowym języku asemblera:
• znak # umieszczony przed argumentem w skazuje użycie adresowania natychmiastowego (tj. argumentem jest stała występująca po znaku #)
• znak @ umieszczony przed argumentem wskazuje użycie adresowania pośredniego
• brak znaku umieszczonego przed argumentem wskazuje użycie adresowania bezpośredniego
Dyrektywy asemblera nie odpowiadają instrukcjom ML. Nie są tłumaczone na ML. Służą do sterowania pracą asemblera.
Posiadają przypisane zwykle kilkuznakowe symbole. Dyrektywy między innymi służą ao:
• 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
- ORG,
- ABS, REL
- IF, ENDIF
- DB, DW
Funkcje asemblera
• 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
Dyrektywa inicjallzacji |
Dyrektywa | |
adresu |
przypisania | |
instrukcji |
wartości |
komentarz
;zaczy& |
\m pisać prograjfK | |||
ORG |
0000H |
jrozmieść program od adresu 0 | ||
DANE START: |
EQU 10H MOV A, #DANE JMP START |
;przypisz nazwie DANE wartość 10 heksadec. ,’wpisz dane do rejestru A ;skok do linii oznaczonej etykietą START |
Nazwa | |
etykieta |
instrukcji |
Ilustracja elementów składowych programu.
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.
EQU 97H LJMP START ORG 100H CPL LED MOV A,#10 LCALL DELAY S JMPSTART MOV R0,#0FFH DJNZ R0, LOOP DJNZ ACC, DELAY RET
1 0097 LED
2 0000: 02 01 00
3 0100:
4 0100: B2 97 START:
5 0102: 74 0A
6 0104: 12 01 09
7 0107: 80 F7
8 0109: 78 FF DELAY:
9 010B: D8 FE LOOP:
10 010D: D5 E0 F9
11 0110:22
Program wjęzyku asemblera
Funkcje
asemblera
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 |
97 H |
LJMP |
START | |
ORG |
100H | |
START: |
CPL |
LED |
MOV |
A,#10 | |
LCALL |
DELAY | |
SJMP |
START | |
DELAY: |
MOV |
R0,#0FFH |
LOOP: |
DJNZ |
R0, LOOP |
DJNZ RET |
ACC, DELAY |
Program w przykładowym języku asemblera.
Tabela kodów instrukcji
Mnemonik operacji |
Liczba bajtów |
kod |
LJMP |
3 |
02 aa aa |
CPL |
2 |
B2al |
MOV A |
2 |
74 cc |
LCALL |
3 |
12 aa aa |
SJMP |
2 |
80 aw |
DJNZ R0 |
2 |
D8 aw |
DJNZ <komórka> |
3 |
D5 al aw |
RET |
1 |
22 |
Uwagi:
aa aa - dwubajtowy adres absolutny, pierwszy najbardziej znaczący bajt
a1 - Jednobajtowy adres absolutny
aw - jednobajtowy adres względny
cc * jednobajtowa stała
<komórka> - predefiniowana nazwa komórki lub jednobajtowy adres absolutny
Kody maszynowe instrukcji procesora niezbędne do zakodowania przykładowego programu.
Wiersz |
Etykieta/nazwa |
Mnemonik/dyrektywa |
wsk |
Arg U\ |
Arg Ul |
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, |
# |
OFFH | |
9 |
LOOP: |
DJNZ R0, |
LOOP | ||
10 |
DJNZ |
ACC, |
DELAY | ||
11 |
RET |
Wsk: wskaźnik adresowania
Wyodrębnienie składowych przykładowego programu.
lc=oooo r" |
— • 02 LJMP START • aa • aa |
lc=oioo r" |
- • B2 START: CPL LED • al |
LC=0102 n" |
- • 74 MOV A,#10 • cc |
LC=0104 r" |
— • 12 LCALL DELAY • aa • aa |
LC=0107 r" |
- • 80 SJMP START • aw |
LC=0109 r* |
- • 78 DELAY: MOV R0f#0FFH • cc . . . __ |
LC=010B rj |
— • D8 LOOP: DJNZ R0, LOOP • aw |
LC=010D r" |
-• D5 DJNZ ACC, DELAY • al . • _ _ __ _................ |
lc=oi 1 o rT~ ' 22 _________________„________________RET .............................. |
LC=0000
02 |
LJMP |
START | ||
• |
aa | |||
• |
aa | |||
B2 |
START: |
CPL |
LED | |
• |
97 | |||
74 |
MOV |
A,m | ||
• |
OA | |||
12 |
LCALL DELAY | |||
• |
aa | |||
• |
aa | |||
80 |
SJMP |
START | ||
• |
F7 | |||
= |
78 |
DELAY: |
MOV |
RO,#OFFH |
• |
FF | |||
D8 |
LOOP: |
DJNZ |
RO, LOOP | |
• |
FE | |||
D5 |
DJNZ |
A CC, DELAY | ||
• |
EO | |||
• |
F9 | |||
22 |
RET |
"..............-...........1 |
Dodatkowe tłumaczenie przykładowego programu z podstawieniem wartości stałych i wartości przesunięć względnych.
LC=0100
LC=0102
LC=0104
LC=0107
LC=0109
LC=Q10B
L0010D
L00110
lc=oooo r~ |
- 02 LJMP START • 01 • 00 |
lc=oioo |
B2 START: CPL LED • 97 |
LC=0102 |
— 74 MOV A, #10 • OA |
LC=0104 |
— 12 LCALL DELAY • 01 • 09 |
LC=0107 |
— 80 SJMP START • F7 |
LC=0109 r~^ |
^ 78 DELAY: MOV R0,#0FFH • FF |
LC=010B r" |
— D8 LOOP: DJNZ RO, LOOP • FE |
LC=010D |
— D5 DJNZ ACCf DELAY • EO • F9 |
LC=0110 f f“* 22 RET i |
Finalne tłumaczenie przykładowego programu z podstawieniem wartości stałych i wartości przesunięć względnych.
Symbol |
1. Bajtów |
Bajt #1 |
Bajt #2 |
LED |
1 |
97 |
- |
START |
2 |
01 |
00 |
DELAY |
2 |
01 |
09 |
LOOP |
2 |
01 |
IB |
Kompletna tablica symboli dla przykładowego programu.
EQU 97H LJMP START ORG 100H CPL LED MOV A,#10 LCALL DELAY SJMP START MOV R0,#0FFH DJNZ R0, LOOP DJNZ ACC, DELAY RET
1 0097 LED
2 0000: 02 01 00
3 0100:
4 0100: B2 97 START:
5 0102: 74 0A
6 0104: 12 01 09
7 0107: 80 F7
8 0109: 78 FF DELAY:
9 010B: D8 FE LOOP:
10 010D: D5 E0 F9
11 0110:22
Problem odwołań w przód
Odwołanie w przód: do etykiety, która zdefiniowana jest w dalszej części programu
SYMTAB
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ę.
Ad B) “obraz” bajtów, które będą załadowane pod poszczególne adresy w pamięci operacyjnej (nadanie wartości).
1. Ustala położenie poszczególnych bajtów w pamięci. Początkowo asembler przyjmuje domyślną wartość dla licznika lokalizacji (LC).
2. Dla każdej linii tworzy odpowiadający jej kod.
3. Rezultat jest zapisywany do pliku listingu (dla analizy przez programistę).
4. Kod programu zostaje zapisany do pliku wynikowego (.OBJ lub .HEX), jeżeli nie wystąpiły błędy = koniec przetwarzanie pliku źródłowego.
Etapy w procesie przygotowania programu
• Tablica kodów instrukcji (OPTAB)
• Tablica symboli (SYMTAB)
• Licznik lokalizacji (LOCCTR)