AKO_egz_pyt_zad_2009.doc

(107 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”

czerwiec 2009

 

 


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. Czym różnią się rozkazy koprocesora arytmetycznego: FLD i FST?
  3. Wyjaśnić w jakim celu zdefiniowano nieliczby (NaN) w koprocesorze arytmetycznym.
  4. Omówić podstawowe zasady kodowania rozkazów procesora.

 

 

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. 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.  
  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.  
  3. Omówić specyfikę i zastosowanie rozkazów grup MMX i SSE.
  4. Co oznacza termin arytmetyka nasycenia w odniesieniu do operacji MMX?
  5.  

 

 

 

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.  
  6. Jaką rolę w komunikacji z urządzeniami zewnętrznymi pełni obszar współadresowalny pamięci.
  7.  
  8.  
  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ć.

 

 

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.

 

Wartość funkcji obliczyć metodą rekurencyjną korzystając z zależności:

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.

...

Zgłoś jeśli naruszono regulamin