+-LAB-ASMPL-by-GustawKIT------Programowanie obiektowe w Asemblerze.--------+ ver. 0.1beta
Idea programowania obiektowego znana jest każdemu programiście zainteresowanym tym tematem więc nie ma potrzeby jej przedstawiać. Doskonale znamy pojęcia obiektu (czy też klasy), dziedziczenia, polimorfizmu, enkapsulacji z języków wyższego poziomu. Okazuje się, że w asemblerze także można programować objektowo, a dzięki Turbo Asemblerowi Borlanda jest to równie łatwe jak w językach wyższego poziomu. W innych kompilatorach np. MASM także można w pewien sposób przygotować kod do typu objektowego zapisu. Postaram się Wam przedstawić możliwości takiego programowania w Turbo Asemblerze. Wybrałem tryb IDEAL, ponieważ oferuje on najwięcej ułatwien w tym temacie.
1. Pola i Metody & Enkapsulacja. 2. Dziedziczenie (Inheritance). 3. Przykład metod statycznych i dziedziczenia. 4. Polimorfizm i metody wirtualne. ________________________________________________________________________________________
1. Pola i Metody & Enkapsulacja.
Pola są to dane w pewnej strukturze (rekordzie), zgrupowane wspólnie w celu łatwego dostępu i organizacji. Przyklad prostej deklaracji struktury w asemblerze:
STRUC Liczby Pierwsza dw ? Druga dw ? ENDS Liczby
Jest to jedynie deklaracja struktury i aby ją wykorzystać musimy zdefiniować zmienną typu takiej struktury:
Skladniki1 Liczby ? - niezainicjalizowane Skladniki2 Liczby < > - zainicjalizowane domyślnie Skaldniki3 Liczby <13,16> - zainicjalizowane wartości
Załóżym teraz, że chcemy tą strukture wykorzystąć np. przez procedure sumująca liczby.
Widzimy wię, że w myśl programowania obiektowego w strukture włącząno definicje metody. Metody definiujemy:
Wskaźnik_metody : typ(rozmiar) = Nazwa metody
co znaczy, że w definicji objektu nie ma samej metody a jedynie wskaźnik do tej procedury a dokładniej dyrektywa METHOD w rzeczwistości tworzy odrębną tabele ze wskaźnikami do poszczególnych metod i nie wchodzi ona w sklad struktury. Tak więc jeżeli chcielibyśmy obliczyć rozmiar struktury TLiczby wystarczy zsumowac rozmiar pol, czyli dw+dw = 4bajty. Taki rozmiar możemy sobie także obliczyc instrukcją 'size' (rozmiar = size TLiczby). Natomiast statyczne adresy (z uwagi na statyczny metody).. tworzone są w specjalnej tabeli. Jeżeli zdeklarujemy metode w definicji obiektu musimy pamiętać o jej implementacji w kodzie programu.
Wykorzystać tak zefiniowany object możemy następująco:
Skladniki1 TLiczby <12,15>
mov si, offset Skladniki1 Call SI METHOD TLiczby:Suma
Do SI ladowany jest adres wartości Skladnik1, teraz w DS:SI mamy adres obiektu TLiczby i przez ten adres odowływuje się CALL do metod objektu. W wywołaniu podajemy także nazwe obiektu i wskaźnik do metody.
Natomiast aby z implementacji metody odwoływać sie do pól czy innych metod obiektu używamy nazwy obiektu lub predefiniowanego wskaźnika @object, który własnie wskazuje na aktualny object.
2. Dziedziczenie (Inheritance).
Jedną z głównych zalet OOP jest dziedzicznie. Polega ona na przekazywaniu metod i pól obiektowi, który tworzony jest na podstawie obiektu przodka. Aby np. do powyższego objektu dodać metode np. odejmowania, moglibyćmy dodać tą metode w definicji objektu TLiczby. Mozemy jednak stworzyć nowy obiekt dziedziczący pola i metody z objektu TLiczby:
Widzimy w definicji struktury po nazwie objektu dodano nazwe przodka po którym dziedziczy. W rzczeczywistości nasz objekt TLiczbyNowe zawiera także procedure Suma i pola Pierwsza, Druga. Odpowiednio domyślnie!!! ten objekt wygląda jakby:
GLOBAL TLiczby_podaj_pierwszy :PROC GLOBAL TLiczby_podaj_drugi :PROC GLOBAL TLiczby_przypisz_pierwszy :PROC GLOBAL TLiczby_przypisz_drugi :PROC GLOBAL TLiczby_oblicz_sume :PROC GLOBAL TSuma_oblicz_sume :PROC GLOBAL TSuma_Constructor :PROC GLOBAL TSuma_Destructor :PROC
Komentarz: W powyższym programie zdeklarowano dwa objekty TLiczby i TSuma. TSuma odpowiada za zsumowanie danych i dziedziczy pola i metody z obiektu TLiczby. Wywołania procedur są oczywiście statyczne.
Na uwage zasługuje sposób wywołania metod obiektow z programu głównego. Jak pisałem wcześniej wskaźniki do poszczególnych metod przechowywane są w specjalnej tabeli. Dla powyższzego programu wygląda ona następująco:
@TABLE_TLICZBY PODAJ_PIERWSZY Dword Stat SUMA_TEXT:0000 PODAJ_DRUGI Dword Stat SUMA_TEXT:0003 PRZYPISZ_PIERWSZY Dword Stat SUMA_TEXT:0007 PRZYPISZ_DRUGI Dword Stat SUMA_TEXT:0015 @TABLE_TSUMA PODAJ_PIERWSZY Dword Stat SUMA_TEXT:0000 PODAJ_DRUGI Dword Stat SUMA_TEXT:0003
Metody wywoływane są kodem zapisanym:
mov si, offset s1 CALL si METHOD TSuma:init, 03h, 04h CALL si METHOD TSuma:oblicz_sume CALL si METHOD TSuma:done
W rzeczywistości TASM tłumaczy sobie powyższy kod do formy: