Wymagania proceduralnych języków wysokiego poziomu ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH modele programowe procesorów ASK MP.01 c Dr inż. Ignacy Pardyka UNIWERSYTET JANA KOCHANOWSKIEGO w Kielcach Rok akad. 2011/2012 1 Wymagania proceduralnych języków wysokiego poziomu 2 Pamięć i procesor 3 I II podzbiór x86 4 Literatura c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 1 / 24 c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 2 / 24 Wymagania proceduralnych języków wysokiego poziomu Wymagania proceduralnych języków wysokiego poziomu lata 60. XX w.: Algol Fortran lata 80. XX w.: rozwój języków proceduralnych: Pascal, C obecnie: języki obiektowe: C++, C#, Java, Eiffel,... struktura komputera zaprojektowana, by łatwo i wydajnie wykonywać programy tłumaczone z języka wysokiego pozimu na język natywny procesora int x, y; // zmienne globalne char * p; int myadd(int a, int b){ int r; // zmienna lokalna r = a + b; return r;} void cleanup(void){ free(p);} // dealokacja zmiennej dynamicznej int main (void){ p = malloc(1000); x = myadd(20,3); cleanup();} // alokacja // dealokacja c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 3 / 24 c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 4 / 24
Pamięć i procesor Pamięć i procesor 1 Wymagania proceduralnych języków wysokiego poziomu 2 Pamięć i procesor 3 I II podzbiór x86 4 Literatura - sekcje Kod programu (TEXT) Dane statyczne stałe zmienne zainicjalizowane zmienne niezainicjalizowane (BSS) Dane dynamiczne automatyczne argumenty wywołania procedur zmienne lokalne procedur umieszczane na stosie Dane dynamiczne kontrolowane jawnie tworzone i usuwane umieszczane na stercie Kod współdzielony Dane współdzielone c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 5 / 24 c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 6 / 24 PC Pamięć i procesor 1 Wymagania proceduralnych języków wysokiego poziomu rejestr przechowujący adres instrukcji, która ma być (jako następna) pobrana z pamięci celem wykonania nextpc adres w obrębie sekcji kodu programu inkrementowany po pobraniu i zdekodowaniu instrukcji w ramach wykonywania instrukcji skoku ładowany nową wartością adresu docelowego skoku niezbędny w maszynie von Neumanna 2 Pamięć i procesor 3 I II podzbiór x86 4 Literatura c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 7 / 24 c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 8 / 24
wywołanie procedury za pomocą instrukcji skoku ze śladem zapamiętuje wartość nextpc (na stosie) do PC wpisuje adres procedury powrót z procedury za pomocą instrukcji return zdejmuje ze stosu adres powrotny do PC wpisuje adres powrotny stos przechowuje argumenty wywołań adres powrotny zmienne lokalne inne informacje przechowywane w trakcie wykonywania procedury rejestry PC licznik rozkazów A akumulator stos (abstrakcyjny) dostęp do danych za pośrednictwem nazw lub wartości model wysoce nierealistyczny! c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 9 / 24 c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 10 / 24 Lista instrukcji procesora I Kompilacja dla procesora I load data A = data store data data = A do pamięci add data A += data push data data na stos pop data zdjęcie ze stosu call addr push PC, PC = addr skok ze śladem return pop PC powrót po śladzie create data alokacja miejsca na stosie destroy data usuwanie ze stosu konwencja języka C argumenty funkcji w kolejności odwrotnej argument na stos za pomocą instrukcji PUSH po zapamiętaniu argumentów funkcji na stosie wywołanie funkcji za pomocą CALL adres powrotny na stosie (adres instrukcji występującej jako następna za CALL) ostatnią instrukcją funkcji musi być RETURN c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 11 / 24 c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 12 / 24
Rezultat kompilacji wywołania funkcji Kompilacja funkcji ; x = myadd(20,3); push 3 push 20 call myadd destroy destroy store x alokacja zmiennych lokalnych dostęp do danych przez nazwy (taki model!) wartość funkcji zwracana przez rejestr A przed zakończeniem podprogramu deallokacja zmiennych lokalnych powrót za pomocą RETURN c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 13 / 24 c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 14 / 24 I Rezultat kompilacji funkcji I ; prolog ; int r; create r ; ciało ; r = a + b; load a add b store r ; return r; load r ; epilog destroy r return c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 15 / 24 model procesora I wzbogacony o implementację stosu w pamięci dodatkowy rejestr wskaźnika stosu: SP (ang. stack pointer) SP zawiera adres danej ostatnio umieszczonej w pamięci stos pełny schodzący (ang. full descending) rośnie w kierunku malejących adresów operacje na stosie jawnie zdefiniowane w postaci odrębnych instrukcji interpretowanych przez procesor PUSH umieszcza dane na stosie wstępnie dekrementując SP POP zdejmuje dane ze stosu a następnie inkrementuje SP dostęp do parametrów i zmiennych poprzez nazwy koncepcja trudna do implementacji! c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 16 / 24
I Lista instrukcji procesora II procedury load data A = data store data data = A do pamięci add data A += data push data *--SP = data data na stos pop data data = *SP++ zdjęcie ze stosu call addr *--SP = PC, PC = addr skok ze śladem return PC = *SP++ powrót po śladzie create data SP -= sizeof(data) alokacja miejsca na stosie destroy data SP += sizeof(data) usuwanie ze stosu Translacja przykładowego programu identyczna jak w modelu I rozwiązanie problemu dostępu do zmiennych na stosie procedura posługuje się niewielkim fragmentem stosu po przekazaniu sterowania do procedury na stosie znajduje się rekord aktywacji procedury: parametry wywołania ślad powrotu procedura może tworzyć swoje zmienne lokalne umieszczając je na stosie ramka stosu (ang. stack frame) rekord aktywacji procedury zmienne lokalne inne wartości odkładane na stosie w trakcie realizacji procedury c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 17 / 24 c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 18 / 24 Wskaźnik ramki stosu II podzbiór x86 II podzbiór x86 dodatkowy rejestr procesora FP (ang. frame pointer) wskazuje ramkę bieżącej procedury zawartość FP stała w trakcie wykonywania procedury wywołana procedura musi ustalić zawartość FP zachować poprzednią zawartość FP na stosie wpisać do FP adres aktualnej ramki stosu FP = SP przed instrukcją RETURN procedura odtwarza uprzednią wartość FP w trakcie wykonywania procedury dane umieszczone w ramce stosu są adresowane względem FP akumulator / rejestr wartości: EAX rejestr wskaźnika stosu: ESP wskaźnik ramki: EBP licznik instrukcji: EIP instrukcje (w większości) dwuargumentowe pierwszy argument: docelowy następne: źródłowe dostępne adresowanie rejestrowe pośrednie z przemieszczeniem adres danej jest sumą zawartości rejestru i stałej ze znakiem np. [EBP+4] zawartość komórki pamięci c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 19 / 24 c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 20 / 24
Lista instrukcji procesora III II podzbiór x86 Rezultat kompilacji wywołania funkcji II podzbiór x86 mov d,s d = s przesłanie danych mov EAX,d EAX = d mov d,eax d = EAX add EAX,d EAX += d push d *--ESP = d d na stos pop d d = *ESP++ zdjęcie ze stosu call addr *--ESP = EIP, EIP = addr skok ze śladem ret EIP = *ESP++ powrót po śladzie sub ESP,size ESP -= size alokacja miejsca na stosie add ESP,size ESP += size usuwanie ze stosu ; x = myadd(20,3); push 3 push 20 call myadd add esp, 8 mov [x], eax c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 21 / 24 c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 22 / 24 Rezultat kompilacji funkcji II podzbiór x86 Literatura Literatura ; prolog push ebp mov ebp, esp ; int r; sub esp,4 ; ciało ; r = a + b; mov eax, [ebp+8]; add eax, [ebp+12]; mov [ebp-4], eax; ; return r; mov eax, [ebp-4] ; epilog mov esp, ebp pop ebp ret EAX = a EAX += b r = EAX A. S. Tanenbaum, Strukturalna organizacja systemów komputerowych, Helion, 2006. J. Biernat, Architektura komputerów, OWPW, 2005. R. Hyde, Profesjonalne programowanie, Helion, 2005. R. Hyde, Asembler. Sztuka programowania, Helion, 2004. G. Mazur, Programowanie niskopoziomowe, http://wazniak.mimuw.edu.pl. P.A. Carter, PC Assembly Language, http://www.drpaulcarter.com/pcasm/. D.W. Lewis, Między asemblerem a językiem C. Podstawy oprogramowania wbudowanego, RM, 2004. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 23 / 24 c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 24 / 24