Wykład 8 - Prezentacja
Transkrypt
Wykład 8 - Prezentacja
Architektura komputerów Jan Kazimirski Architektura komputerów Wykład 8 Jan Kazimirski 1 Architektura komputerów Jan Kazimirski Assembler x86 2 Architektura komputerów Jan Kazimirski Podstawowe instrukcje x86 ● Instrukcje transferu danych ● Arytmetyka binarna i dziesiętna ● Instrukcje logiczne ● Instrukcje sterujące wykonaniem programu ● Operacje blokowe ● Inne 3 Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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) Architektura komputerów Jan Kazimirski Instrukcje transferu danych ● Umieść operand na stosie – PUSH. – ● Zdejmij ze stosu – POP. – ● Umieszcza na stosie operand – rejestr, daną z pamięci lub natychmiastową. 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. Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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. Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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. Architektura komputerów Jan Kazimirski 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ęć Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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. Architektura komputerów Jan Kazimirski 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. Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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. Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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). Architektura komputerów Jan Kazimirski 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. Architektura komputerów Jan Kazimirski 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 ● ... Architektura komputerów Jan Kazimirski 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. Architektura komputerów Jan Kazimirski 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). Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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) Architektura komputerów Jan Kazimirski 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. Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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 Architektura komputerów Jan Kazimirski 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 5: bb 01 00 00 00 mov a: b9 00 00 00 00 mov f: ba 0e 00 00 00 mov 14: cd 80 int 16: b8 01 00 00 00 mov 1b: bb 05 00 00 00 mov 20: cd 80 int $0x4,%eax $0x1,%ebx $0x0,%ecx $0xe,%edx $0x80 $0x1,%eax $0x5,%ebx $0x80 34 Architektura komputerów Jan Kazimirski Podsumowanie ● ● ● Podstawowe instrukcje asemblera x86 Anatomia programu napisanego w assemblerze x86 Analiza pliku obiektowego (binarnego) .o 35