# AKO - egzamin teoretyczny
## 1. Architektura komputera
#### 1.1 Co to jest architektura komputerów
Projekt warstw abstrakcji, dzięki którym mamy możliwość implementowania aplikacji do aplikacji do efektywnego przetwarzania informacji, wykorzystując dostępne technologie. Jest opisywany przez zbiór atrybutów (model ISA)
#### 1.2 Model programowy procesora
Zbiór atrybutów architektury, w którego skład wchodzą między innymi
- zbiór instrukcji
- rejestry
- tryby adresowania
- typy i rozmiary operandów
#### 1.3 Wyjaśnij różnicę pomiędzy organizacją a modelem programowym.
Procesory o tym samym modelu programowym ISA cechują się tym, zę dają te same wyniki, czyli są ze sobą kompatybilne. Mogą się jednak różnić organizacją, czyli implementacją architektury (zarządzanie energią, taktowanie). Przykładowo ten sam model ISA ale inną organizację ma laptop i PC.
#### 1.4 Omówić tryby pracy procesora
Tryb rzeczywisty – występuje segmentacja pamieci, segmenty stałego rozmiaru 64KB, przestrzeń adresowa ograniczona do 1MB, w tym trybie procesor pracuje po właczeniu komputera, adres w postaci segment:offset
Tryb chroniony - tryb inicjalizowany i w znacznej mierze kontrolowany przez system operacyjny, pamięć moze byc zorganizowana w segmenty dowolnej wielkości, w tym trybie procesor wspiera wielozadaniowość, chroni przed nieupoważnionym dostępem do urzadzeń wejścia/wyjścia
#### 1.5 Opisz bezpośredni dostęp do części rejestru R10 w trybie 64 bitowym i napisz ciąg instrukcji, który wpisze do eax 32 najstarsze bity tego rejestru.
R10 to rejestr 64 bitowy. Można mieć dostęp do jego składowych przez:
- R10D - 32 najmłodsze bity
- R10W - 16 najmłodszych bitów
- R10B - 8 najmłodszych bitów
```
ror r10, 32
mov eax, r10d
ror r10, 32
```
## 2. Porządki bajtów
#### 2.1 Zapisanie liczby 515 na dwóch bajtach w big endian
```
515 = 0000 0010 0000 0011
k+1 0000 0011 = 03h
k+0 0000 0010 = 02h
```
#### 2.2 W komórkach pamięci operacyjnej o adresach 0x00430F74 i 0x00430F75 została zapisana liczba 510 w postaci 16-bitowej liczby binarnej. Podać zawartość tych komórek w postaci binarnej przy założeniu, że w komputerze stosowana jest konwencja mniejsze wyżej (big endian). W komputerze stosowana jest pamięć o organizacji bajtowej.
```
510 = 0000 0001 1111 1101
0x00430F75 1111 1101 = FDh
0x00430F74 0000 0001 = 02h
```
#### 2.3 W komórkach pamięci operacyjnej o adresach 0x00430F74 i 0x00430F75 została zapisana liczba 1025 w postaci 16-bitowej liczby binarnej. Podać zawartość tych komórek w postaci binarnej przy założeniu, że w komputerze stosowana jest konwencja mniejsze wyżej (big endian). W komputerze stosowana jest pamięć o organizacji bajtowej.
```
1025 = 0000 0100 0000 0001
0x00430F75 0000 0001 = 01h
0x00430F74 0000 0100 = 04h
```
#### 2.4 Na rysunku podana jest zawartość trzech kolejnych bajtów pamięci. Podać zawartość rejestru DX po wykonaniu poniższego fragmentu programu
```
00430E57H 01110010
00430E56H 01010001
00430E55H 11010000
mov ebx, 00430E55H
mov dx, [ebx]
```
```
wynik = 01010001 11010000 = 51 D0
```
## 3. Kodowanie znaków
#### 3.1 Wyjaśnij pojęcie zbioru podstawowego BMP w Unicode.
BMP to zbiór ok. 65 tys najpopularniejszych znaków. Każdy z nich można zapisać na 16 bitach. W kodowaniu UTF16 znaki BMP zajmują 2 bajty, a w kodowaniu UTF8 zajmują od 1 do3 bajtów.
#### 3.2 Ile bitów jest potrzebne do wyrażenia wartości wszystkich punktów kodowych z planu podstawowego BMP. Ile bajtów potrzeba na wyrażenie maksymalnej wartości punktu z BMP przy stosowaniu kodowania UTF-8.
W BMP jest ok. 65tys najpopularniejszych znaków. Każdy z nich można zapisać na 16 bitach. Przy kodowaniu znaków z BMP za pomocą UTF8 można to zrobić na 1,2 lub 3 bajtach. Maksymalna wartość punktu kodowego z BMP będzie więc zapisana w UTF8 na 3 bajtach.
#### 3.3 Podaj wartośc punktu kodowego Unicode dla znaku zapisanego w UTF16:
```
k+3 DC = 1101 1100
k+2 05 = 0000 0101
k+1 D8 = 1101 1000
k 3D = 0011 1101
```
```
UTF16 = D8 3D DC 05 = 1101 1000 0011 1101 1101 1100 0000 0101
p1 = 1101 10 | 00 0011 1101
p2 = 1101 11 | 00 0000 0101
p1+p2 = 00 00 1111 0100 0000 0101 = 0F405
Unicode = 0F405 + 10000 = 1F405
```
## 4. Cykl rozkazowy
#### 4.1 Omówić przebieg cyklu rozkazowego
- pobranie rozkazu z pamięci
- dekodowanie kodu rozkazowego
- obliczenie adresu efektywnego argumentu
- obliczenie adresu fizycznego argumentu
- pobranie argumentu z pamięci
- wykonanie rozkazu
- zapisanie wyniku
- wyznaczenie położenia następnego rozkazu
#### 4.2 Podać sekwencję rozkazów, która umieści w rejestrze EIP wartość 456.
```
push 456
ret
```
#### 4.3 Podaj jak zmienia się wartość rejestru EIP podczas wykonywania programu:
```
mov ecx, 1
ptl:
add bh, [esi]
dec esi
loop ptl
nop
```
Loop najpierw zmniejszy do ECX do zera, a potem sprawdzi warunek, więc EIP będzie liniowo wzrastał, bo skok się nie wykona.
#### 4.4 Co będzie w EIP po ciągu rozkazów
```
mov [eax], 789
xchg esp, [eax]
ret
```
789
#### 4.5 Jak na rejestr EIP wpływają skoki warunkowe?
+ warunek spełniony -> EIP + długość rozkazu w bajtach + zawartość pola adresowego etykiety
+ warunek niespełniony -> EIP + długość rozkazu w bajtach
## 5. Flagi CF i OF
#### 5.1 Rozkazy JG i JA są rozkazami skoku warunkowego, które wykorzystuje się, gdy przy porównaniu liczb. Czym różnią się te rozkazy?
JG służy do porównywania liczb ze znakiem (wykorzystuje flagę OF).
JA służy do porównywania liczb bez znaku (wykorzystuje flagę CF).
#### 5.2 Podaj metodą wyznaczania przez procesor wartości znaczika OF przy rozkazach odejmowania.
OF jest ustawiana na podstawie XOR między przeniesieniami dwóch najstarszych bitów. Jest ustawiana, gdy wynik nie mieści się w rejestrze.
#### 5.3 W jaki sposób procesor wyznacza wartości wpisywane do znaczników CF i OF w trakcie wykonywania dodawania.
CF przyjmuje warość 1 gdy występuje przekroczenie zakresu dla liczb bez znaku. OF przyjmuje wartość 1 gdy występuje przeniesienie z drugiego bitu od lewej na bit znaku lub OF zapala się gdy znak wyniku w kodzie U2 jest nieprawidłowy, np. 5+5=10, a wynikiem w U2 jest 1010 czyli -6.
#### 5.4 Jakiej wartości należy się spodziewać w rejestrze ECX po wykonaniu następującego fragmentu:
```
mov ecx 3003h
etk:
dec cl
jnc etk
```
Pętla będzie nieskończona, ponieważ `dec` nie zmienia flag i wartość ECX będzie oscylować między `30FF` a `3000`.
#### 5.5 Jaka będzie zawartość EDx po wykonaniu instrukcji:
```
mov edx, 1234FFFFh
etk:
inc dx
jc ako
```
Pętla będzie nieskończona, ponieważ `inc` nie zmienia flag i wartość EDX będzie oscylować między `1234FFFF` a `12340000`.
## 6. Tryby adresowania
#### 6.1 Wymień tryby adresowania w architekturze x86.
- natychmiastowe
- bezpośrednie
- rejestrowe
- bazowe
- bazowo - indeksowe
- pośrednie dla skoków
#### 6.2 Wymień tryby adresowania w architekturze x86.
Niedostępne tryby w x86 to autoinkrementacyjne i autodekrementacyjne. Dodatkowo adresowanie pośrednie jest dostępne tylko dla skoków.
#### 6.4 Wyjaśnij różnicę pomiędzy adresami efektywnym, rzeczywistym i wirtualnym.
Adres fizyczny to rzeczywisty numer komórki pamięci, a wirtualny to taki na jakim operuje programista (taki wskazuje EIP). Adres efektywny to adres w pamięci, zawierający argument na którym będzie wykonana operacja.
#### 6.5 Opisz wynik działania programu:
```
xor ebx, ebx
sub ebx, 1
et:
lea ebx, [ebx-8*ebx]
jnc etk
```
Program się nie wykona, bo w adresowaniu nie można odejmować. Jeśli zamienić by ten znak na plus, to przed etykietą ustawi się flaga CF, a EBX będzie równe -1. Lea nie zmienia stanu flag, więc skok się nie wykona.
## 7. Rozmiary operandów
#### 7.1 Dlaczego ponizsza instrukcja jest bledna? `sub [esi + edi], 1`
Brakuje rozmiaru pierwszego z operandów. Poprawna wersja: `sub byte ptr [esi+edi], 1`
#### 7.2 Rozkaz (błędny) `mov esi, dword ptr dh` miał w zamierzeniu autora programu przesłać liczbę z rejestru DH do rejestru ESI. Podać poprawną postać tej operacji przy założeniu, że w DH jest liczba bez znaku.
```
movzx esi, dh
```
#### 7.3 Czy podana poniżej sekwencja jest poprawna? Uzasadnij.
```
mov rbx, offset napis
mov dil, [rbx]
```
Jest poprawna - w x64 wydzielono najmłodsze 8 bitów rejestru RDI, jako rejestr DIL.
#### 7.4 Do rejestru BX wpisano -5. Podaj zawartość rejestru EBX po wykonaniu instrukcji movzx ebx, bx
```
bx = -5 = 1111 1111 1111 1011
ebx = 00 00 FF FB
```
#### 7.5 Czy podana poniżej sekwencja jest poprawna? Uzasadnij.
```
mov rbx, offset napis
mov r8w, [rbx]
```
Tak, w RBX zapisany zostanie adres napisu, a do R8W trafią 2 pierwsze bajty licząc od tego adresu.
#### 7.6 Podaj liczbę, która została wprowadzona do rejestru DI po wykonaniu programu:
```
linie dw 242, 424, 37, -3, 1023, 5, 0
---
mov esi, offset linie+6
mov ebx, 0
mov di, [esi][ebx]
```
```
esi wskazuje na -3, ebx to 0
di = -3 = FF FD
```
#### 7.7 Dlaczego rozkaz `movsx dword ptr [eax], byte ptr [edx]` jest błędny?
Wykorzystano tutaj adresowanie typu pamięć - pamięć, a ten tryb adresowania nie jest dostępny w architekturze x86.
## 8. Stos
#### 8.1 Wśród technik dynamicznego przydziału pamięci dla procesu wykorzystuje się alokacje zmiennych dynamicznych na stosie. W jaki sposób w programie asemblerowym decydujemy o przydzielanej wielkości stosu?
Przy rezerwowaniu pamięci należy zmniejszyć zawartość rejestru ESP o potrzebną nam liczbę bajtów. Analogicznie przy zwalnianiu dodajemy daną liczbę do rejestru ESP.
#### 8.2 W jaki sposób zapisać na stosie zawartość rejestru CL?
```
sub ESP, 1
mov [ESP], CL
```
lub
```
push 0
mov [ESP], CL
```
#### 8.3 Czy podany fragment programu jest poprawny? Uzasadnij odpowiedź.
```
push 11223344h
pop al
```
Nie jest poprawny, ponieważ POP nie przyjmuje 8 bitowych operandów.
#### 8.4 W jaki sposób w kodzie asemblerowym rezerwuje się obszar danych statycznych i dynamicznych.
Dane stytyczne definiuje się w segmencie .data poprzez odpowiednie dyrektywy np. `db`, `dw`. Dane dynamiczne alokuje się poprzez zmniejszanie zawartości rejestru ESP o potrzebną ilość bajtów.
## 9. Podprogramy
#### 9.1 Jakie wady ma stosowanie w podprogramach rejestru ESP zamiast posługiwania się rejestrem pomocnicznym EBP?
Wartość ESP podczas wywołania funkcji może się zmieniać. Korzystając z rejestru EBP mamy dostęp do konkretnego elementu na stosie. Dodatkowo korzystanie z preambuły pozwala nam na łatwy rozdział argumentów (większe od EBP) od zmiennych lokalnych (mniejsze od EBP).
#### 9.2 Co to jest ramka stosu
Jest to obszar stosu w którym zawarte są:
- zmienne lokalne podprogramu
- przekazane parametry
- ślad rozkazu CALL
Cześć ramki stosu jest umieszczana na stosie w chwili wywołania podprogramu, stanowi ona rekord aktywacji. Wskaźnikiem ramki stosu jest rejestr EBP.
#### 9.3 Wyjaśnić czym różni się podany rozkaz `JMP dword PTR [esp]` od rozkazu RET.
Oba rozkazy skoczą do adresu wskazywanego przez wierzchołek stosu, ale ret dodatkowo ten wierzchołek ściągnie.
#### 9.4 Wyjaśnić znaczenie interfejsu ABI
Interfejs ABI to zbiór reguł i ustaleń związany ze współpracą między bibliotekami, programami i systemem operacyjnym na poziomie kodu binarnego. ABI definiuje standard wywołania funkcji, czyli sposób jej wywołania i zasady przekazywania argumentów, wyników.
#### 9.5 Wyjaśnij różnicę między interfejsem ABI i API.
Zarówno API jak i ABI to zbiory reguł i wytycznych opisujących współpracę pomiędzy programami, bibliotekami i systemem operacyjnym. ABI występuje na poziomie kodu binarnego lub skompilowanego, a API dotyczy kodu źródłowego w języku wysokiego poziomu.
#### 9.6 Podaj fragment programu, który zrealizuje te same działania na poziomie instrukcji
```
int procedura()
{
return 0;
}
int (*wsk_funkcja)();
void main()
{
wsk_funkcja = procedura;
wsk_funkcja();
}
```
```
_procedura PROC
mov eax, 0
ret
_procedura ENDP
_main PROC
mov edx, offset procedura
call edx
_main ENDP
```
#### 7. Podaj fragment programu, który zrealizuje te same działania na poziomie instrukcji
```
int procedura()
{
return 0x30;
}
char (*wsk_funkcja)();
void main()
{
wsk_funkcja = procedura;
wsk_funkcja();
}
```
```
_procedura PROC
mov EAX, 30h
ret
_procedura ENDP
_main PROC
mov edx, offset procedura
call edx
_main ENDP
```
## 10. Arytmetyka flag
#### 10.1 Podaj równoważny kod w asemblerze 32 bitowym (k=eax, m=ebx)
```
if (k!=5.0)
{
m = 2.0;
}
else
{
m = 3.0;
}
```
Równoważny kod:
```
cmp eax, 5
setne bl
add ebx, 2
```
#### 10.2 Podaj równoważny ciąg instrukcji bez użycia rozkazów z grupy set.
```
cmp bx, si
sete al
```
```
cmp bx, si
je ustaw
mov al, 0
jmp koniec
ustaw:
mov al, 1
koniec:
```
#### 10.3 Wyjaśnić na przykładzie zastosowanie rozkazu ADC w operacjach dodawania liczb podwójnej precyzji.
Rozkaz ten pozwala na dodawanie liczb 64 bitowych z wykorzystaniem rejestrów 32 bitowych, dzięki temu że uwzględnia przy tym flagę CF, na przykład dodawanie `EDI:ESI` do liczby zapisanej w `EDX:EAX`
```
add EAX, ESI
adc EDX, EDI
```
#### 10.4 Na czym polega różnica między przesunięciem logicznym a przesunięciem arytmetycznym.
Przesunięcie logiczne (`shl` lub `shr`) tylko przesuwa bity w danym kierunku uzupełniając puste miejsca zerami.
Przesunięcie arytmetyczne (`sal`, `sar`) pozwala dzielić lub mnożyć liczby całkowite przez potęgi dwójki. `SAR` uwzględnia znak liczby i nie wpisuje w puste bity zer, lecz powiela wartość pierwszego bitu.
#### 10.5 Napisać fragment programu w ASM dodający do siebie liczby 128-bitowe znajdujące się w RDX:RAX i RDI:RSI
```
add RAX, RSI
adc RDX, RDI
```
## 11. Licznik lokacji
#### 11.1 W jaki sposób w programie asemblerowym można oddziaływać na licznik lokacji?
Bezpośredni dostęp do aktualnej wartości licznika lokacji można uzyskać poprzez symbol `$`. Aby wpisać jakąś wartość do licznika lokacji można wykorzystać dyrektywę `ORG` np. `ORG 60h` wpisze do licznika lokacji wartość `60h`
#### 11.2 Jaką rolę w trakcie asemblacji programu pełni licznik lokacji?
Określa adres komórki pamięci operacyjnej, do której zostanie przesłany aktualnie tłumaczony rozkaz lub dana. Po załadowaniu rozkazu lub danej, licznik lokacji zostaje zwiększony o ilość bajtów zajmowanych przez ten rozkaz lub daną. Przed rozpoczęciem tłumaczenia pierwszego wiersza licznik lokacji zawiera 0.
#### 11.3 Przyjmując, że opcode skoku bezpośredniego jest równy 0EBh, podaj kod rozkazu jmp $+8
Dolar wskazuje na wartość licznika przed wykonaniem rozkazu, więc argumentem skoku będzie 8 - 2, czyli 6 (`06h`).
`wynik = EB 06`
#### 11.4 Przyjmując, że opcode operacji skoku warunkowego jest równy 73h, podaj kod rozkazu jae $-8.
Dolar wskazuje na wartość licznika przed wykonaniem rozkazu, więc argumentem skoku będzie -8 - 2, czyli -10 (`0F6h`).
`wynik = 72 F6`
#### 11.5 W wyniku wykonania poniższego fragmentu do eax wpisano `CAFEBABEh`. Podaj zawartość rejestru EDX, wiedząc, że te rozkazy mov zajmują po 5 bajtów.
```
alfa:
mov eax, offset alfa
mov edx, offset $-5
```
Dolar wskazuje na miejsce przed początkiem danego rozkazu, lub innymi słowy wskazuje na koniec poprzedniego rozkazu. Jeśli poprzedni rozkaz ma długość 5 bajtów i od licznika odejmiemy właśnie te 5 bajtów to trafimy na etykietę. Więc do EDX zostanie wpisany offset tej etykiety - `CAFEBABEh`
## 12. Budowa programu
#### 12.1 Porównać wyznaczanie adresu efektywnego za pomocą instrukcji LEA i operatora OFFSET.
LEA i OFFSET obliczają przesunięcie elementu względem początku segmentu, przy czym rozkaz LEA wyznacza adres efektywny w trakcie wykonywania programu, podczas gdy wartość operatora OFFSET obliczana jest w trakcie translacji (asemblacji) programu.
#### 12.2 Opisz krótko przebieg procesu asemblacji.
Asemblacja jest realizowana dwuprzebiegowa. W pierwszym przebiegu stara się wyznaczyć ilości bajtów zajmowane przez rozkazy i dane oraz zapisuje wszystko w słowniku symboli, a w drugim tworzy kompletną wersję programu w oparciu o słownik.
#### 12.3 Opisz proces tworzenia kodu programu
- Asemblacja - przekształca wiersze źródłowe w ciągi 0/1 z pozostawieniem elastyczności do dołączania podprogramów bibliotecznych. Wynikiem jest plik w języku pośrednim OBJ.
- Konsolidacja/Linkowanie - scalenie modułów OBJ i statycznych modułów bibliotecznych w jeden pojedynczy program typu EXE
- Ładowanie - system operacyjny wpisuje program do pamięci i dokonuje niewielkich zmian w celu dostosowania programu do aktualnego położenia w pamięci
- Wykonywanie - w trakcie dołączane są biblioteki dynamiczne DLL
## 13. Funkcje systemowe
#### 13.1 Czy różni się rozkaz CALL od INT?
Rozkaz CALL wywołuje podprogram z pamięci operacyjnej, zostawiając na stosie ślad w postaci wartości EIP sprzed skoku. Rozkaz INT wywołuje podprogram systemowy i zostawia on na stosie ślad w postaci rejestru znacznikow
EFLAGS, segmentu kodu oraz rejestru EIP.
#### 13.2 W jakich celach używany jest rozkaz INT 80h w aplikacjach w systemie Linux?
Służy on do wywoływania funkcji systemowych na Linux.
#### 13.3 Jaką rolę podczas wywoływania podprogramów systemowych pełni tablica wektorów (deskryptorów) przerwań?
Tablica deskryptorów zawiera 256 adresów 32bit, które są adresami funkcji systemowych. Takie funkcje systemowe są wywoływane w przypadku nadejścia przerwania i je obsługują.
## 14. Dzielenie
#### 14.1 W jaki sposób sygnalizowany jest nadmiar w operacjach dzielenia?
Generowany jest wyjątek procesora nr 0 - błąd dzielenia. Sterowanie przejmuje system operacyjny i może on zakończyć działanie programu.
#### 14.2 W programie wystąpił wyjątek nadmiaru przy dzieleniu. Czy istnieje możliwość kontynuacji tego programu?
Wyjątek ten występuje, gdy wystąpił nadmiar lub dzielono przez zero. eoretycznie wyjątek powoduje blokadę programu ale praktycznie możemy go kontynuować.
#### 14.3. Czas wykonywania operacji dzielenia przez dwa można znacznie skrócić. Jaki rozkaz można do tego wykorzystać?
SAR - bity wychodzące lecą do CF, a skrajnie lewy bit jest powielany, więc działa zarówno dla dodatnich i ujemnych.
#### 14.4 Dlaczego rozkaz `div edx` zawsze powoduje wygenerowanie wyjątku procesora?
Podany rozkaz wykonuje dzielenie liczby 64bitowej (w EDX:EAX) przez 32bitową w EDX. Wyjątek zawsze wystąpi ponieważ rejestr EDX jest jednocześnie starszą częścią dzielnej i dzielnikiem.
`(k^32 + eax) / k` -> wynik zawsze będzie większ od liczby 32 bitowej
## 15. Standard float
#### 15.1 Podać zawartośc komórek pamięci po wykonaniu poniższych rozkazów, wiedząc że na stosie koprocesora była liczba -3.0.
```
mov eax, 0CAFEBABEh
fstp dword ptr [eax]
```
```
-3.0 -> 1.5 * 2^1
1_1000 0000_100 0000 0000 0000 0000 0000 = C0 40 00 00
0CAFEBAC1h C0
0CAFEBAC0h 40
0CAFEBABFh 00
0CAFEBABEh 00
```
#### 15.2 Podać zawartość czterech bajtów pamięci, które zostały zapisane w wyniku wykonania poniższych rozkazów, wiedząc, że na wierzchołku stosu koprocesora znajdowała się liczba o wartości -16.125
```
mov eax, 7E45B8h
fstp dword ptr [eax]
```
```
-16.125 -> (1 + 1/128) * 2^4
1_1000 0011_000 0001 0000 0000 0000 0000 = C1 81 00 00
7E45BBh C1
7E45BAh 81
7E45B9h 00
7E45B8h 00
```
#### 15.3 Na wierzchołku stosu jest zapisana liczba 4.5. Jaka będzie zawartość pamięci po wykonaniu sekwencji rozkazów:
```
mov eax, 10195FC0h
fstp dword ptr [eax]
```
```
4.5 = 1.125 * 2^2
0_1000 0001_001 0000 0000 0000 0000 0000 = 40 90 00 00
10195FC3h 40
10195FC2h 90
10195FC1h 00
10195FC0h 00
```
#### 15.4 Podać zawartośc komórek pamięci po wykonaniu poniższych rozkazów, wiedząc że na stosie koprocesora była liczba 3.25.
```
mov eax, 7E45B8h
fstp dword ptr [eax]
```
```
3.25 = 1.625 * 2^1
0_1000 0000_101 0000 0000 0000 0000 0000 = 40 50 00 00
7E45BCh 40
7E45BBh 50
7E45BAh 00
7E45B9h 00
```
#### 15.5 Podać zawartośc komórek pamięci po wykonaniu poniższych rozkazów, wiedząc że na stosie koprocesora była liczba -7.5
```
mov eax, 7E45B8h
fstp dword ptr [eax]
```
```
-7.5 = 1.875 * 2^2
1_1000 0001_111 0000 0000 0000 0000 0000 = C0 F0 00 00
7E45BBh C0
7E45BAh F0
7E45B9h 00
7E45B8h 00
```
#### 15.6 Podaj iloczyn podanych poniżej dwóch liczb zmiennoprzecinkowych w formacie float:
```
1_01000000_00000000000000000000000
1_11000000_00000000000000000000000
```
Mantysa zerowa, więc są to potęgi dwójki. Obliczamy wykładnik:
```
2 ^ (64 + 128 + 64 - 2*127 (bajas)) = 2^(256 - 254) = 4
```
#### 15.7 Podaj iloczyn poniższych liczb zapisanych w formacie float:
```
0_11000000_00000000000000000000000
1_01000001_10000000000000000000000
```
x - `2^(192-127) = 2^65`
y - `1.5 * 2^(64+1-127) = 1.5 * 2^(-63)`
x*y = `1.5 * 2^(-63) * 2^(65) = 1.5 * 4 = 6`
#### 15.8 Na stosie koprocesora znajdowały się 2 liczby w formacie float. Napisz zawartość 4 bajtów pamięci po wykonaniu rozkazów:
```
st(0) 0_10010111_10101010101010101010101
st(1) 0_10010111_10101010101010101010110
mov eax, 0ABCDEFh
fsub
fst dword ptr [eax]
```
```
wykladnik = 128 + 16 + 7 - 127 = 24
mantysa = 2^(-22) - 2^(-23) = 2^(-23)
wynik = 2^(-23) * 2^(24) = 2
```
#### 15.9 Napisz fragment kodu, który pomnoży liczbę w formacie float z rejestru EAX przez 2/4/8/16/32/64/128.
```
mov edx, offset mnoznik ; log(2^x)
ror eax, 23
add eax, edx
rol eax, 23
```
## 16. Koprocesor arytmetyczny
#### 16.1 Porównaj skutki dzielenia przez zero w rozkazach wykonywanych przez procesor i koprocesor.
Dzielenie przez zero w procesorze powoduje wygenerowanie wyjątku, przekazanie sterowania systemowi operacyjnemu i zazwyczaj zakończenie wykonywania programu. W koprocesorze skutki mogą być różne, w zależności od ustawienia rejestru sterujacego - domyślnie następuje maskowanie wyjątku i wynikiem takiej operacji jest nieskończoność.
#### 16.2 Opisz wynik działania fragmentu kodu asemblera:
```
finit
fmul st(0), st(0)
```
Na wierzchołku koprocesora znajdzie się niezidentyfikowana liczba (1#IND).
#### 16.3 Wyjaśnić w jakich okolicznościach podczas obliczeń wykonywanych przez koprocesor arytmetyczny powstają nieliczby (NaN).
Dowolna wartość zmiennoprzecinkowa z polem wykładnika zawierającym same jedynki i mantysą różną od zera jest traktowana jako nieliczba. Wartości takie wprowadzono w celu reprezentowania wyników niedozwolonych operacji np. pierwiastek z liczby ujemnej.
#### 16.4 Opisz wyjątek niedozwolona operacja w koprocesorze arytmetycznym.
Jest generowany gdy nie możliwe jest żadne inne działanie np. próba obliczenia pierwiastka z liczby ujemnej, próba użycia pustego rejestru stosu. Można kontynuować obliczenia poprzez zamaskowanie IM w rejestrze sterującym kooprocesora. Wynikiem wtedy jest NAN (not a number).
#### 16.5 Wyjaśnić czym różni się zaokrąglanie w kierunku zera od zaokrąglania do liczby najbliższej stosowane w koprocesorze arytmetycznym
W zaokrąglaniu w kierunku zera niezależnie od tego, bliżej której wartości
jest liczba zaokrąglana, zaokrągla się do mniejszej liczby (dla dodatnich) lub do większej liczby (dla ujemnych).
W zaokrąglaniu do liczby najbliższej, zaokrągla się do liczby najbliższej nieskończenie dokładnemu wynikowi. Jeżeli zaokrąglana liczba jest równoodległa od reprezentowalnych wartości, to zaokrąglenie następuje do liczby parzystej.
#### 16.6 Na czym polega różnica między rozkazami FLD i FILD?
FLD wczytuje liczbę na wierzchołek stosu koprocesora a FILD zamienia
liczbę całkowitą na floata i dopiero wtedy pushuje na stos koprocesora.
#### 16.7 Podaj sekwencję rozkazów, która umieści na stosie koprocesora 14.3125
```
push 143125
fild dword ptr [esp]
push 10000
fild dword ptr [esp]
add esp, 8
fdivp st(1), st(0)
```
#### 16.8 Jakie działania należy podjąc aby ewentualne dzielenie przez zero w obliczeniach wykonywanych przez koprocesor arytmetyczny nie powodowało wyjątku?
Należy zmodyfikować rejestr sterujący koprocesora, tak aby przed wykonaniem obliczeń do bitu ZM była wpisana jedynka (rozkaz FLDCW). Wówczas wynikiem dzielenia przez zero będzie nieskończoność
#### 16.9 Czym różnią się od siebie intrukcje FST i FIST?
FST kopiuje wartość z wierzchołka stosu koprocesora arytmetycznego do pamięci w postaci liczby zmiennoprzecinkowej, FIST kopiuje wartość z wierzchołka stosu koprocesora arytmetycznego do pamięci w postaci liczby całkowitej
#### 16.10 Wpisz na wierzchołek stosu koprocesor liczbę -1.
```
push dword ptr -1
fild dword ptr [esp]
add esp, 4
```
#### 16.11 Omówić mechanizm maskowania wyjątków w koprocesorze.
Na mechanizm wyjątków koprocesor ma wpływ jego rejestr sterujący. Pierwsze 6 bitów określa, czy poszczególne sytuacje wyjątkowe mają być maskowane. Komenda `finit` ustawia koprocesor w domyślnym trybie maskowania wszystkich wyjątków.
#### 16.12 Dlaczego wykonanie dzielenia 1.0/4.0 przez koprocesor arytmetyczny nie prowadzi nigdy do wygenerowania wyjątku, natomiast dzielenie 1.0/3.0 może prowadzić do takiego wyjątku?
Ponieważ 1/4 = 0.25 natomiast 1/3 = 0.(3) i nie da się tego zapisać
w pamięci komputera bez zaokrąglania. Wyjątek zostanie wygenerowany
bądź nie - w zależności od ustawień koprocesora
#### 16.13 Co oznacza termin wartości specjalne w kontekście koprocesora arytmetycznego?
Są to wielkości, które nie wynikają z definicji foramtu zmiennoprzecinkowego, ale można je reprezentować w koprocesorze:
- zero dodatnie i ujemne
- nieskończoność dodatnia i ujemna
- nie liczba (niedozwolona operacja)
- liczby zdenormalizowane - liczby na tyle małe, że wykładnik musi byc ujemny, mantysa wynosi 0
#### 16.14 Wyjaśnić na czym polega technika niedomiaru stopniowanego, stosowana w koprocesorze arytmetycznym.
Dla liczb bliskich 0, kiedy nie da się już reprezentować liczby w normalizowanej postaci, wprowadzono liczby zdenormalizowane. Reprezentowane są one przez wyzerowany wykładnik, a część całkowita mantysy wynosi 0. Operacje na operandach nieznormalizowanych generują wyjątki koprocesora.
## 17. Instrukcje blokowe
#### 17.1 Czy możliwe byłoby wykonywanie działań na kolejnych elementach tablic bez użycia modyfikacji adresowych? Uzasadnij odpowiedź.
Tak, można na przykład skorzystać z instrukcji blokowych, które automatycznie modyfikują adres i zapewniają dostęp do kolejnych elementow tablicy.
#### 17.2 Napisz program, który prześle 50 bajtowy obszar, którego początek jest w [ESI] do obszaru, który wskazuje [EDI], przy czym wiadomo docelowy obszar znajduje się mniej niż 50 bajtów od źródłowego.
```
mov ecx, 50
add edi, 49
add esi, 49
std
rep movsb
```
#### 17.3 Podaj równoważny kod w języku C dla poniższego fragmentu:
```
mov edi, offset dana
mov ecx, 10
mov al, '0'
cld
repne scasb
```
Równoważny kod:
```
for (int i=0; i<10; ++i)
{
if (buff[i] == "0") break;
}
```
#### 17.4 W programie są na 4096 bajtowe obszary wskazywane przez ESI i EDI. Napisz program, który porówna zgodność tych obszarów i jeśli są identyczne, to ustawi flagę CF, a jeśli są różne to ustawi jej wartość na 0.
#### 17.5 W programie jest obszar 8192 bajtowy, wskazywany przez EDI. Napisz program, który wypełni ten obszar znakami o punkcie kodowym U+01C2 w kodowaniu UTF-16.
```
cld ; wyzerowanie DF
mov ecx, 4096 ; 8192 byte to 4096 word
mov ax, 01C2h
rep stosw ; wysylaj [edi], ax
```
#### 17.6 Jaki wpływa na wykonywanie niektórych instrukcji ma przedrostek REP?
Przedrostek REP powoduje powtórzenie danego rozkazu ilość razy jaka
znajduje się w rejestrze ECX. Stosowane w rozkazach blokowych.
#### 17.7 Podaj równoważny ciąg instrukcji bez wykorzystania instrukcji blokowych.
```
mov ecx, 120h
std
rep movsb
```
Równoważny kod:
```
mov ecx, 120h
ptl:
mov AL, [ESI]
mov [EDI], AL
inc EDI
inc ESI
loop ptl
```
#### 17.8 W jakich okolicznościach korzysta się z przedrostka REPNE?
Przedrostek REP powoduje wykonanie danego rozkazu tyle razy ile wynosi zawartość reestru ECX. Dodatkowe literały określają warunek, który może przerwać pętlę. Dla NE powtarzaj dopóki argumenty są różne.
#### 17.9 Podaj równoważny kod w języku C:
```
dane dq 3
mov ecx, 32
etk:
cmp dana, 0
ja koniec
inc dana
loop etk
koniec:
```
Równoważny kod:
```
uint_64t dane = 3;
for (int i=32; i>0; --i)
{
if (dane > 0) break;
++dane;
}
```
## 18. Kodowanie rozkazów
#### 18.1 W jaki sposób procesor w trakcie wykonywania programu rozróżnia rozkazy na operandach 16 i 32 bitowych?
Rozkazy wykonywane na 16 bitowych operandach są poprzedzone dodatkowym bajtem o wartości 66h.
#### 18.2 Wyjaśnić przy jakich typach adresowania danych asembler generuje w kodzie rozkazu dodatkowy bajt oznaczony symbolem SIB.
Dodatkowy bajt SIB generowany jest w wypadku adresowania bazowo-indeksowego.
## 19. DMA i układy IO
#### 19.1 Jaką rolę w komputerach pełnią układy wejścia - wyjścia?
Układy wejścia - wyjścia pośredniczą w komunikacji komputera z
urządzeniami zewnętrznymi. Umożliwiają:
- testowanie stanu gotowości urządzenia,
- wysyłanie poleceń do urządzenia oraz
- wysyłanie i przyjmowanie danych.
Z jednej strony dostosowane są do standardów procesora i płyty głównej,
a z drugiej strony są dopasowane do danego urządzenia.
#### 19.2 Omów metody dostępu do rejestrów IO.
Współadresowalne układy IO – rejestry udostępniane są jako zwykłe komórki pamięci w przestrzeni adresowej pamięci, np. komunikacja z pamięcią ekranu
Izolowane IO – rejestry urządzenia dostępne są w odrębnej przestrzeni adresowej zwanej przestrzenią adresową IO lub przestrzenią portów; do przesyłania danych z i do takich układów służą rozkazy IN i OUT
#### 19.3 Wyjaśnij pojęcia przestrzeń adresowa portów.
Odrębna przestrzeń adresowa, w której dostępne są rejestry urządzenia zewnętrznego. Do zapisu i odczytu danych w przestrzeni adresowej portów stosuje się instrukcje IN i OUT oraz ich rozszerzenia.
#### 19.4 Dlaczego stosowanie układów DMA podnosi wydajność przetwarzania?
Gdybyśmy nie korzystali z DMA to wówczas najpierw komunikujemy się z pamięcią za pomocą portów, a potem procesor komunikuje się z pamięcią RAM. Korzystając z DMA mamy możliwość wydania rozkazu układowi zewnętrznemu i wykorzystanie w tym czasie cykli procesora na inne zadania.
#### 19.5 Wyjaśnić zasady działania układów DMA w komputerze.
DMA stosuje techniki bezpośredniego dostępu do pamięci. Moduł DMA otrzymuje od procesora następujące informacje:
- rodzaj operacji (odczyt, zapis)
- adres urządzenia wejścia-wyjścia
- adres obszaru pamięci RAM przewidzianego do odczytania lub zapisania
- liczba bajtów, które mają być odczytane lub zapisane
Na podstawie otrzymanych danych moduł DMA uruchamia przesyłanie
danych, natomiast procesor kontynuuje inne prace, po zakończeniu
przesyłania moduł DMA wysyła sygnał przerwania do procesora.
## 20. Klawiatura i pamięć ekranu
#### 20.1 Zasady przesyłania danych z klawiatury do komputera na poziomie przesłania sygnałów elektrycznych.
Do mikrokontrolera podłączony jest dekoder (wiersze, 4xIN, 16xOUT) i multiplekser (kolumny, 3xADRES, 8xIN, 1xOUT). Dekoder w zależności od wejścia w danej chwili zapala jedno z 16 wyjść. Multiplekser na podstawie adresów pobiera wartość danego wejścia i przekazuje je do mikrokontrolera. Do zakodowania znaku potrzeba więc 7 bitów, a 8 bit mówi o tym, czy znak jest wciśnięty, czy zwolniony. Taki kodowy kod jest wysyłany szeregowo do kontrolera 8041.
#### 20.2 Omówić sposób odwzorowania zawartości pamięci ekranu (w trybie tekstowym) na postać tekstu wyświetlanego na ekranie.
Rozdzielczość ekranu trybu tekstowego wynosi 80x25 znaków, każdy z nich zajmuje dwa bajty w pamięci. Pierwszy z nich zawiera kod ASCII znaku, a drugi jego sposób wyświetlania. Adresy w tym trybie zaczynają się od komórki o adresie B8000h. Znaki wypełniane są od lewego górnego rogu od lewej do prawej po czym następuje przejście do następnego wiersza
#### 20.3 Omówić sposób odwzorowywania zawartości pamięci ekranu w trybie graficznym 13H na postać obrazu wyświetlonego na ekranie.
Rozdzielczość ekranu trybu graficznego wynosi 320x200 pikseli.Każdy piksel to jeden bajt w pamięci który określa jego kolor. Adresy w tym trybie zaczynają się od komórki o adresie A000h. Piksele wypełniane są od lewego górnego rogu od lewej do prawej po czym następuje przejście do następnego wiersza.
#### 20.4 Opisz rolę kontrolera klawiatury.
Kontroler klawiatury (np. 8042) odbiera sygnał od mikrokontrolera i bezpośrednio komunikuje się z procesorem. Odbiera on kody naciśnięcia lub zwolnienia, odtwarza kod pozycji i wpisuje go do bufora wyjściowego i uaktualnia rejestr stanu kontrolera.
#### 20.5 W komunikacji z klawiaturą używane są kody pozycji i kody naciśnięcia. Czym różnią się one i który z nich można odczytać poprzez port 60h?
- scan code jest to ustalony kod 8-bitowy przyporządkowany do danego przycisku klawiatury
- make code jest formowany przez mikrokontroler ponaciśnięciu dowolnego klawisza, a następnie przesyłany do układów płyty głównej komputera.
- Mikrokontroler odtwarza oryginalny kod pozycji i udostępnia go w porcie 60H
Kody naciśnięcia nie są identyczne z kodami pozycji, nie występują na poziomie programowania. Różnice mogą wynikać chociażby z konieczności rozróżnienia klawiszy CTRL.
## 21. Sterowanie urządzeniami
#### 21.1 W jakich okolicznościach wskazane jest używanie metody aktywnego oczekiwania w trakcie obsługi urządzeń zewnętrznych komputera?
Używanie metody aktywnego oczekiwania jest wskazane tylko dla nieskomplikowanych urządzeń, w których procesor jest mało obciążony.
Jeśli bardzo rzadko odpytujemy i porcje danych są małe to należy zastosować model aktywnego odpytywania, bo metoda przerwań jest bardzo skomplikowana i uciążliwa w implementacji.
#### 21.2 Dlaczego blokuje się możliwości sterowania pracą urządzeń zewnętrznych przez programy użytkowe?
- komplikacja sterowania, możliwość uszkodzenia
- problemy z kolizjami tj. w systemach operacyjnych Windows, Linux działa wiele procesów i każdy z nich mógłby oddziaływać na te urządzenia
- problem związany z bezpieczeństwem
- złożoności urządzeń zewnętrznych
- konieczność ochrony podprogramów systemowych przed uszkodzeniem przez program użytkownika
#### 21.3 Wyjaśnij jaki jest wpływ obsługi przerwań na zużycie energii w nowoczesnych procesorach.
Przy szybkiej transmisji danych i dużej liczie zgłaszanych przerwań może wystąpić znaczne obciążenie procesora spowodowane koniecznością przełączania kontekstu między użytkownikiem i system operacyjnym. Wówczas lepszym rozwiązaniem może okazać się metoda aktywnego oczekiwania.
#### 21.4 Jaką zasadniczą wadę w technice obsługi urządzeń zewnętrznych komputera ma metoda aktywnego oczekiwania?
Aktywne oczekiwanie wprowadza program w pętlę, w której program czeka na gotowość urządzenia do odebrania sygnału. W tej pętli program nie wykonuje nic innego, marnowany jest więc czas, który procesor mógłby poświęcić na pracę innego procesu.
#### 21.5 Wyjaśnij co oznacza termin priorytet przerwania
Przerwaniom sprzętowym przypisano priorytety, są to liczby określające ważność przerwania w sensie kolejności wykonywania. Mniejsza liczba oznacza wyższy priorytet. Najwyższy priorytet posiada przerwanie generowane przez segar systemowy. Możliwe jest przerwanie programu obsługi przerwania, jeśli nadejdzie przerwanie o wyższym priorytecie. Warunkiem przyjęcia przerwania jest stan znacznika IF=1, w praktyce programy obsługi przerwań na czas swojego działania zerują znacznik IF
## 22. Przerwania i wyjątki
#### 22.1 Jakie znaczenie ma flaga IF w obsludze przerwan?
Gdy jest ustawiona na 1, pozwala na przyjmowanie przerwań o wyższym priorytecie.
#### 22.2 W trybie 64 bitowym pod adresem fizycznym 12345h znajduje się nowa procedura obsługi przerwania klawiatury(nr 9, IRQ1). Podaj sekwencję rozkazów, która nadpisze w tablicy wektorów przerwań właściwe wartości.
```
mov ax, 1234H
mov bx, 5h
cli ; blokowanie przerwan
mov ds:[4*9], bx
mov ds:[4*9+2],ax
sti ; odblokowanie przerwan
```
#### 22.3. Czy można zablokować przyjmowanie przerwań sprzętowych i wyjątków przez procesor? Jeśli tak, to w jaki sposób.
Można zablokować przyjmowanie przerwań i wyjatków, takich które są maskowalne. Zrobić to można poprzez wyzerowanie znacznik IF - rozkaz `CLI`.
#### 22.4 Wymienić główne działania jakie podejmuje procesor po nadejściu przerwania sprzętowego lub wyjątku.
W trakcie wykonywania programu przez procesor występują sytuacje uniemożliwiające dalsze wykonywanie programu. Wystapienie takich sytuacji powoduje wygenerowanie wyjątku przez procesor. Wyjątek powoduje zapamiętanie śladu na stosie, wyzerowanie znacznika IF i rozpoczęcie wykonywania podprogramu właściwego dla określonego wyjątku.
#### 22.5 W przypadku stosowania pamięci wirtualnej pojawia się dość często wyjątek nr 14: błąd stronicowania. Wyjaśnić jego przyczyny.
Błąd ten generowany jest jeśli odwołanie dotyczy strony aktualnie nieobecnej w pamięci operacyjnej.
#### 22.6 Kiedy procesor generuje wyjątek nr 6
Jest to wyjątek `niedozwolony kod`, w którym procesor napotkał instrukcję, której kodu nie jest w stanie rozpoznać.
#### 22.7 Wymień i opisz rodzaje wyjątków procesora.
- niepowodzenia – wykonywany rozkaz spowodował błąd, rozkaz można ponowić na podstawie śladu
- pułapki – wiemy, że jakiś problem występuje i próbujemy go znaleźć, przykładem jest debugowanie
- nienaprawialne – nie można zlokalizować błędnego rozkazu ani kontynuować programu, skutkiem jest zatrzymanie pracy maszyny
#### 22.8 Co to są przerwania maskowalne i czym różnią się od przerwań niemaskowalnych?
Przerwania niemaskowalne są to przerwania sprzętowe, które nie mogą być blokowane przez wyzerowanie znacznika IF. Stosowane są do sygnalizacji zdarzeń wymagających natychmiastowej obsługi niezależnie od stanu systemu, na przykład w przypadku wykrycia błędu pamięci RAM.
## 23. Pamięć podręczna
#### 23.1 Określić możliwość realizacji 4 kanałowej pamięci podręcznej o odwzorowaniu tylko asocjacyjnym.
Pamięć wielokanałowa wykorzystuje zarówno adresowanie bezpośrednie, jak i asocjacyjne, więc chyba nie można.
#### 23.2 Opisać technikę asocjacyjnego dostępu do pamięci podręcznej.
Adres dzielimy na etykietę i offset (4 bity). Funkcja etykiety jest taka, że w pierwszej kolumnie pamięci podręcznej szukamy takiej samej wartości. Jeśli będzie taka sama, to odczytujemy odpowiedni blok za pomocą offsetu. Wykorzystuje się tutaj wielki komparator o skomplikowanej budowie, który w jednym cyklu zegarowym sprawdza, czy dana etykieta występuje. Adresowanie asocjacyjne jest więc szybsze, ale też o wiele droższe i dlatego wykorzystuje się ten tryb do małych pamięci.
#### 23.3 Podaj numer linii i wartość etykiety, które należy sprawdzić w pamięci podręcznej o adresowaniu bezpośrednim przy wykonaniu następujacej sekwencji rozkazów. Adresowanie 32 bitowe, rozmiar pamięci podręcznej 256kB, rozmiar linii 32 bajty.
```
mov esi, 10195FC0h
mov al, [esi]
```
```
liczba linii = 256kB / 32b = 2^18 / 2^5 = 2^13
offset = log(32) = 5
numer linii = log(2^13) = 13
etykieta = 32 - 13 - 5 = 14
etykieta_linia_offset = 00010000000110 + 0101011111110 + 00000
```
#### 23.4 Podać rozmiar pamięci podręcznej (rozmiar obszaru danych tej pamięci) o adresowaniu bezpośrednim, czterokanałowej, jeśli przyjęto adresowanie 48 bitowe i etykieta 12 bitów, offset 6 bitów
```
numer linii = 48 - 12 - 6 = 30
liczba linii = 2^30
rozmiar = 4 * 2^30 * 2^6 = 2^38 = 256 GB
```
#### 23.5 Dlaczego w pamięciach podręcznych o dużych rozmiarach stosowane nie jest adresowanie asocjacyjne.
W adresowaniu asocjacyjnym z każdym wierszem pamięci podręcznej jest związany oddzielny komparator, dzięki czemu wyszukiwanie może odbywać się we wszystkich liniach jednocześnie. Jest to jednak bardzo kosztowne i skomplikowane, dlatego nie nadaje się do pamięci o większych rozmiarach.
#### 23.6 Podać rozmiar pamięci podręcznej o adresowaniu bezpośrednim, czterokanałowej, jeśli przyjęto adresowanie 24 bitowe, rozmiar etykiety 16 bitów i offset 4 bity.
```
liczba linii = 2^(24 - 16 - 4) = 2^4
rozmiar linii = 2^4
rozmiar cache = 4 * 2^4 * 2^4 = 2^10 = 1kB
```
#### 23.7 Pamięć podręczna jednokanałowa o adresowaniu 32 bitowym ma w lini 16 bajtów. Podaj liczbę linii, wiedząc że etykieta zajmuje 12 bitów.
```
wynik = 2^(32 - etykieta - log(16)) = 2^(32-12-4) = 2^16
```
#### 23.8 Wyjaśnić koncepcję pamięci podręcznej dwukanałowej.
W pamięci dwukanałowej, w jednym wierszu znajdują się jednocześnie dwa bloki pamięci o identycznym polu obszaru, różniące się etykietą. Po wybraniu odpowiedniej linii trzeba sprawdzić, czy najstarsze bity adresu są identyczne z polem jednej albo drugiej etykiety — jeśli tak, to wystąpiło trafienie. Podany schemat wymaga wprawdzie wykonania dwóch porównań zamiast jednego, ale pozwala na zwiększenie prawdopodobieństwa trafienia.
## 24. Architektura
#### 24.1 Opisać układ i hierarchnię pamięci podręcznej stosowanej w procesorze Intel Core i7.
Wszystkie procesory z rodziny Core i7 mają taką samą ilość pamięci
cache:
- po 32KB dla pamięci instrukcyjnej i pamięci danych na każdy z rdzeni (L1)
- po 256KB współdzielonej pamięci L2 na każdy z rdzeni
- 8MB współdzielonej pamięci L3 wspólnej dla wszystkich rdzeni.
#### 24.2 W tradycyjnym modelu hierarchii układów pamięci pamięć podręczna L2 jest pamięcią off-chip. Ten stan rzeczy w nowoczesnych architekturach uległ zmianie i obecnie L2 jest pamięcią on-chip. Wyjaśnij przyczynę tego zjawiska. Na czym polega zatem różnica między pamięcią L1 i L2?
Pamięć on-chip to taka pamięć, z którą procesor może komunikować się w każdym cyklu i jeśli jest umieszczona na płytce z procesorem przyśpiesza po prostu komunikację. L1 jest dzielona na osobne bloki dla danych i rozkazów (architektura harwardzka), a L2 to jeden blok pamięci (architektura von neumana).
#### 24.3 Podać przyczynę stosowania oddzielnej pamięci podręcznej L1 dla rozkazów i dla danych w procesorach Intel Core i7. Jak nazywa się ten rodzaj architektury?
Jest to architektura harwardzka. Podział na mniejsze bloki pozwala na szybsze wykonywanie operacji kosztem właśnie rozmiaru pamięci.
#### 24.4 Wymień obszary zastosowań architektury harwardzkiej w procesorach Intel Core.
W procesorach Intel Core każdy rdzeń ma 2 bloki pamięci podręcznej L1, gdzie jeden przechowuje rozkazy, a drugi dane, więc jest to architektura harwardzka.
#### 24.5 Na czym polega przewaga architektury harwardzkiej nad klasyczną architekturą von Neumana?
Główną zaletą architektury harwardzkiej jest to, że nie występuje tu wąskie gardło i możliwe jest jednoczesnie pobieranie danych i rozkazów, co przekłada się na większa szybkość.
#### 24.6 Architektura harwardzka - wyjaśnij i podaj przykład zastosowania
Dane i rozkazy są przechowywane w osobnych pamięciach. Przykładem jest procesor Intel Core, gdzie pamięć podręczna L1 jest rozbita na dwie pamięci: pamięć danych i pamięć rozkazów.
## 25. Pamięć operacyjna
#### 25.1 Wyjaśnij koncepcję wyrównywania adresów danych w pamięci operacyjnej i wpływ na wydajność nowoczesnych procesorów.
Przy odczycie jednego bajta w trybie 64 bitowym tak naprawdę pobieramy 64 bity. Odczytuje on zawsze 8 bajtów rozpoczynając od adresu podzielnego przez 8. Jeśli odczytujemy słowo podzielone nienaturalnie to marnujemy pamięć, no i muszą wystąpić dwa cykle zegarowe, aby odczytać daną.
#### 25.2 Co oznacza określenie wyrównanie naturalne w odniesieniu do położenia danych w pamięci? Jakie wady ma program, w którym dane nie są wyrównane naturalnie?
Wyrównanie naturalne oznacza, że dane znajdują się w pamięci pod adresem podzielnym przez ich długość w bajtach. Brak wyrównania naturalnego jest bardzo niekorzystny, ponieważ wówczas procesor do pobrania danych z pamięci potrzebować większej ilości cyklów zegara.
#### 25.3 Ile linii adresowych potrzebnych jest do adresowania fizycznej pamięci o pojemności 64GB?
```
wynik = log(64 GB) = loga(2^6 * 2^30) = 2^36
```
#### 25.4 Podać maksymalną wielkość pamięci fizycznej RAM, jeśli zastosowano 40 bitową szynę adresową.
2^40 = 2^30 kB = 2^20 MB = 2^10 GB = 1 TB
#### 25.5 Podaj i objaśnij podstawową różnicą w działaniu pamięci SDRAM i DRAM.
Zwykła pamięć DRAM jest pamięcią asynchroniczną. Oznacza to zamrażanie pracy procesora na pewien czas w celu odświeżania zawartości komórek pamięci. Pamięć SDRAM działa synchronicznie, czyli wykorzystuje do odświeżania te cykle zegara, w których procesor nie korzysta z pamięci
#### 25.6 Przedstawić budowę komórki pamięci SRAM.
Przerzutnik dwustanowy złożony z 6 tranzystorów. Pamięta stan, ale wymaga ciągłego zasilania.
+ szybkość i brak konieczności odświeżania
- mały stopień scalenia, wysoka cena i pobór mocy
#### 25.7 W jaki sposób długość cyklu zegarowego wpływa na przepustowość pamięci SDRAM. Uzasadnij odpowiedź.
Długość cyklu zegarowego wpływa na przepustowość pamięci SDRAM ponieważ jest to pamięć synchroniczna, która jest odświeżana zgodnie z cyklem zegara podczas gdy pamięć ta nie jest aktualnie używana.
#### 25.8 W jaki sposób długość cyklu zegarowego wpływa na przepustowość pamięci DRAM. Uzasadnij.
#### 25.9 Podaj definicję czasu dostępu do pamięci.
Procesor aby uzyskać zawartość interesującej go komórki pamięci musi określić jej adres - słowo binarne wystawiane na magistrali adresowej. Po ustabilizowaniu się adresu generowany jest sygnał sterujący, po którym układ pamięci odczytuje zawartość komórki i wystawia na magistralę danych. Odczyt danych odbywa się z pewnym opóźnieniem. Czas opóźnienia jest określany jako czas dostępu do pamięci
#### 25.10 Podaj definicję czasu cyklu w dostępie do pamięci.
Czas cyklu obejmuje czas dostępu i pewien dodatkowy czas jaki musi upłynąć, aby pamięć wróciła do stanu gotowości do następnego dostępu po zaniku stanów przejściowych i poprzednich danych.
#### 25.1. Podaj definicję atrybutu CL przy dostępie do pamięci RAM.
CAS latency – czas utajenia mierzony liczbą cykli zegara, jaki upływa między wysłaniem przez kontroler pamięci RAM żądania dostępu do określonej kolumny pamięci a otrzymaniem danych z tej kolumny przez kontroler. Im niższa jest wartość CAS latency, tym mniej czasu potrzeba na pobranie danych z pamięci.
## 26. Operacje wektorowe
#### 26.1 Jaka będzie zawartość rejestru MM0 po wykonaniu rozkazu `PADDUSB mm0, mm1`, jeśli prze wykonaniem rejestry zawierały:
```
mm0 = F7 F8 FA FC FB FC FD FE
mm1 = 06 06 06 06 03 03 03 03h
```
```
; dodajemy bajty z nasyceniem
mm0 = FD FE FF FF FE FF FF FF
```
#### 26.2 Scharakteryzować AVX jako rozszerzenie zestawu instrukcji SSE.
Grupa rozkazów AVx korzysta z 16 rejestrów 256 bitowych, w których młodszą połowę stanowią rejestry SSE. Pozwala na zapisywanie w rejestrze np. 8 liczb w standardzie float lub 4 w standardzie double.
#### 26.3 Na czym polega różnica między przesunięciem logicznym i arytmetycznym?
Przesunięcia logiczne (SHL, SHR) uciekający bit wpisują do CF, a do pustych bitów wpisują zera. Przesunięcie arytmetyczne to SAL i SAR. Rozkaz SAL działa tak samo jak SHL, a rozkaz SAR bity uciekające wpisuje do CF, a do pustych wpisuje powieloną wartość pierwszego bitu.
#### 26.4 Omówić formaty danych stosowane przez rozkazy MMX i SSE.
Rozkazy grup MMX i SSE należą do instrukcji typu SIMD, czyli pozwalają na operowanie na kilku liczbach niewielkich rozmiarów.
Instrukcje MMX
- liczby całkowite w rejestrach 64 bitowych
- 8x8bit lub 4x16bit lub 2x32bit
Instrukcje SSE
- liczby zmiennoprzecinkowe w rejestrach 128 bitowych
- 4xfloat lub float na 32 najmłodszych bitach
#### 26.5 Co oznacza termin arytmetyka nasycenia w odniesieniu do operacji MMX?
W arytmetyce nasycenia, gdy wynik przekracza wartość minimalną/maksymalną, za wynik przyjmuje się tę wartość, niezależnie, jak bardzo różni się od rzeczywistego wyniku. Wykorzystuje się to np. w przetwarzaniu obrazów.