You are on page 1of 19

Programowanie niskopoziomowe

Moduł 2

Proces tworzenia programu


1

2 - Proces tworzenia programu 1


Programowanie niskopoziomowe

Plan prezentacji


Etapy tworzenia programu

Postać pośrednia

Łączenie

Biblioteki

2 - Proces tworzenia programu 2


Programowanie niskopoziomowe

Etapy tworzenia programu


Kompilacja

kompilator zamienia zapis w języku wysokiego poziomu na zapis
asemblerowy lub od razu na postać pośrednią

każdemu plikowi źródłowemu odpowiada oddzielny plik wynikowy

Asemblacja

plik źródłowy napisany przez programistę w języku asemblera lub
wygenerowany przez kompilator jest zamieniany przez asembler na
postać pośrednią (object file)

każdemu plikowi źródłowemu odpowiada oddzielny plik w postaci 3
pośredniej

Łączenie

konsolidator łączy pliki pośrednie i pliki bibliotek tworząc postać
wykonywalną, zawierającą zapis binarny programu i danych,
ładowany do pamięci komputera

2 - Proces tworzenia programu 3


Programowanie niskopoziomowe

Przykład – DOS/Microsoft C


Wywołanie: “cl hello.c”

Program “cl” jest powłoką kompilatora – programem wywołującym
inne programy potrzebne do zamiany postaci źródłowej na
wykonywalną

Etapy:

cl wywołuje kompilator

kompilator generuje postać pośrednią – plik hello.obj

cl wywołuje konsolidator “link” z odpowiednimi argumentami
4

link łączy plik hello.obj z biblioteką języka c

biblioteka zawiera moduł startowy crt0 oraz funkcje standardowe, np.
printf, scanf itp.

moduł crt0 zawiera kod odpowiedzialny za przygotowanie środowiska dla
funkcji main i wywołanie funkcji main z odpowiednimi argumentami (argc,
argv)

Powstaje plik hello.exe – postać wykonywalna programu

2 - Proces tworzenia programu 4


Programowanie niskopoziomowe

Przykład - Linux/GCC


cc jest powłoką (tzw. driverem) kompilatora

cc wywołuje kompilator, asembler i konsolidator przekazując im
odpowiednie argumenty

wywołanie “cc -o hello hello.c”

“-o hello” określa nazwę pliku wykonywalnego (bez tej opcji plik
nazywałby się a.out)

cc wywołuje kompilator, który tworzy strumień (plik) asemblerowy

cc wywołuje asembler, który tworzy plik pośredni hello.o
5

cc wywołuje konsolidator ld, który tworzy plik hello używając modułu
crt0.o, hello.o i biblioteki standardowej języka C

powstaje plik wykonywalny o nazwie “hello”

2 - Proces tworzenia programu 5


Programowanie niskopoziomowe

Przykład - Windows


Przebieg kompilacji jak w przykładzie dla DOS

System Windows używa tzw. bibliotek dynamicznych

postać wykonywalna programu nie jest kompletna

zamiast funkcji standardowych postać wykonywalna programu
zawiera informacje o sposobie dołączenia tych funkcji

dołączenie funkcji następuje podczas ładowania programu do pamięci

dzięki temu wiele programów może korzystać z jednej, wspólnej kopii
biblioteki

daje to redukcję zajętości pamięci 6

Podobny mechanizm jest dostępny w systemach rodziny Unix (w
tym również Linux)

2 - Proces tworzenia programu 6


Programowanie niskopoziomowe

Przykłady - podsumowanie


Postać wykonywalna powstaje przez połączenie modułów w
postaci pośredniej

Moduły te mogą powstać przez kompilację (asemblację) postaci
źródłowych pisanych w językach wysokiego poziomu lub
asemblerze

Wiele kompilatorów (w tym GCC) generuje jawnie postać
asemblerową, która jest następnie translowana przez asembler
do postaci pośredniej 7

Konsolidator nie wie, w jakim języku był oryginalnie napisany
łączony moduł

Biblioteki zawierają gotowe do użycia moduły (w zmodyfikowanej
postaci pośredniej), wcześniej skompilowane

np. funkcje biblioteki standardowej danego języka programowania

2 - Proces tworzenia programu 7


Programowanie niskopoziomowe

Kompilacja


Kompilator języka wysokiego poziomu tworzy postać
asemblerową każdego kompilowanego modułu programu

postać ta podlega następnie asemblacji

niektóre kompilatory (np. Microsoft C) tworzą od razu postać
pośrednią, gotową do konsolidacji

2 - Proces tworzenia programu 8


Programowanie niskopoziomowe

Kompilacja – przykład x86


Microsoft C (Visual studio)

Otworzyć x86 command prompt z menu Visual Studio Tools

cl -Fa mysource.c

Tworzy plik mysource.asm

Gnu CC

cc -m32 -S mysource.c

Tworzy plik mysource.s
9

2 - Proces tworzenia programu 9


Programowanie niskopoziomowe

Asemblacja


Asemblacja – to inaczej kompilacja postaci asemblerowej
programu do postaci pośredniej (lub wykonywalnej)

Postać asemblerowa może być stworzona przez programistę lub
może być wynikiem działania kompilatora języka wysokiego
poziomu

10

2 - Proces tworzenia programu 10


Programowanie niskopoziomowe

Postać pośrednia


Postać pośrednia zawiera binarny kod wykonywalny, w którym
część odwołań (np. do zmiennych i procedur) może być
niezdefiniowana

Typowy program składa się z wielu modułów powiązanych ze
sobą

moduł może korzystać z funkcji i zmiennych zdefiniowanych w innych
modułach

Postać pośrednia zawiera opis zewnętrznych odwołań modułu i 11
opis symboli (np. etykiet i nazw zmiennych) udostępnianych
przez moduł na zewnątrz

wiązanie obiektów następuje poprzez ich nazwy

Plik pośrednie noszą zwykle rozszerzenie nazwy .o (Unix)
lub .obj (Windows)

2 - Proces tworzenia programu 11


Programowanie niskopoziomowe

Konsolidacja


Konsolidacja polega na realizacji odwołań do symboli
zewnętrznych poprzez związanie tych odwołań z symbolami
udostępnianymi przez moduły, w których je zdefiniowano

Wiązanie symboli jest możliwe tylko wtedy, gdy występują one w
postaci pośredniej jako zewnętrzne i publiczne

W wyniku konsolidacji powstaje postać wykonywalna programu,
w której wszystkie odwołania są zrealizowane

nie dotyczy to odwołań do bibliotek dynamicznych, które podlegają 12
konsolidacji w trakcie ładowania programu do pamięci

Niemożność zrealizowania odwołań powoduje błąd konsolidacji

np. przy braku definicji funkcji lub danej, z której korzysta jakiś moduł

Błąd konsolidacji występuje również przy napotkaniu więcej niż
jednej zwykłej definicji symbolu o tej samej nazwie

2 - Proces tworzenia programu 12


Programowanie niskopoziomowe

Symbole zewnętrzne


Symbole zewnętrzne są to symbole zdefiniowane w innych
modułach, z których korzysta dany moduł

W module korzystającym z symboli zewnętrznych muszą one być
zadeklarowane jako zewnętrzne w sposób specyficzny dla
użytego języka programowania, np.

język C:
 słowo kluczowe extern przy deklaracji danych

funkcje niezdefiniowane w danym pliku źródłowym są domyślnie
traktowane jako zewnętrzne 13

asembler

wymagana jawna deklaracja symbolu jako zewnętrznego – słowo
kluczowe extern lub extrn

2 - Proces tworzenia programu 13


Programowanie niskopoziomowe

Symbole publiczne i prywatne


Symbole publiczne – to symbole, z których mogą korzystać inne
moduły

Symbole publiczne są deklarowane jako publiczne w sposób
specyficzny dla języka programowania

język C:

każdy symbol na poziomie zewnętrznym jest traktowany jako publiczny, o
ile nie jest zadeklarowany ze słowem kluczowym static

asembler:

wymagana jawna deklaracja określająca symbol jako publiczny – słowo 14
kluczowe public lub global/globl

Symbole prywatne są widoczne tylko w module, w którym zostały
zdefiniowane

Każdy symbol niepubliczny jest symbolem prywatnym

W innych modułach programu mogą istnieć inne symbole prywatne
lub publiczne o takiej samej nazwie

2 - Proces tworzenia programu 14


Programowanie niskopoziomowe

Symbole zewnętrzne i publiczne – przykład (DOS)

; moduł pierwszy.asm --------------------------------------------


section .text ; otwarcie sekcji kodu
extern say_hello ; symbol jest zdefiniowany w innym
module
start:
call say_hello
mov ax, 0x4c00 ; funkcja exit (0x4c), kod powrotu 0
int 0x21 ; wywołanie systemu
;----------------------------------------------------------------
; moduł drugi.asm -----------------------------------------------
section .text ; otwarcie sekcji kodu
global say_hello ; symbol będzie dostępny na zewnątrz
15
say_hello:
mov ah, 9 ; funkcja wypisywania łańcucha
mov dx, hello ; adres łańcucha
int 0x21 ; wywołanie systemu
ret

section .data
hello: db "Hello, world!", 13, 10, '$'
;-----------------------------------------------------------------

2 - Proces tworzenia programu 15


Programowanie niskopoziomowe

Program jednomodułowy


Bardzo proste programy pisane w języku asemblera mogą
składać się z jednego modułu i nie zawierać odwołań do żadnych
symboli zewnętrznych

Konsolidacja takich programów sprowadza się do
wygenerowania postaci wykonywalnej z postaci pośredniej i nie
wymaga przeprowadzenia wiązania symboli

Niektóre asemblery mogą bezpośrednio generować postać
wynikową programów jednomodułowych, z pominięciem postaci 16
pośredniej (np. NASM)

2 - Proces tworzenia programu 16


Programowanie niskopoziomowe

Program jednomodułowy – przykład (DOS)

; program w najprostszej postaci binarnej - .COM


; musi się rozpoczynać od adresu 0x100 w sekcji kodu
; dane znajdują się w sekcji kodu – jest to jedyna sekcja pamięci

section .text ; otwarcie sekcji kodu

org 0x100
start:
mov ah, 9 ; funkcja wypisywania łańcucha
mov dx, hello ; adres łańcucha
int 0x21 ; wywołanie systemu
17
mov ax, 0x4c00 ; funkcja exit (0x4c), kod powrotu 0
int 0x21 ; wywołanie systemu

hello: db "Hello, world!", 13, 10, '$'


; 13, 10 - kod końca wiersza - CR, LF
; łańcuch dla funkcji 9 musi być zakończony znakiem '$'

2 - Proces tworzenia programu 17


Programowanie niskopoziomowe

Biblioteki


Biblioteka – to kolekcja gotowych modułów w postaci pośredniej,
które mogą być łączone z innymi modułami tworzonymi przez
programistę

Plik biblioteki zawiera postaci pośrednie wielu modułów

Biblioteki zawierające funkcje standardowe dla danego języka
programowania są zwykle dostarczane wraz z kompilatorami

są one niezbędne do utworzenia działającego programu

Programista może tworzyć własne biblioteki, z których może 18
następnie korzystać w innych programach

2 - Proces tworzenia programu 18


Programowanie niskopoziomowe

Konsolidacja z biblioteką


Konsolidator wybiera z biblioteki i łączy tylko te moduły, w których
są zdefiniowane symbole zadeklarowane jako zewnętrzne
w bazowych modułach pośrednich

Wybrane z biblioteki moduły mogą zawierać odwołania do
symboli zewnętrznych zdefiniowanych w innych modułach
bibliotecznych

Wybieranie i łączenie modułów następuje aż do zrealizowania
wszystkich odwołań 19

2 - Proces tworzenia programu 19

You might also like