Programowanie w asemblerze Architektura procesora
Transkrypt
Programowanie w asemblerze Architektura procesora
Programowanie w asemblerze
Architektura procesora
Zbigniew Jurkiewicz, Instytut Informatyki UW
17 stycznia 2017
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Zwana też ISA (Instruction Set Architecture). Klasyfikacja
stos;
akumulator; jeśli dodatkowe rejestry specjalizowane (np.
adresowy), to extended accumulator ;
rejestr-pamieć
˛
rejestr-rejestr + load/store
Ponadto w klasyfikacji uwzglednia
˛
sie˛ liczbe˛ argumentów
instrukcji (0–3) oraz liczbe˛ adresów pamieci
˛ w instrukcji
(0–3).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Różne poziomy uprzywilejowania
Najprostsza wersja:
zwykły (user )
systemowy (supervisor ).
Ale na procesorach Intela 4 poziomy (0–3), choć w
praktyce tylko 2 sa˛ używane.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Model pamieci
˛
Problem wyrównania (alignment) — używania adresów
bed
˛ acych
˛
wielokrotnościa˛ pewnej wartości.
Przykład: Pentium II ma 36-bitowe adresy, ale tylko
33-bitowa˛ szyne˛ adresowa.
˛
Trzy dolne bity adresu na szynie maja˛ zawsze wartość 0.
W efekcie zawsze pobierane jest 8 bajtów.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Kolejność bajtów w wiekszych
˛
jednostkach
Dwie możliwości:
little endian: najmniej znaczacy
˛ bajt jako pierwszy,
wymusza czytanie napisów (string) bajt po bajcie, inaczej
odwrotna kolejność w rejestrze wielobajtowym;
big endian: standard dla sieci.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Rejestr stanu procesora
Zawiera cz˛esto bit(y) aktualnego trybu pracy, co umożliwia
sprz˛etowa˛ realizacje˛ trybu uprzywilejowanego.
Flagi w nim zawarte dziela˛ sie˛ na
warunkowe, sygnalizujace
˛ wynik ostatniej operacji;
sterujace,
˛
służace
˛ do ustalania trybu pracy.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Flagi w procesorze Pentium
SF (znak) najwyższy bit wyniku ostatniej operacji
arytmetyczno-logicznej (czyli 1 gdy wynik < 0);
ZF (zero) ustawiana gdy wynik ostatniej operacji
arytmetyczno-logicznej był zerem;
PF (parzystość) ustawiana gdy dolny bajt wyniku ma parzysta˛
liczbe˛ jedynek;
CF (przeniesienie) ustawiana gdy podczas wykonywania
operacji arytmetyczno-logicznej powstało
przeniesienie (czyli istotna dla liczb bez znaku),
ale używana czasem także w innych sytuacjach;
OF (przepełnienie) ustawiana gdy podczas wykonywania
operacji arytmetyczno-logicznej powstało
przepełnienie (czyli istotna dla liczb ze znakiem);
IF (przerwania) zezwala na przyjmowanie przerwań;
DF (kierunek) wyznacza kierunek przebiegu operacji dla
przesłań blokowych, 0 oznacza zwiekszanie
˛
adresu.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Instrukcje maszynowe
Postać instrukcji maszynowych
Ciag
˛ bajtów o zmiennej długości („CISC”)
Słowo: (prawie) wszystkie instrukcje maja˛ te˛ sama˛ długość
(„RISC”)
Struktura instrukcji
Podzielone na pola, podział może być różny dla różnych
grup instrukcji.
Czasem poprzedzane dodatkowym prefiksem,
wpływajacym
˛
na interpretacje˛ właściwej instrukcji albo
zawierajacym
˛
dodatkowa˛ cz˛eść adresu.
W niektórych opisach prefiks uważany jest za osobna˛
instrukcje.
˛
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Instrukcje maszynowe
Pola:
kodu operacji, określa operacje˛ do wykonania
trybu adresowania, określa sposób wyznaczania
argumentu lub adresu efektywnego.
Podaje regułe˛ interpretacji dla pól adresowych, np. może
określać, czy instrukcja operuje na bajtach, słowach itd.
(jeśli informacja ta nie jest zawarta w kodzie instrukcji).
adresowe, wskazuje komórk˛e w pamieci
˛ lub rejestr
procesora
Moga˛ też wystepować
˛
pola specjalne, np. podajace
˛ liczbe˛
przesunieć
˛ w przypadku przesunieć
˛ i obrotów.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Obliczanie adresu efektywnego
Adres efektywny = ostateczny adres w odwołaniu do
pamieci,
˛ otrzymany w wyniku przetwarzenia zleconego
zadanym trybem adresowania.
Przestrzeń adresowa.
Rejestry segmentowe, tablica segmentów.
Deskryptory segmentów.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Repertuar instrukcji
Typy instrukcji:
Arytmetyczno-logiczne. Dodawanie, odejmowanie,
mnożenie i dzielenie całkowite.
ADD, ADC, INC, SUB, SBB, DEC, MUL, DIV, CMP
Osobne operacje arytmetyczne dla innych sposobów
reprezentacji liczb (np. BCD, ASCII, zmiennopozycyjne).
Arytmetyka z nasyceniem (saturating): gdy wynik za duży
ustawia sie˛ najwieksz
˛
a˛ dopuszczalna˛ wartość. Stosowana
w DSP (np. MMX w Pentium).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Repertuar instrukcji (c.d.)
Operacje Boole’owskie, argumenty traktowane jako ciagi
˛
bitów, operacja wykonywana na parze odpowiadajacych
˛
sobie bitów.
NOT, AND, OR, XOR, TEST
Obroty i przesuniecia.
˛
Obroty cykliczne
ROR, ROL, RCR, RCL
Przesuniecia
˛
logiczne i arytmetyczne (dzielenie/mnożenie
przez 2)
SHL, SHR, SAL, SAR
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Repertuar instrukcji (c.d.)
Przesłania danych. Służa˛ do przepisywania lub zmiany
zawartości rejestru/komórki pamieci
˛ w inne miejsce: MOV,
XCHG.
Operacje na stosie: PUSH, POP, PUSHF, POPF.
Operacje wejścia/wyjścia: IN, OUT.
Wiele procesorów dostarcza specjalne instrukcje złożone
do zwartego zapisywania typowych ciagów
˛
operacji, np.
przepisywania czy przeszukiwania całych bloków pamieci
˛
(LODS, STOS, MOVS, SCAS, CMPS, REP).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Repertuar instrukcji
Sterujace.
˛
Instrukcje te zmieniaja˛ normalna˛ sekwencyjna˛
kolejność wykonywania instrukcji, modyfikujac
˛ wartość
licznika rozkazów. Argumentem (niekoniecznie jedynym)
jest zwykle adres nastepnej
˛
instrukcji do wykonania: może
być podany jako wzgledny
˛
lub bezwzgledny.
˛
Skoki bezwarunkowe (JMP) wykonywane zawsze.
Rozgałezienia
˛
(skoki warunkowe): skok jest wykonywany
tylko jeśli spełniony był odpowiedni warunek. Warunek
może polegać na sprawdzeniu odpowiedniej flagi lub flag,
ustawianych zależnie od wyniku ostatniej instrukcji
arytmetyczno logicznej — tak jest na procesorach 80x86
Intela (instrukcje JZ/JE, JNZ/JNE, JC, JNC, JO, JNO, JP,
JNP).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Repertuar instrukcji
Sa˛ osobne skoki dla liczb ze znakiem (JG, JGE, JL, JLE) i
bez znaku (JA, JAE, JB, JBE).
Inna możliwość to umieszczenie wyniku porównania w
rejestrze i sprawdzanie go (np. procesor Alpha, ale także
Pentium). Wada: zajmuje sie˛ cały rejestr.
Ostatnia możliwość to instrukcje typu compare and branch,
dokonujace
˛ zarówno porównania jak i skoku warunkowego
(np. VAX, PA-RISC), stwarza to jednak kłopoty przy
agresywnym przetwarzaniu potokowym.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Repertuar instrukcji
Wywołanie/powrót z podprogramu.
CALL, RET
Przerwanie programowe i powrót z przerwania: INT, IRET.
P˛etle (LOOP, JCXZ, LOOPE, LOOPNE). Cz˛esto instrukcja
przeskoku – warunkowego omijania pojedynczej nastepnej
˛
instrukcji.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Repertuar instrukcji
Reczne
˛
ustawianie flag.
CLI, STI, CLC
Instrukcja NOP — wypełniacz.
Specjalne. Moga˛ być wykonywane tylko w trybie
uprzywilejowanym. Obejmuja˛ manipulowanie
mechanizmami ochrony, zatrzymanie procesora (HLT).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Tryby adresowe
Typy argumentów instrukcji.
Tryby adresowe określaja˛ sposób wyznaczania położenia
argumentów.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Tryby adresowe
niejawny (domyślny)
mul
ecx
natychmiastowy, dana jest zawarta bezpośrednio w
instrukcji
mov
eax,10
rejestrowy, argument znajduje sie˛ w rejestrze, którego
numer (symbol) podaje pole adresowe
add
eax,ebx
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Tryby adresowe
bezpośredni, adres argumentu znajduje sie˛ w polu
adresowym
mov
eax,[100]
rejestrowy pośredni, adres argumentu znajduje sie˛ w
podanym rejestrze
mov
eax,[esi]
pośredni, w polu adresowym znajduje sie˛ adres komórki
pamieci,
˛ w której znajduje sie˛ adres argumentu (nie
wystepuje
˛
w serii 80x86).
wzgledny,
˛
w polu adresowym podane jest przesuniecie
˛
wzgledem
˛
licznika rozkazów; najcz˛eściej używany w
skokach warunkowych
jle
30
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Tryby adresowe
indeksowy, adres argumentu powstaje ze zsumowania
dwóch składników podanych w instrukcji:
adresu lub przesuniecia
˛
podanego w polu adresowym
instrukcji i zawartości podanego rejestru, lub
zawartości jednego lub dwóch rejestrów.
Jeden z nich (zwykle ustalony) nazywamy baza,
˛ zaś drugi,
cz˛esto iteracyjnie zmieniany, indeksem. Rejestr może być
skalowany: jego wartość podczas wyznaczania adresu
efektywnego mnoży sie˛ np. przez 2.
mov
mov
eax,[ebx+100]
ecx,[ebx+esi]
Dla 80x86 ogólny schemat adresu ma postać
adres-bazowy + przesuniecie
˛
+ indeks * rozmiar-elementu
autoinkrementacja/autodekrementacja, polega na
automatycznym zwiekszeniu
˛
argumentu po wykonaniu (lub
przed wykonaniem) instrukcji.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Tryby adresowe
Dokumentacja firmowa podaje tryby dopuszczalne dla
każdej instrukcji.
Dla wiekszości
˛
instrukcji dostepne
˛
sa˛ wszystkie sensowne
kombinacje trybów.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Specjalne tryby dla procesorów sygnałowych (DSP)
cykliczny (modulo): podaje sie˛ adres bufora, automatyczne
zwiekszanie
˛
wskaźnika bufora z zawijaniem
bit reverse (dla FFT): adres docelowy to odwrócenie n
dolnych bitów adresu źródłowego.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Sposoby korzystania z rejestru uniwersalnego
Jako akumulator. W rejestrze znajduja˛ sie˛ dane do
obliczeń określonych kodem instrukcji.
Jako wskaźnik. Rejestr zawiera adres właściwego
operandu instrukcji, a nie sam operand.
Jako automatycznie zwiekszany
˛
wskaźnik do
przechodzenia po kolejnych komórkach pamieci.
˛
Przechodzenie w przód znane jest jako
„autoinkrementacja”, przechodzenie w tył jako
„autodekrementacja”. Najcz˛estsze zastosowanie to
przetwarzanie danych tablicowych.
Jako indeks (rejestr indeksowy). W tym przypadku
zawartość rejestru dodawana jest do podanego w instrukcji
adresu bazowego dajac
˛ adres operandu.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Operacje na bitach
Instrukcja BT (Bit Test) wstawia wartość podanego bitu w
argumencie do flagi CF.
Instrukcja BTS (Bit Test and Set) wstawia wartość
podanego bitu w argumencie do flagi CF i ustawia ten bit
na 1. Klasyka systemów operacyjnych.
Takie instrukcje zapewne należy poprzedzić prefiksem
LOCK, zwłaszcza, gdy mamy kilka procesorów chetnych
˛
do
majstrowania przy pamieci.
˛
Rodzina instrukcji SETcc ustawia podany rejestr bajtowy
na 0 lub 1 zależnie od wyniku porównania (a ściślej od
stanu flag). Przydatna dla operacji warunkowych, aby móc
wykonać je nieco później.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Miscelannea
Instrukcja LEA służy głównie do nadużyć (np. mnożenie
przez 5), rzadko jest używana zgodnie z pierwotnym
przeznaczeniem.
Dodawanie dwóch rejestrów, wynik w trzecim:
lea rax,[rdi + rsi]
Instrukcja RDRAND zwraca (jeśli mamy szcz˛eście)
gwarantowana˛ liczbe˛ losowa.
˛
Instrukcja NOP nic nie robi (ale z wdziekiem).
˛
Kiedyś
lubiana przez włamywaczy.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Zamiana
Instrukcja XCHG zamienia zawartość swoich argumentów.
Zastepuje
˛
trzy instrukcje MOV (lub XOR) i nie wymaga
dodatkowej komórki roboczej.
Może być używana do implementacji semaforów.
Instrukcja BSWAP odwraca kolejność bajtów w
argumencie.
Przydatna do realizacji przesłań sieciowych.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Szybka zmiana poziomu ochrony
Szybkie wołanie usług systemu operacyjnego = zmiana
miedzy
˛
poziomami ochrony 3 a 0
Para instrukcji SYSENTER, SYSEXIT
Para instrukcji SYSCALL, SYSRET
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Przykład: if
if (x > 0)
z += x;
else
z++;
else:
koniec:
mov
cmp
jle
add
jmp
inc
eax,[x]
eax,0
else
[z],eax
koniec
[z]
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora
Przykład: while
while (n > 0) {
z += z;
n--;
}
mov
cmp
jle
add
dec
jmp
koniec: mov
while:
eax,[z]
[n],0
koniec
eax,eax
[n]
while
[z],eax
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektura procesora