Przykładowe pytania egzaminacyjne i zadania z „Architektury komputerów”
czerwiec 2009
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ć.
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.
Wywołanie podprogramu przy CF = 1 powinno powodować jego natychmiastowe zakończenie bez zmiany rejestru EAX i znacznika CF. Dodatkowo zakładamy, że w programie głównym znacznik CF jest zerowany przed wywołaniem omawianego podprogramu. Rozkaz STC wpisuje 1 do CF, rozkaz CLC zeruje CF.
Wartość funkcji obliczyć metodą rekurencyjną korzystając z zależności:
n! = n * (n-1)! dla n > 1
n! = 1 dla n = 1
7. Napisać podprogram w asemblerze obliczający wartość elementu o indeksie k (który podany jest w rejestrze BH) w ciągu liczb Fibonacciego. Obliczoną wartość funkcji wpisać do rejestru EAX. Obliczeń nie należy wykonywać, jeśli wartość k przekracza 47 — w tym przypadku należy wpisać 1 do znacznika CF, w przeciwnym razie wyzerować CF.
Rozkaz STC wpisuje 1 do CF, rozkaz CLC zeruje CF.
F (k) = F (k - 1) + F (k - 2) dla k > 2
F (k) = 1 dla k = 1, 2
Programowanie mieszane
9. Funkcja biblioteczna języka C o podanym prototypie
char *strstr( const char *string, const char *strCharSet );
zwraca wskaźnik określający miejsce pierwszego wystąpienia ciągu znaków strCharSet w łańcuchu znaków string. Przykładowo, jeśli niżej zdefiniowana tablica zajmuje obszar pamięci począwszy od adresu 0012FF78H
char tablica [ ] = "abcdef";
to funkcja
wsk = strstr(tablica, „cd”);
zwróci wartość 0012FF7AH.
Napisać podprogram w asemblerze, przystosowany do wywoływania z poziomu języka C (w trybie 32-bitowym), realizujący podaną funkcję. Każdy łańcuch znaków zakończony jest bajtem zerowym.
10. W pewnym programie obszar pamięci zawierający n bajtów jest traktowany jako rejestr k bitowy (k = n * 8). W rejestrze AX podany jest 16-bitowy ciąg zerojedynkowy. Dodatkowo, w rejestrze BX podany jest ciąg bitów określający „ważność” bitów w AX. 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 AX 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 AX z zawartością rejestru należy brać pod uwagę tylko te bity AX, którym odpowiadają jedynki na bitach rejestru BX — porównania z bitami, którym odpowiadają zera należy ignorować.
Operacje bitowe
42. W pewnym programie obszar pamięci zawierający n bajtów jest traktowany jako rejestr (n*8) bitowy. Napisać podprogram w asemblerze, który będzie realizował przesunięcie cykliczne (obrót) zawartości tego rejestru w prawo o zadaną liczbę bitów p.
...
raffaelle