AKO_egz_pyt_zad.doc

(171 KB) Pobierz
Przeredagowany tekst zadań używanych na sprawdzianach laboratorium AKO w semestrze zimowym 2007/2008

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

 

  1. Omówić podstawowe zasady wykonywania programu przez procesor.
  2. Porównać własności różnych rodzajów pamięci stosowanych w komputerach.
  3. Omówić podstawowe tryby pracy procesorów zgodnych z architekturą IA–32
  4. W jaki sposób zmienia się zawartość wskaźnika instrukcji EIP w procesorach klasy IA–32 w trakcie wykonywania różnych typów rozkazów.
  5. Scharakteryzować grupę instrukcji procesora określanych jako operacje bitowe.

 

 

B. Kodowanie danych i instrukcji

 

  1. Omówić różne rodzaje kodowania liczb binarnych w komputerze.
  2. W jaki sposób w procesorach zgodnych z architekturą IA–32 sygnalizowane jest wystąpienie nadmiaru w operacjach dodawania, odejmowania, mnożenia i dzielenia na liczbach stałoprzecinkowych?
  3. Na czym polegają różnice w sposobie przechowywania liczb w pamięci znane jako mniejsze niżej (ang. little endian) i mniejsze wyżej (ang. big endian)?
  4. Omówić technikę porównywania liczb stałoprzecinkowych stosowaną w architekturze IA–32.
  5. Wyznaczyć wartość dziesiętną 32-bitowej liczby zmiennoprzecinkowej

0100 0000 1111 1000 0000 0000 0000 0000

  1. Co oznacza termin wartości specjalne używany w kontekście koprocesora arytmetycznego.
  2. Jakie rodzaje zaokrąglenia stosuje się w koprocesorze arytmetycznym?
  3. Wyjaśnić na czym polega technika niedomiaru stopniowanego, stosowana w koprocesorze arytmetycznym.
  4. Czym różnią się rozkazy koprocesora arytmetycznego: FLD i FST?
  5. Wyjaśnić w jakim celu zdefiniowano nieliczby (NaN) w koprocesorze arytmetycznym.
  6. Omówić zasady wykonywania operacji arytmetycznych na liczbach wielokrotnej długości.
  7. Omówić podstawowe zasady kodowania rozkazów procesora.
  8. W jakim celu kod rozkazu poprzedza się przedrostkiem zmiany rodzaju operandu?

 


C. Mechanizmy adresowania

 

  1. Omówić podstawowe koncepcje modyfikacji adresowych.
  2. Porównać wyznaczanie adresu efektywnego za pomocą instrukcji LEA i operatora OFFSET.
  3. W jakim celu stosowany jest współczynnik skali w modyfikacjach adresowych?
  4. W jakim celu niektóre rozkazy poprzedza się przedrostkiem zmiany rozmiaru argumentu (66H)?

 

 

D. Programowanie w asemblerze

 

  1. Omówić trzy podstawowe formaty wierszy źródłowych w asemblerze.
  2. Jaką rolę pełnią dyrektywy w programie asemblerowym.
  3. Jak należy rozumieć termin licznik lokacji w kontekście programu asemblerowego?

 

 

E. Operacje stosu i podprogramy

 

  1. W jaki sposób rozkazy PUSH i POP wpływają na stan wskaźnika stosu ESP?
  2. W jaki sposób można usunąć ze stosu trzy liczby 32-bitowe nie używając instrukcji POP?
  3. Omówić zasady działania rozkazów CALL, INT i RET (IRET).
  4. Omówić sposób dostępu do zmiennych dynamicznych umieszczonych na stosie za pomocą modyfikacji z użyciem pomocniczego wskaźnika stosu EBP.
  5. Porównać typowe techniki przekazywania parametrów do podprogramu stosowane w procesorach CISC i RISC.
  6. Dlaczego wiele programów generowanych przez kompilatory języków wysokiego poziomu używa stosu do przechowywania wartości zmiennych?

 

 

F. Lista rozkazów (instrukcji) procesora

 

  1. Omówić bitowe operacje logiczne wykonywane przez instrukcje procesora.
  2. Omówić zasady działania rozkazów wykonujących działania na blokach danych.
  3. Omówić specyfikę i zastosowanie rozkazów grup MMX i SSE.
  4. Co oznacza termin arytmetyka nasycenia w odniesieniu do operacji MMX?
  5. W jaki sposób rozkaz IRET wpływa na zawartość rejestru znaczników?

 


G. Sterowanie pracą urządzeń zewnętrznych

 

  1. Omówić podstawowe koncepcje komunikacji komputera z urządzeniami zewnętrznymi.
  2. Omówić podstawowe elementy systemu przerwań stosowanego w komputerach PC.
  3. Jaką rolę podczas wywoływania podprogramów systemowych pełni tablica wektorów (deskryptorów) przerwań?
  4. Wyjaśnić co oznacza termin "przestrzeń adresowa portów".
  5. Wyjaśnić co oznacza termin priorytet przerwania.
  6. Jaką rolę w komunikacji z urządzeniami zewnętrznymi pełni obszar współadresowalny pamięci.
  7. W jakich okolicznościach używa się przerwań niemaskowalnych?
  8. Podać podstawowe zasady tworzenia procedur obsługi przerwań sprzętowych.
  9. Podać zasady wyświetlania znaków w trybie tekstowym poprzez bezpośredni zapis do pamięci ekranu.

 

 

H. Architektury CISC i RISC

 

  1. Porównać charakterystyczne elementy architektury procesorów CISC i RISC.
  2. Omówić zasady przekazywania parametrów do podprogramu stosowane w procesorach RISC.
  3. Opisać zasady działania pamięci statycznych i dynamicznych.
  4. Omówić algorytmy dostępu i aktualizacji zawartości pamięci podręcznej.
  5. W jaki sposób zasada lokalności  wiąże się z pamięcią podręczną?
  6. Na czym polega problem zapewnienia spójności zawartości pamięci operacyjnej i pamięci podręcznej.
  7. Wyjaśnić koncepcję pamięci podręcznej dwukanałowej.
  8. Na czym polega różnica w sterowaniu mikroprogramowym i układowym procesora?
  9. Omówić przyczyny utrudniające realizację przetwarzania potokowego w procesorach.
  10. W jaki sposób we współczesnych procesorach przewiduje się zachowanie instrukcji skokowych?
  11. Na czym polegają główne różnice między systemami MIMD z pamięcią wspólną i z pamięcią rozproszoną?
  12. Omówić typowe miary wydajności systemów komputerowych.
  13. Jakie wnioski praktyczne wynikają z prawa Amdahla?

 


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)

temp              db              ?

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);

Zalecenia i wskazówki:

  1. Wartość p przekazywana jest przez stos w postaci 8 bajtów, z których dwa najstarsze nie są używane.
  2. Pominąć przypadek liczby 0.

 


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.

 

...

Zgłoś jeśli naruszono regulamin