Przykładowe pytania egzaminacyjne i zadania z „Architektury komputerów”
maj 2008
Pytania mają charakter przykładowy i nie obejmują całego materiału wymaganego do egzaminu.
A. Podstawowe zasady działania komputera
B. Kodowanie danych i instrukcji
0100 0000 1111 1000 0000 0000 0000 0000
C. Mechanizmy adresowania
D. Programowanie w asemblerze
E. Operacje stosu i podprogramy
F. Lista rozkazów (instrukcji) procesora
G. Sterowanie pracą urządzeń zewnętrznych
H. Architektury CISC i RISC
I. Proste przykłady kodowania w asemblerze
1. Wskazać błędy zawarte w podanych niżej fragmentach programów (niektóre fragmenty nie zawierają błędów)
a)
k EQU 1024
– – – – – – – – – – – – – – – – – – – – – –
mov k, ax
b)
temp db ?
mov temp, ax
c)
t3 db 10
mov temp, t3
2. Podać kilka instrukcji zerujących rejestr AX.
3. Czym różni się działanie poniższych instrukcji
mov ebx, OFFSET table+4
lea ebx, table+4
Zadania przykładowe
Rozwiązania wszystkich podanych zadań należy podać w języku asemblera dla procesorów zgodnych z architekturą IA–32 i ewentualnie częściowo w języku C. W rozwiązaniach zadań nie należy stosować rozkazów koprocesora arytmetycznego, chyba że w treści zadania jest to zalecane. W zadaniach polegających na napisaniu podprogramu napisać także przykładowy kod wywołujący opracowany podprogram.
1. Poniżej podano kod (niepełny) podprogramu w asemblerze, który zwiększa o 1 liczbę zmiennoprzecinkową w formacie double. Podprogram przystosowany jest do wywoływania z poziomu języka C, a jego prototyp ma postać:
double plus_jeden (double x);
Nie używając rozkazów koprocesora, uzupełnić brakujący fragment podprogramu, przy założeniu, że liczba x jest większa od 1, a zawartość pola wykładnika (w formacie double) należy do przedziału <1023, 1075>. Uwaga: po wykonaniu dodawania przeprowadzić normalizację liczby.
_plus_jeden PROC
push ebp
mov ebp, esp
push ebx
push esi
push edi
mov eax, [ebp+8] ; odczytanie liczby
mov edx, [ebp+12] ; w formacie double
; wpisanie 1 na pozycji o wadze 2^0 mantysy
; do EDI:ESI
mov esi, 0
mov edi, 00100000H
; wyodrębnienie pola wykładnika (11-bitowy)
; bit znaku liczby z założenia = 0
mov ebx, edx
shr ebx, 20
; obliczenie pierwotnego wykładnika potęgi
sub ebx, 1023
; zerowanie wykładnika i bitu znaku
and edx, 000FFFFFH
; dopisanie niejawnej jedynki
or edx, 00100000H
— — — — — — — — — — — — — —
; załadowanie obliczonej wartości z EDX:EAX
; na wierzchołek stosu koprocesora
push edx
push eax
fld qword PTR [esp]
add esp, 8
pop edi
pop esi
pop ebx
pop ebp
ret
_plus_jeden ENDP
2. W pewnym programie obszar pamięci zawierający n bajtów jest traktowany jako rejestr k bitowy (k = n * 8). W rejestrze AL podany jest 8-bitowy ciąg zerojedynkowy. Dodatkowo, w rejestrze BL podany jest ciąg bitów określający „ważność” bitów w AL. Adres obszar znajduje się w rejestrze ESI, a liczba n w rejestrze ECX.
Napisać podprogram w asemblerze, który sprawdzi czy ciąg bitów znajdujący się w rejestrze AL znajduje się rejestrze k-bitowym. Jeśli tak, to znacznik CF powinien być ustawiony w stan 1, w przeciwnym razie wyzerowany. W trakcie porównania ciągu w AL z zawartością rejestru należy brać pod uwagę tylko te bity AL, którym odpowiadają jedynki na bitach rejestru BL — porównania z bitami, którym odpowiadają zera należy ignorować.
3. W programie w języku C zdefiniowano 48-bitowy typ UINT48, w którym kodowane są liczby stałoprzecinkowe bez znaku zawierające część całkowitą i ułamkową, tak jak pokazano na rysunku.
Napisać podprogram w asemblerze przystosowany do wywoływania z poziomu języka C, który zamieni liczbę zmiennoprzecinkową q na liczbę w podanym formacie. Prototyp podprogramu na poziomie języka C ma postać
UINT48 float2uint48 (float q);
Zalecenia i wskazówki:
1. Podprogram powinien pozostawić obliczoną wartość w rejestrach EDX:EAX (najstarsze 16 bitów rejestru EDX jest nieużywane).
2. Przyjąć, że liczba zmiennoprzecinkowa jest dodatnia i mniejsza od 232.
4. W programie w języku C zdefiniowano 48-bitowy typ UINT48, w którym kodowane są liczby stałoprzecinkowe bez znaku zawierające część całkowitą i ułamkową, tak jak pokazano na rysunku.
Napisać podprogram w asemblerze przystosowany do wywoływania z poziomu języka C, który zamieni liczbę p w podanym formacie na 32-bitową liczbę zmiennoprzecinkową. Prototyp podprogramu na poziomie języka C ma postać
float uint48_float (UINT48 p);
5. W pamięci operacyjnej, w obszarze wskazanym przez adres podany w rejestrze EBX znajduje się 96-bitowa liczba binarna całkowita bez znaku. Napisać podprogram wyświetlający na ekranie postać dziesiętną tej liczby. Rozwiązanie zadania powinno zawierać przekształcenia algebraiczne opisujące sposób wyznaczania reszty z dzielenia liczby 96-bitowej przez 10.
Wskazówka: operacje wykonywać na rejestrach 32-bitowych.
Komentarz do zadania.
Maksymalną ilość cyfr liczby 96-bitowej można wyznaczyć z zależności . Logarytmując obustronnie przy podstawie 10 uzyskujemy x = 96 log 2, skąd . Zatem liczba 96-bitowa ma 29 cyfr (np. liczba ma 7 cyfr).
Obliczenie reszty z dzielenia liczby 96-bitowej przez 10 przebiega tak:
Podany sposób obliczenia można zilustrować w arytmetyce dziesiętnej. Przypuśćmy, że dostępny jest arytmometr dziesiętny wykonuje dzielenie 4-cyfrowej liczby dziesiętnej przez 2-cyfrową liczbę dziesiętną, przy czym iloraz i reszta mogą być co najwyżej liczbami 2-cyfrowymi (inaczej powstanie nadmiar).
Liczbę 673 314 dzielimy przez 12. Rozbijamy liczbę na 3 grupy 2-cyfrowe, tj. 67 33 14. I wykonujemy dzielenia:
Obliczenia rekurencyjne
6. Napisać podprogram w asemblerze obliczający wartość funkcji silnia dla argumentu podanego w rejestrze AL. Obliczoną wartość funkcji wpisać do rejestru EAX. Jeśli obliczona wartość nie mieści się w rejestrze EAX, to należy wpisać 1 do znacznika CF, w przeciwnym razie wyzerować CF.
...
djronin