UNIWERSYTET ZIELONOGÓRSKI
Transkrypt
UNIWERSYTET ZIELONOGÓRSKI
ARCHITEKTURA KOMPUTERÓW - WPROWADZENIE Uniwersytet Zielonogórski Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki Zakład Inżynierii Komputerowej przygotował: Jakub Półchłopek, dr inż. Remigiusz Wiśniewski WPROWADZENIE DO JĘZYKA ASEMBLER ZAGADNIENIA architektura komputera PC, rejestry ogólnego przeznaczenia, przerwania systemowe, struktura programu wykonywalnego. WSTĘP Asembler (ang. assembler) - język programowania niskiego poziomu. Jest to język najbardziej zbliżony do kodu maszynowego (w tej postaci instrukcje są wykonywane przez procesor). Wynika stąd, że programy napisane w tym języku w największym stopniu wpływają na zachowanie komputera. Języki wysokiego poziomu są najpierw tłumaczone poprzez odpowiednie kompilatory na język assembler, a następnie na język maszynowy. Największą zaletą języka asembler jest szybkość oraz rozmiar tworzonego programu wykonywalnego. Asembler jest powszechnym językiem dla programistów zajmujących się bezpieczeństwem danych, lecz także dla różnego rodzaju hakerów i osób „piszących” wirusy. REJESTRY OGÓLNEGO PRZEZNACZENIA Rejestry ogólnego przeznaczenia znajdują się wewnątrz procesora (w przestrzeni adresowej pamięci SRAM, gdzie zajmują pierwsze 32 bajty). Te specjalistyczne struktury pozwalają przechowywać niewielkie dane, w zależności od typu procesora. Rejestry o rozmiarze 64 bitów zawierają w sobie rejestr 32 bitowy, który następnie dzieli się na jeden rejestr 16 bitowy i dwa rejestry 8 bitowe, zawierające młodsze i starsze bity: 64 bity 32 bity 16 bitów 8 bitów (starsze) 8 bitów (młodsze) RAX RBX RCX RDX EAX EBX ECX EDX AX BX CX DX AH BH CH DH AL BL CL DL Przykładowa organizacja rejestrów jest następująca: rejestr RAX (64 bity) zawiera w sobie rejestr EAX (młodsze 32 bity), który z kolei to posiada rejestr AX (młodsze 16 bitów), a ten dzieli się na dwa rejestry 8 bitowe: AH oraz AL. Analogicznie sytuacja powtarza się dla pozostałych rejestrów. Rejestry ogólnego przeznaczenia dzielimy następująco: AX – jest to rejestr akumulatora, który zawiera tymczasowe dane wykorzystywane podczas pisania programów (programowania). Rejestr stosowany jest zazwyczaj do wszelkich obliczeń, jak i do przekazywania informacji do systemu operacyjnego oraz systemu BIOS. BX – jest to rejestr bazowy, używany do przetrzymywania adresów wykorzystywanych w programie. CX – jest to rejestr licznika, np. stosowany jako licznik w pętlach. DX – jest to rejestr danych, stosowany do obsługi portów wyjścia/wejścia oraz do operacji arytmetycznych. REJESTRY INDEKSOWE I WSKAŹNIKOWE SI/ ESI / RSI (Source Index, 16/32/64 bity) – wskazuje na obszar w pamięci, skąd są pobierane dane. DI/ EDI/ RDI (Destination Index, 16/32/64 bity) – wskazuje obszar w pamięci, do którego są przekazywane dane. http://www.uz.zgora.pl/~rwisniew/ ARCHITEKTURA KOMPUTERÓW - WPROWADZENIE Uniwersytet Zielonogórski Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki Zakład Inżynierii Komputerowej przygotował: Jakub Półchłopek, dr inż. Remigiusz Wiśniewski SP (Stack Pointer) – wskazuje adres ostatniego słowa na stosie. W zależności od wykonanej operacji, jego wartość jest automatycznie zwiększana lub zmniejszana. BP (Base Pointer) – wykorzystywany do adresowania pamięci na stosie. IP (Instruction Pointer) – wskazuje kolejną instrukcję, jaką ma do wykonania procesor. REJESTRY SEGMENTOWE CS (Code Segment) – wskazuje segment danych w pamięci, gdzie zapisane są instrukcje. DS (Data Segment) – wskazuje segment danych w pamięci, gdzie zapisane są dane. SS (Stack Segment) – wskazuje segment danych w pamięci, gdzie zapisane są stosy. ES (Extra Segment) – wskazuje segment danych w pamięci, gdzie zapisane są dane docelowe dla instrukcji łańcuchowych. FS - dodatkowy segment danych (w procesorach 386 lub nowszych). GS - dodatkowy segment danych (w procesorach 386 lub nowszych). REJESTRY STANU PROCESORA (REJESTR FLAG) Rozróżnić można zwykłe FLAGI 16-bitowe, E-FLAGI (32-bitowe) lub R-FLAGI (64-bitowe). Flagi służą przede wszystkim do badania wyniku ostatniej operacji (na przykład czy nie wystąpiło przepełnienie, czy wynik jest zerem, itp.). Rejestr flag można podzielić na dwie zasadnicze grupy: kontrolną oraz arytmetyczną. Flagi arytmetyczne dostarczają rozszerzonych informacji na temat operacji arytmetyczno-logicznych, natomiast flagi kontrolne mają wpływ na tryb pracy mikroprocesora. CF (Carry Flag) - flaga przeniesienia (przyjmuje wartość 1, jeśli wystąpiło przeniesienie). PF (Parity Flag) - flaga parzystości (przyjmuje wartość 1, jeśli wynik zawiera parzystą lub nie parzystą (zależy od typu procesora) ilość jedynek w mniej znaczącym bajcie. AF (Auxillary Flag) - flaga przyjmuje wartość 1, jeśli w ostatniej operacji wystąpiło przemieszczenie z bitu 3 na bit 4, lub z bitu 4 na bit 3. Stosowana w operacjach na kodach BCD. ZF (Zero Flag) - przyjmuje wartość 1, jeśli wynik ostatniej operacji jest równy zero. SF (Sign Flag) - flaga znaku, przyjmuje wartość najbardziej znaczącego bitu z wyniku ostatniej operacji. TF (Trap Flag) - ustawienie wartości na 1 oznacza przejście procesora w tryb pracy krokowej (co oznacza, że po każdej wykonanej operacji procesor wykona przejście do właściwego podprogramu). IF (Interrupt Flag) – jeśli jest równa 1, to program może być przerywany przez zewnętrzne przerwania (przejście procesora do obsługi przerwań, jest to domyślny tryb pracy procesora). DF (Direction Flag) – flaga po przyjęciu wartości 1 powoduje zmniejszanie się wartości rejestrów SI i DI podczas wykonywania operacji łańcuchowych. OF (Overflow Flag) - gdy flaga przyjmuje wartość 1 oznacza to, że wykonywana operacja spowodowała przeniesienie na najbardziej znaczący bit, ale nie doszło do przekroczenia zakresu. PRZERWANIA Przerwanie jest stosowane do zatrzymania wykonującego się w danej chwili programu i przekazanie sterowania do procedury, która to przerwanie obsługuje. Gdy procedura dobiegnie końca następuje powrót do wcześniej wykonywanego programu. Przerwania można podzielić na dwa rodzaje: przerwania sprzętowe - wywoływane na żądanie urządzeń zewnętrznych (przerwanie sprzętowe zewnętrzne), lub też podczas wystąpienia wyjątków (przerwanie sprzętowe wewnętrzne). Przykład: kombinacja klawiszy Ctrl+Break. przerwania systemowe - z kodu programu zostaje wywołana procedura obsługująca przerwanie, służąca najczęściej do komunikowania się z systemem operacyjnym. Każde przerwanie ma swój priorytet (IRQ), na podstawie którego określana jest kolejność wykonywanych przerwań, jeśli zostały one zgłoszone w tym samym momencie. Wybór funkcji przerwania dokonywany jest przy pomocy rejestru AH. http://www.uz.zgora.pl/~rwisniew/ ARCHITEKTURA KOMPUTERÓW - WPROWADZENIE Uniwersytet Zielonogórski Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki Zakład Inżynierii Komputerowej przygotował: Jakub Półchłopek, dr inż. Remigiusz Wiśniewski Ważniejsze funkcje przerwania 21h: AH=01h – odczyt znaku z klawiatury (wyjście: rejestr AL); AH=02h – wyświetlenie znaku na ekranie (wejście: rejestr DL – kod znaku do wyświetlenia), AH=09h – wyświetlenie ciągu znaków na ekranie (wejście: rejestr DX-adres ciągu znaku do wyświetlenia), AH=0Ah – odczyt ciągu znaków z klawiatury (wejście: rejestr DX-adres ciągu znaku do odczytu), AH=4Ch – zakończenie programu (wejście: rejestr AL – wartość zwracana przez program). PRZYKŁADOWY PROGRAM .286 .model tiny .data napis db 'To jest napis$' ;Wyświetlanie napisu kończy znak $ .code ;etykieta start jest punktem startowym programu Start: mov ax,@data ;zaladowanie danych do segmentu DS mov ds,ax mov mov int dx,offset napis ah,09h 21h ;alternatywnie: lea dx,napis mov int ax,4C00h 21h ;procedura kończąca program ;INT 21,AH 4C = zakończenie programu ;INT 21,AH 09 = wypis ciągu znaku spod adresu DX end Start end http://www.uz.zgora.pl/~rwisniew/