Architektura komputerów Wykład 8 Jan Kazimirski 1
Assembler x86 2
Podstawowe instrukcje x86 Instrukcje transferu danych Arytmetyka binarna i dziesiętna Instrukcje logiczne Instrukcje sterujące wykonaniem programu Operacje blokowe Inne 3
Instrukcje transferu danych Prześlij dane - MOV Realizuje przesłania: rejestr-rejestr, rejestrpamięć, pamięć-rejestr, oraz załadowanie danej natychmiastowej do rejestru Prześlij dane warunkowo Zbiór instrukcji realizujących przesłanie jeżeli spełniony jest warunek Przykład: CMOVC przenieś jeśli nastąpiło przeniesienie
Instrukcje transferu danych Zamień zawartość operandów - XCHG Zamienia miejscami zawartości rejestrów lub rejestru i pamięci Porównaj i zamień - CMPXCHG Może być stosowana jako atomowa instrukcja typu test and set (z przedrostkiem LOCK)
Instrukcje transferu danych Umieść operand na stosie PUSH. Umieszcza na stosie operand rejestr, daną z pamięci lub natychmiastową. Zdejmij ze stosu POP. Zdejmuje wartość ze stosu i umieszcza ją w rejestrze lub pamięci. Umieszczanie lub zdejmowanie ze stosu zawartości wszystkich rejestrów instrukcje PUSHA i POPA.
Instrukcje transferu danych Instrukcje konwersji Dokonują konwersji rozszerzającej bajt->słowo, słowo->podwójne słowo itd. Prawidłowo obsługują liczby ujemne (kod U2) Przykład: CWD konwertuj słowo na podwójne słowo
Arytmetyka binarna Dodawanie i odejmowanie ADD dodaj operand źródłowy do docelowego ADC dodaj z przeniesieniem INC zwiększ o jeden wartość operandu SUB odejmij operand źródłowy od docelowego SBB odejmij z przeniesieniem DEC zmniejsz o jeden wartość operandu
Arytmetyka binarna Porównanie i negacja CMP porównaj operandy i ustaw flagi. NEG zmień znak operandu na przeciwny. Mnożenie MUL mnożenie liczb bez znaku. IMUL mnożenie liczb ze znakiem. Używa akumulatora.
Arytmetyka binarna Dzielenie DIV dzielenie liczb bez znaku IDIV dzielenie liczb ze znakiem Zwraca osobno wynik dzielenia i resztę z dzielenia Dzielenie przez zero powoduje wygenerowanie wyjątku
Arytmetyka dziesiętna Arytmetyka na liczbach zapisanych w kodzie BCD. Wykonywana za pomocą instrukcji operacji binarnych połączonych z dodatkowymi instrukcjami konwertującymi dane między reprezentacją binarną a kodem BCD.
Instrukcje logiczne Operatory logiczne AND, OR, XOR Dopuszczalne kombinacje operandów: rejestr - rejestr, rejestr - pamięć, rejestr - dana natychmiastowa, pamięć dana natychmiastowa Negacja logiczna NOT Operandem może być rejestr lub pamięć
Przesunięcia i rotacje Przesunięcia bitowe SHR przesunięcie logiczne w prawo SHL przesunięcie logiczne w lewo Rotacje bitowe ROR rotacja w prawo ROL rotacja w lewo
Operacje na bitach Zestaw instrukcji operujących na poszczególnych bitach danych Ustawianie poszczególnych bitów Zerowanie poszczególnych bitów Wyszukiwanie ustawionego bitu Warunkowe ustawianie bitów Testowanie poszczególnych bitów
Instrukcje sterujące wykonaniem programu Instrukcja skoku bezwarunkowego JMP Przenosi sterowanie do nowej pozycji w pamięci Operandem może być dana natychmiastowa, rejestr lub adres w pamięci Adres skoku może być względny (wyliczany na podstawie aktualnej pozycji) lub bezwzględny.
Instrukcje sterujące wykonaniem programu Wywołanie procedury CALL Tzw. skok ze śladem - instrukcja skoku z zachowaniem na stosie adresu następnej instrukcji Sposoby wywołania są takie same jak JMP Powrót z procedury RET Instrukcja pobiera adres ze stosu (umieszczony tam przez CALL) i wykonuje skok do tego adresu.
Instrukcje sterujące wykonaniem programu Skoki warunkowe Zestaw instrukcji odpowiadających instrukcji JMP ale realizujących skok tylko w przypadku spełnionego warunku. Przykłady: JE skocz jeśli równe JNE skocz jeśli nierówne JZ skocz jeśli zero
Instrukcje sterujące wykonaniem programu Instrukcja pętli LOOP Pozwala zrealizować pętlę sterowaną zawartością rejestru ECX. Instrukcja sprawdza zawartość ECX i jeżeli jest on większy od zera to zmniejsza go o 1 i wykonuje skok do podanego adresu.
Operacje blokowe Zestaw instrukcji pozwalających na operacje na blokach danych. Podstawowe operacje: MOVS kopiuj blok danych CMPS porównaj blok danych SCAS szukaj w bloku danych LODS wczytaj blok danych STOS zapisz blok danych
Operacje blokowe Wersje dla różnych rozmiarów danych, np. dla MOVS MOVSB (operuje na bajtach), MOVSW (operuje na słowach) itd. Korzystają z rejestrów ESI i EDI do adresowania adresów źródłowego i docelowego (z automatyczną inkrementacją/dekrementacją) Flaga DF określa kierunek (zwiększanie lub zmniejszanie adresów).
Operacje blokowe Dodatkowe przedrostki pozwalają powtarzać operację określoną liczbę razy REP powtarzaj dopóki ECX <> 0 REPE, REPZ, REPNE, REPNZ powtarzaj dopóki ECX <> 0 i spełniony warunek. Wersje REP z dodatkowym warunkiem zakończenia stosowane są do operacji CMPS i SCAS.
Inne Manipulowanie bitami rejestru znaczników Ustawianie lub zerowanie poszczególnych flag rejestru znaczników (bity przeniesienia i kierunku pętli) Przykłady: STC ustaw bit przeniesienia CLC zeruj bit przeniesienia CMC neguj bit przeniesienia STD ustaw bit kierunku...
Inne Manipulowanie rejestrem znaczników Nie wszystkie flagi rejestru znaczników można modyfikować za pomocą osobnych instrukcji Flagi niedostępne bezpośrednio można modyfikować za pośrednictwem akumulatora i instrukcji LAHF (ładuje flagi do AH) i SAHF (ustawia flagi na podstawie AH) Flagami można też manipulować za pomocą stosu i instrukcji PUSF i POPF.
Inne Wsparcie dla procedur języków wysokiego poziomu: ENTER, LEAVE ENTER tworzy tzw. ramkę stosu rezerwując na stosie miejsce dla lokalnych zmiennych funkcji. Wywoływana przy wywołaniu funkcji LEAVE likwiduje ramkę stosu utworzoną wcześniej przez ENTER. Wywoływana przy wyjściu z funkcji (return).
Inne LEA Załadowanie adresu efektywnego Pozwala załadować adres operandu do rejestru Wykorzystywana do wskazywania operandów przy operacjach blokowych NOP Operacja pusta Nie robi nic poza zwiększeniem wartości licznika instrukcji
Inne Instrukcje wejścia wyjścia: IN pobierz daną z portu we/wy OUT wyślij daną do portu we/wy INSB/INSW/INSD pobranie blokowe (z REP) OUTSB/OUTSW/OUTSD wysłanie blokowe (z REP)
Inne Obsługa przerwań programowych INT wywołanie przerwania o określonym numerze IRET powrót z przerwania Przerwanie nr 3 (pułapka debuggera) ma specjalny 1-bajtowy rozkaz pozwala to wstawić pułapkę zamiast dowolnej instrukcji.
Anatomia programu Program assemblera składa się z sekcji (segmentów). Model ten jest pozostałością po segmentowym modelu pamięci. Podstawowe sekcje:.text segment kodu.data segment danych.bss segment danych zmiennych 28
Anatomia programu c.d. Segment.text Kod programu (wykonywane instrukcje) Status: wykonywalny, tylko do odczytu Segment.data Zainicjalizowane dane programu Status: niewykonywalny Segment.bss Niezainicjalizowane dane programu Status: niewykonywalny 29
Anatomia programu c.d. Punkt startowy programu symbol _start Dyrektywa assemblera global eksportuje symbol dla programu łączącego (linkera). global _start Etykieta _start wskazuje na pierwszą wykonywaną instrukcję programu 30
Dygresja analiza pliku.o Polecenie file podstawowe informacje o pliku. Przykład: file ex01.o ex01.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped Informacja o formacie pliku obiektowego (binarnego) Plik zawiera tablicę symboli Tablicę symboli można usunąć (po konsolidacji!) poleceniem strip 31
Polecenie objdump Polecenie objdump pozwala na dokładną analizę pliku obiektowego (binarnego) Duża liczba opcji przydatne opcje: -t wyświetla tablicę symboli -d dokonuje deasemblacji kodu programu (tłumaczenia z kodu maszynowego na rozkazy asemblera) 32
Polecenie objdump c.d. objdump -t ex01.o ex01.o: file format elf64-x86-64 SYMBOL TABLE: 0000000000000000 l df *ABS* 0000000000000000 ex01.asm 0000000000000000 l d.data 0000000000000000.data 0000000000000000 l d.text 0000000000000000.text 0000000000000000 l.data 0000000000000000 msg 0000000000000000 g.text 0000000000000000 _start 33
Polecenie objdump c.d. objdump -d ex01.o ex01.o: file format elf64-x86-64 Disassembly of section.text: 0000000000000000 <_start>: 0: b8 04 00 00 00 mov $0x4,%eax 5: bb 01 00 00 00 mov $0x1,%ebx a: b9 00 00 00 00 mov $0x0,%ecx f: ba 0e 00 00 00 mov $0xe,%edx 14: cd 80 int $0x80 16: b8 01 00 00 00 mov $0x1,%eax 1b: bb 05 00 00 00 mov $0x5,%ebx 20: cd 80 int $0x80 34
Podsumowanie Podstawowe instrukcje asemblera x86 Anatomia programu napisanego w assemblerze x86 Analiza pliku obiektowego (binarnego).o 35