ASSEMBLER J. Duntemann Zrozumieć Assembler Leo J. Scanlon Assembler 8086/8088/80286 S. Kruk Programowanie w Języku Assembler Geneza (8086, 8088). Rejestry Adresowanie pamięci Stos Instrukcje Przerwania Procedury Makroinstrukcje Biblioteki zewnętrzne Nowe możliwości programowanie 32 bitowe
Dlaczego assembler? Prostszy jest BASIC! Najczęstsze zastosowania obecnie sterowniki urządzeń zewnętrznych optymalizacja kodu dużych programów bardzo małe i szybkie programy, biblioteki
Rejestry 16 bitowe Segmentacja pamięci (64k=65536). 16 bitowy ślepiec. 80286 (20bit adresowanie do 1024k). Specjalne komórki pamięci znajdujące się w kostce mikroprocesora. Para rejestrów 16 bit DS:SI CS:BX Segmenty mogą się wzajemnie przenikać. Dwie różne pary rejestrów 16 bitowych mogą określać tą samą komórkę pamięci. Rejestry związane są z budową mikroprocesora.
Rejestry segmentowe BYTE 1 WORD 2 DWORD 4 Istnieją tylko do przechowywania adresów segmentów. CS oznacza rejestr segmentowy kodu (code segment register). Każda instrukcja składająca się na program znajduje się w segmencie kodu. QWORD 8 TBYTE 10 PARA 16 PAGE 256 SEGMENT 65536 DS oznacza rejestr segmentowy danych (data segment register). Tutaj znajdują się dane oraz inne zmienne. Może istnieć wiele segmentów danych ale w danym momencie CPU może wykorzystywać tylko jeden z nich. Adres tego segmentu znajduje się w rejestrze DX.
SS oznacza rejestr segmentowy stosu (stack segment register). Stos jest bardzo ważnym elementem procesora, używanym do czasowego przechowywania danych lub adresów. ES oznacza dodatkowy rejestr segmentowy (extra segment register). Jest to dodatkowy segment danych którego adres przechowywany jest w rejestrze ES. Adres segmentu pokazuje początek takiego obszaru. Aby określić położenie wewnątrz segmentu potrzebny jest jeszcze jeden rejestr 16 bitowy
Rejestry ogólnego przeznaczenia AX, BX, CX, DX, SP, BP, SI, DI Rejestr AX, BX, CX, DX można podzielić na połówki AX=(AH,AL) (starszy bajt, młodszy bajt) BX=(BH,BL) CX=(CH,CL) DX=(DH,DL)
Przeznaczenie rejestrów AX, akumulator jest używany w operacjach działających na słowach mnożeniu, dzieleniu i operacjach we/wy oraz w niektórych operacjach na łańcuchach. BX, rejestr bazowy często używany do adresowania danych w pamięci CX, licznik, działa jako licznik powtórzeń w pętli. Rejestr CL zawiera wartość przemieszczenia w operacjach przesunięcia bitowego DX, rejestr danych, używany w operacjach mnożenia i dzielenia argumentów rozmiaru słowa. Może dostarczać numer portu w operacjach we/wy.
Wskaźniki i indeksy SP - wskaźnik stosu (stack pointer). BP - wskaźnik bazy (base pointer). SI - indeks źródła (source index). DI - indeks przeznaczenia (destination index). Wskaźnik instrukcji (IP) Służy on do przechowywania offsetu instrukcji języka maszynowego, która będzie wykonana jako następna. W momencie zakończenia wykonywania instrukcji wartość w IP jest zwiększana o taką liczbę bajtów, jaką zajmowała aktualnie zakończona instrukcja. CS:IP pełny adres kolejnej wykonywanej instrukcji.
Rejestr znaczników. Jest to 16-bitowy rejestr do którego mamy dostęp jedynie przez instrukcje assemblera. Raczej jest to zbór flag rejestrów 1 bitowych. OF, DF, IF, TF, SF, ZF, AF, PF, CF OF - przepełnienia OV NV DF - kerunku DN UP IF - zezwolenia przerawania EI DI SF - znaku NG PL ZF - zera ZR NZ AF - dodat. przeniesienia AC NA PF - parzystości PE PO CF - przeniesienia CY NC TF - pułapki
Adresowanie pamięci Instrukcja podstawowa assemblera MOV MOV AX,1 AX - operand przeznaczenia 1 - operand źródłowy. Dane natychmiastowe znajdują się bezpośrednio w instrukcji która jest aktualnie wykonywana. Dane takie są osiągalne dzięki trybowi adresowania zwanemu adresowaniem natychmiastowym Dane bezpośrednie muszą mieć wielkość odpowiadającą operandowi przeznaczenia. MOV AL,54EFH Operacja zabroniona
Dane rejestrowe Dane natychmiastowe wykonywane są zdecydowanie prędzej od danych pamięciowych lecz wolniej od danych rejestrowych. Dostęp do nich mamy w trybie adresowania zwanym adresowaniem rejestrowym lub inaczej adresowaniem ukrytym. MOV AX,BX MOV AL,BX MOV AX,BL Kopiowanie zawartości rejestru BX do AX Sygnalizowany jest błąd Sygnalizowany jest błąd
Dane pamięciowe Dane pamięciowe przechowywane są gdzieś w megabajtowym obszarze pamięci adresowanej przez układy 8086. Do adresowania pamięci wybrany został rejestr BX. Aby przenieść słowo znajdujące się w pamięci pod adresem DS:BX wykonujemy następującą instrukcję mając wcześniej już ustalony adres segmentu danych. MOV AX,[BX] Nawiasy kwadratowe mówią nam, że nie interesuje nas sama wartość BX a komórka pamięci na którą ona wskazuje.
Jeżeli chcemy wykonać operację odwrotną, czyli zapisać daną do pamięci (skopiować z rejestru DX). MOV [DI],DX Nawiasy kwadratowe mówią nam, że nie interesuje nas sama wartość DI a komórka pamięci na którą ona wskazuje. W tych dwóch przypadkach domyślnym segmentem jest segment danych DS. W celu wskazania konkretnego segmentu dodajemy przedrostek zmiany segmentu : MOV CS:[DI],DX
Instrukcja MOV nie może przenosić danych z jednej komórki do innej MOV [SI],[BX] Instrukcja MOV nie może przenosić zawartości jednego rejestru segmentowego do drugiego rejestru segmentowego. MOV CS,SS Instrukcja MOV nie może przenosić danych danych natychmiastowych do rejestru segmentowego. MOV CS,0B800H
Inkrementacja(INC) i dekrementacja(dec) MOV AX,1 INC AX Co powstanie w wyniku zastosowania takich instrukcji MOV AX,FFFFH INC AX Znacznik ZF jest ustawiany MOV AX,1 DEC AX Znacznik ZF jest ustawiany
Typy danych w języku assembler Typ danych w języku assembler sprowadza się przeważnie do rozmiaru Dyrektywy określające dane Licznik DB ; 8 bit Zmienna DW ; 16 bit Wynik DD ; 32 bit MOV CL,Licznik MOV BL,Zmienna
Specyfikatory zmiany typu MOV BL,BYTE PTR Zmienna Specyfikator BYTE PTR wymusza potraktowanie zmiennej zmienna jako wartości 1-bajtowej. Do rejestru BL zostanie załadowany bardziej znaczący bajt. Ciągi znaków. Text DB To jest łańcuch znaków, $ Ciągi definiowane są przez etykietę wskazującą w którym miejscu pamięci znajduje się nasz ciąg danych. Znak $ oznacz koniec ciągu.
Adres zmiennej LEA DX,text Instrukcja służy do przeniesienia adresu zmiennej do rejestru a nie jej wartości. (Load Effective Address) Komentarze w assemblerze ; to jest komentarz