AKO pytania zadania 2007 2008, politechnika gdańska


Katedra Architektury Systemów Komputerowych

Pytania i zadania przykładowe

z „Architektury komputerów”

Materiały pomocnicze dla studentów kierunku Informatyka

Opracował dr inż. Andrzej Jędruch

Gdańsk, grudzień 2007

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

  5. Jaka wartość zostanie wprowadzona do rejestru EDX po wykonaniu podanego niżej fragmentu programu

linie dd 421, 422, 443, 442, 444, 427, 432

— — — — — — — — — —

mov esi, (OFFSET linie) + 4

mov ebx, 4

mov edx, [ebx] [esi]

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?

  4. Wyjaśnić znaczenie terminów: makrowołanie i makrodefinicja.

  5. Jak postępuje się w przypadku, gdy w treści makrodefinicji zawierającej kod asemblerowy występuje etykieta?

  6. Jakie zastosowanie w programowaniu w asemblerze mają dyrektywy REPT, IRP, IRC.

E. Operacje stosu i podprogramy

  1. W jaki sposób instrukcje 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. Omówić formaty danych stosowane przez rozkazy MMX i SSE.

  5. Co oznacza termin arytmetyka nasycenia w odniesieniu do operacji MMX?

  6. W jaki sposób rozkaz IRET wpływa na zawartość rejestru znaczników F?

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. W jaki sposób funkcjonuje bufor okrężny?

  7. Jaką rolę w komunikacji z urządzeniami zewnętrznymi pełni obszar współadresowalny pamięci.

  8. W jakich okolicznościach używa się przerwań niemaskowalnych?

  9. Podać podstawowe zasady tworzenia procedur obsługi przerwań sprzętowych.

  10. Podać zasady wyświetlania znaków w trybie tekstowym poprzez bezpośredni zapis do pamięci ekranu.

  11. Omówić podstawowe zasady działania układów DMA.

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. Ile bajtów zarezerwuje asembler na zmienne opisane przez poniższe wiersze?

v1 db ?

v2 dw 4 dup (?), 20

v3 db 10 dup (?)

2. Na czym polega błąd w poniższym fragmencie programu?

const2 db ?

- - - - - - - - - - - - - - - - - - - - - -

mov const2, 256

4. 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

5. Podać kilka instrukcji zerujących rejestr AX.

6. Czym różni się działanie poniższych instrukcji

mov ebx, OFFSET table+4

lea ebx, table+4

7. Wyjaśnić działanie poniższego fragmentu programu

start: mov ecx, 3

sub ax, 10

loop start

Zadania z „Architektury komputerów”

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.

Operacje na liczbach binarnych

1. Napisać fragment programu w asemblerze, który sprawdzi czy liczba całkowita (w kodzie U2) zawarta w rejestrze EDI jest parzysta. Jeśli tak, to do znacznika CF należy wpisać 1 (rozkaz STC); w przeciwnym razie 0 (rozkaz CLC).

2. Napisać fragment programu w asemblerze, który sprawdzi czy liczba całkowita (w kodzie U2) zawarta w rejestrze EDI jest podzielna przez 7. Jeśli tak, to do znacznika CF należy wpisać 1 (rozkaz STC); w przeciwnym razie 0 (rozkaz CLC).

3. Ułożyć program wyświetlający na ekranie monitora wszystkie liczby naturalne mniejsze od 107, których suma cyfr dziesiętnych jest podzielna przez 31.

4. Napisać fragment programu wyznaczający wszystkie liczby 3-cyfrowe, które są równe sumie sze­ścianów swoich cyfr. Wyznaczone liczby należy wyświetlić na ekranie. Przykład: 371 = 3 * 3 * 3 + 7 * 7 * 7 + 1 * 1 * 1 = 27 + 343 + 1

5. Napisać podprogram, który wyznaczy sumę cyfr dziesiętnych 64-bitowej liczby binarnej (bez znaku), której adres podany w rejestrze EDI. Obliczoną sumę należy wpisać do rejestru AL. Napisać także fragment programu ilustrujący sposób wywoływania opracowanego podprogramu.

6. Ułożyć podprogram sprawdzający czy 32-bitowa liczba naturalna znajdująca się na wierzchołku stosu jest liczbą pierwszą. Jeśli tak, to znacznik CF powinien być ustawiony w stan 1, a w przeciwnym razie w stan 0.

7. W pewnym programie została zdefiniowana tablica 32-bitowych liczb całkowitych ze znakiem (w kodzie U2), której początek wskazuje rejestr EBX. Ilość elementów tablicy podana jest w ECX. Ułożyć fragment programu, który sprawdzi czy k początkowych liczb znajdujących się w tej tablicy tworzą ciąg niemalejący: jeśli TAK, to fragment powinien ustawić CF=1, a przeciwnym razie CF=0. Liczba k podana jest w rejestrze EAX.

8. Napisać fragment programu, który wpisze do n początkowych elementów tablicy liczby_pierwsze kolejne liczby pierwsze 2, 3, 5, 7, . . . w postaci 32-bitowych liczb binarnych. Liczba n podana jest w rejestrze ECX, a adres obszaru podany jest w rejestrze ESI.

9. Ułożyć fragment programu przekształcający ciąg n bajtów umieszczonych w pamięci począwszy od lokacji wskazanej przez zawartość rejestru EDI, w taki sposób, że pierwszy i ostatni bajt zostaną zamienione, drugi i przedostatni bajt zostaną zamienione, itd. Liczba bajtów podana jest w rejestrze ECX.

10. Napisać podprogram w asemblerze, który wyznaczy liczbę znaków w kodzie ASCII znajdujących się w podanym obszarze pamięci (w segmencie danych). Ciąg znaków zakończony jest bajtem o wartości 0. Adres obszaru podany jest w postaci wartości 32-bitowej bezpośrednio za kodem rozkazu CALL, który wywołuje omawiany podprogram. Obliczoną liczbę znaków wpisać do rejestru EAX. Wskazówka: adres obszaru można odczytać posługując się śladem rozkazu CALL.

11. Napisać podprogram w asemblerze, który wyznaczy największą liczbę spośród k liczb całkowitych 32-bitowych bez znaku zapisanych we wskazanym obszarze pamięci. Adres obszaru pamięci i liczba k podane są w kolejnych 32-bitowych lokacjach pamięci za rozkazem CALL, który wywołuje ten podprogram. Odszukaną liczbę należy wpisać do rejestrów EAX.

12. Napisać podprogram w asemblerze, który przekształci tekst w języku polskim zakodowany w standardzie Windows 1250 na tekst zakodowany w standardzie ISO 8859-2. Położenie obszaru pamięci zawierającego tekst wskazuje liczba zawarta w rejestrze ESI. Liczba znaków tekstu podana jest w rejestrze ECX. Przekształcenie kodu ograniczyć wyłącznie do małych liter. Kody niektórych liter alfabetu polskiego w standardzie Windows 1250 i ISO 8859-2: ą (185, 177), ć (230, 230), ę (234, 234), ł (179, 179), ń (241, 241), ó (243, 243), ś (156, 182), ź (159, 188), ż (191, 191).

13. Napisać podprogram w asemblerze porównujący dwie liczby 48-bitowe ze znakiem umieszczone w komórkach pamięci wskazanych przez zawartości rejestrów ESI i EDI. Wynik porównania przekazywany jest poprzez znaczniki ZF i CF:

ZF=1, CF=0 — porównywane liczby są równe,

ZF=0, CF=0 — pierwsza liczba jest większa od drugiej liczby,

ZF=0, CF=1 — pierwsza liczba jest mniejsza od drugiej liczby.

14. Napisać fragment programu w asemblerze obliczający część całkowitą pierwiastka kwadratowego 64-bitowej liczby całkowitej bez znaku, umieszczonej w rejestrach EDX:EAX. Wynik należy wprowadzić do rejestru EAX. Obliczenia przeprowadzić wg poniższego algorytmu:

15. Droga przebyta przez koło rowerowe o średnicy 26 cali po wykonaniu n obrotów wynosi w przybliżeniu 48/23n [m]. Napisać fragment programu obliczający przebytą drogę (w postaci liczby całkowitej) przy założeniu, że liczba n została wcześniej wpisana do rejestru EAX.

16. W programie asemblerowym zdefiniowano format 32-bitowych liczb mieszanych bez znaku, przyjmując, że najmniej znaczący bit ma wagę 28.

0x01 graphic

  1. Napisać fragment programu w asemblerze, który sprawdzi czy część ułamkowa liczby w rejestrze EBX jest większa od 0.5; jeśli tak, to do znacznika CF należy wpisać 1 (rozkaz STC); w przeciwnym razie 0 (rozkaz CLC).

  2. Napisać fragment programu w asemblerze, który wpisze 1 do znacznika CF (rozkaz STC) jeśli część całkowita liczby zawartej w rejestrze EBX jest różna od zera; w przeciwnym razie CF powinien zostać wyzerowany (rozkaz CLC).

17. Napisać podprogram wykonujący mnożenie razy 10 k-bajtowej liczby binarnej bez znaku. W podprogramie nie można używać instrukcji MUL lub IMUL. Przyjąć, że mnożona liczba znajduje się w obszarze pamięci, którego początek wskazuje rejestr ESI. Obliczony iloczyn należy wpisać do obszaru pamięci wskazywanego przez rejestr EDI. Liczba k podana jest w rejestrze ECX.

Wskazówka: skorzystać z zależności 0x01 graphic
i zastosować rozkazy przesunięcia bitów w lewo.

Wczytywanie i wyświetlanie liczb całkowitych stałoprzecinkowych

18. Napisać podprogram wczytujący z klawiatury liczbę dziesiętną ze znakiem. Wprowadzoną liczbę w postaci binarnej (kod U2) należy umieścić w rejestrze EAX. Przyjąć, że wartość wprowadzonej liczby mieści się w dopuszczalnym zakresie dla liczb 32-bitowych w kodzie U2. Wskazówka: przeprowadzić konwersję liczby w zwykły sposób, a następnie, jeśli wprowadzono znak minus (−), zmienić znak liczby binarnej za pomocą rozkazu NEG.

19. Napisać podprogram wyświetlający liczbę na ekranie w postaci dziesiętnej (bez znaku) w taki sposób, by zajmowała ona ustaloną liczbę pozycji, która podana jest w rejestrze BH. Niewykorzystane pozycje z lewej strony liczby należy wypełnić spacjami. Wartość binarna wyświetlanej liczby podana jest w rejestrze EAX.

Jeśli podany format uniemożliwia poprawne wyświetlenie liczby, należy wpisać 1 do znacznika CF, w przeciwnym razie wyzerować CF. Zawartość BH = 0 oznacza, że należy wyświetlić wartość liczby bez dodatkowych spacji. Wskazówka: rozkaz STC wpisuje 1 do CF, rozkaz CLC zeruje CF.

20. Spotyka się kilka formatów wyświetlania liczb całkowitych (bez znaku), np.:

  1. 12345678

  2. 12 345 678

  3. 12.345.678,-

Napisać podprogram wyświetlający liczbę na ekranie w postaci dziesiętnej w podany wyżej sposób. Kod formatu (1, 2 lub 3) określony jest przez zawartość rejestru BH. Wartość binarna wyświetlanej liczby (bez znaku) podana jest w rejestrze EAX.

21. Napisać podprogram w asemblerze wyświetlający na ekranie, w postaci liczb szesnastkowych, zawartość wskazanego obszaru pamięci. Początek obszaru wskazuje zawartość rejestru EBX, a rozmiar obszaru - rejestr ECX. W każdym wierszu należy wyświetlić 16 liczb, z których każda opisuje zawartość pojedynczego bajtu.

22. Ułożyć podprogram wczytujący z klawiatury liczbę całkowitą dziesiętną dodatnią lub ujemną i przeprowadzający jej konwersję na postać binarną. Podprogram powinien być wyposażony w elementy kontrolno-diagnostyczne, które wskazywały by ewentualne błędy w zapisie liczby. W przypadku wystąpienia błędu w następnym wierszu na ekranie monitora powinien pojawić się komunikat wskazujący rodzaj i położenie błędu oraz ewentualną propozycję akceptacji konwersji zastosowanej przez podprogram. Zakładamy, że reprezentacja binarna wczytanej liczby zajmuje co najwyżej 32 bity.

23. Napisać program w asemblerze, który wczyta liczbę dziesiętną z klawiatury, i wyświetli (również w postaci dziesiętnej) jej wartość pomniejszoną o 1. W programie wykorzystać podprogramy wczytywania i wyświetlania liczb opracowane na zajęciach laboratoryjnych lub w zadaniach domowych. Przyjąć, że liczby występujące w zadaniu są liczbami naturalnymi i nie przekraczają 264-1.

24. 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 0x01 graphic
. Logarytmując obustronnie przy podstawie 10 uzyskujemy x = 96 log 2, skąd 0x01 graphic
. Zatem liczba 96-bitowa ma 29 cyfr (np. liczba 0x01 graphic
ma 7 cyfr).

Obliczenie reszty z dzielenia liczby 96-bitowej przez 10 przebiega tak:

0x01 graphic

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:

0x01 graphic

Wczytywanie i wyświetlanie liczb całkowitych i ułamkowych stałoprzecinkowych

25. W programie asemblerowym zdefiniowano format 32-bitowych binarnych liczb mieszanych bez znaku przyjmując, że najmniej znaczący bit ma wagę 28.

0x01 graphic

Napisać podprogram wyświetlający na ekranie liczbę w podanym formacie. Liczba powinna być wyświetlana w postaci dziesiętnej z dokładnością trzech cyfr po kropce. Przyjąć, że liczba binarna umieszczona jest w rejestrze EAX.

Opracowany podprogram wykorzystać w programie testującym, w którym wywołanie podprogramu przy EAX=0BC614EFCH powinno spowodować wyświetlenie na ekranie liczby 12345678.984

Wskazówki:

1. Liczbę w EAX należy pomnożyć przez 1000, a uzyskany wynik przesunąć o 8 bitów prawo. Liczbę tę należy wyświetlić w konwencjonalny sposób wprowadzając dodatkowo kropkę przed trzy ostatnie cyfry.

2. Iloczyn EAX  * 1000 należy traktować jako liczbę 64-bitową.

3. Należy brać pod uwagę przypadek, gdy wyświetlana liczba jest mniejsza od 1.

26. Napisać sekwencję instrukcji, która wczyta z klawiatury liczbę dziesiętną zawierającą część całkowitą i ułamkową, rozdzielone kropką. Wczytaną liczbę należy umieścić w rejestrze EAX w postaci binarnej przybliżonej, przy założeniu, że najmniej znaczący bit rejestru EAX ma wagę 25. Zakładamy, że część całkowita liczby da się zapisać w podanym formacie. Wskazówki:

  1. przy wczytywaniu zignorować kropkę, ale zapamiętać jej położenie (w postaci liczby k określającej ilość cyfr po kropce).

  2. Po konwersji na postać binarną należy pomnożyć uzyskaną wartość przez 25 (przesunąć o 5 bitów w lewo) i podzielić przez 10k. Operacje mnożenia i dzielenia zrealizować w arytmetyce 64-bitowej.

  3. W celu zaokrąglenia do ilorazu należy dodać 1, jeśli reszta z dzielenia przekracza 10k / 2 .

27. Ułożyć podprogram w asemblerze wyświetlający na ekranie monitora wartość ilorazu p/q w postaci liczby dziesiętnej, z dokładnością do dwóch cyfr po kropce. Liczby całkowite binarne (16-bitowe) p, q (bez znaku) umieszczone są, odpowiednio, w rejestrach SI, DI.

Obliczenia rekurencyjne

28. 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

29. 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

30. Napisać podprogram w asemblerze, przystosowany do wywoływania z poziomu języka C, wyznaczający największą liczbę spośród trzech liczb całkowitych ze znakiem podanych jako argumenty funkcji. Prototyp funkcji (podprogramu) na poziomie języka C ma postać

int podaj_max (int a, int b, int c);

31. Napisać podprogram w asemblerze, przystosowany do wywoływania z poziomu języka C, wyznaczający sumę cyfr dziesiętnych liczby będącej parametrem wywołania podprogramu. Prototyp funkcji (podprogramu) na poziomie języka C ma postać

int suma_cyfr (int liczba);

32. Napisać podprogram w asemblerze, przystosowany do wywoływania z poziomu języka C, wypełniający n-elementową tablicę bajtową kodami spacji. Prototyp funkcji (podprogramu) na poziomie języka C ma postać

void wpisz_spacje (char tabl[ ], int n);

33. Napisać podprogram w asemblerze, przystosowany do wywoływania z poziomu języka C, zamieniający wszystkie znaki spacji zawarte w łańcuchu znaków na znaki podkreślenia ( _ ). Liczba przeprowadzonych zamian jest zwracana jako wartość funkcji. W języku C koniec łańcucha znaków wskazuje bajt zerowy. Prototyp funkcji (podprogramu) na poziomie języka C ma postać

int zamiana_spacji (char znaki[ ]);

34. Napisać podprogram w asemblerze, przystosowany do wywoływania z poziomu języka C, wyznaczający liczbę znaków w łańcuchu zawartym w tablicy. W języku C koniec łańcucha znaków wskazuje bajt zerowy. Prototyp funkcji (podprogramu) na poziomie języka C ma postać

int liczba_znakow (char znaki[ ]);

35. Napisać dwa podprogramy znajdujące największy wspólny dzielnik i najmniejszą wspólną wielokrotność dla dwóch podanych liczb naturalnych. Podprogramy powinny być napisane w asemblerze dla trybu 32-bitowego i przystosowane do wywoływania z poziomu języka C, a ich prototypy mają postać:

unsigned int NWD (unsigned int x, unsigned int y);

unsigned int NWW (unsigned int x, unsigned int y);

36. Funkcja biblioteczna języka C o podanym prototypie

int strcmp( const char *string1, const char *string2 );

porównuje dwa łańcuchy znaków i zwraca wartości:

< 0, gdy string1 poprzedza alfabetycznie string2

= 0, gdy oba łańcuchy znaków są identyczne

> 0, gdy string2 poprzedza alfabetycznie string1

Napisać podprogram w asemblerze, przystosowany do wywoływania z poziomu języka C (w trybie 32-bitowym), realizujący podaną funkcję. Przyjąć, że porównane łańcuchy znaków zawierają wyłącznie litery alfabetu łacińskiego i spacje. Każdy łańcuch znaków zakończony jest bajtem zerowym. Działanie omawianej funkcji ilustrują poniższe przykłady.

p1 = strcmp("abc", "bcd"); // -1

p2 = strcmp("bcd", "abc"); // +1

p3 = strcmp("aBc", "abc"); // -1

p4 = strcmp("abc", "aBc"); // +1

p5 = strcmp("a bc", "ab c"); // -1

p6 = strcmp("ab", "abc"); // -1

37. 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.

38. W programie w języku C został zdefiniowany obszar pamięci zawierający pewna liczbę wyrazów zakodowanych w kodzie ASCII. Każdy wyraz zakończony jest bajtem o wartości 0, a na końcu obszaru umieszczony jest dodatkowy bajt zerowy.

Napisać podprogram w asemblerze przystosowany do wywoływania z poziomu języka C. Prototyp podprogramu (funkcji) na poziomie języka C ma postać

char szukaj (char obszar [ ], char wyraz [ ]);

Podprogram, wykonywany w trybie 32-bitowym, powinien sprawdzić czy podany wyraz znajduje się obszarze obszar. Jeśli tak to podprogram powinien zwrócić wartość 1, a w przeciwnym razie 0.

39. Napisać podprogram w asemblerze przystosowany do wywoływania z poziomu języka C. Prototyp podprogramu na poziomie języka C ma postać:

int polacz (int ∗ tabl1, int ∗ tabl2 , int ∗ tabl3, int n1, int n2 );

Tablice tabl1 i tabl2 zawierają, odpowiednio, n1 i n2 liczb całkowitych uporządkowanych rosnąco (element tablicy o indeksie 0 jest najmniejszym elementem tablicy). Liczby zakodowane są jako 32-bitowe liczby całkowite w kodzie U2. Podprogram polacz powinien przepisać elementy obu tablic do tablicy tabl3 w taki sposób by liczby w tablicy tabl3 tworzyły ciąg rosnący. Podprogram powinien zwrócić liczbę elementów zapisanych do tablicy tabl3.

40. Napisać podprogram w asemblerze przystosowany do wywoływania z poziomu języka C. Prototyp podprogramu (funkcji) na poziomie języka C ma postać

void wyswietl_tablice (int tablica [ ], int liczba_wierszy, int liczba_kolumn);

Podprogram powinien wyświetlić na ekranie postaci dziesiętnej tablicę 32-bitowych liczb całkowitych ze znakiem (kod U2). Adres tablicy przekazywany jest przez parametr tablica, a liczbę wierszy i kolumn wyświetlanej tablicy określają dwa kolejne parametry: liczba_wierszy i liczba_kolumn.

41. Napisać podprogram w asemblerze przystosowany do wywoływania z poziomu języka C, którego prototyp ma postać

void zamien_kody (unsigned char * unicode ,

unsigned char * utf8, int n);

Podprogram powinien zamienić n bajtów w kodzie Unicode znajdujących się w obszarze pamięci unicode na kod UTF-8. Kod wynikowy należy wpisać do obszaru utf8.

Przykład (z pliku utworzonego za pomocą Notatnika w systemie Windows).

Unicode

UTF-8

ą

05H 01H

C4H 85H

ć

07H 01H

C4H 87H

Znaki Unicode o kodach 0000H do 007FH (czyli znaki kodu ASCII) są kodowane jako pojedyncze bajty o wartościach z przedziału 00H do 7FH.

Wszystkie znaki o kodach większych od 007FH są kodowane jako sekwencja kilku bajtów, z których każdy ma ustawiony najstarszy bit na 1. Pierwszy bajt w sekwencji kilku bajtów jest zawsze liczbą z przedziału C0H do FDH i określa ile bajtów następuje po nim (liczba jedynek z lewej strony pierwszego bajtu jest równa liczbie bajtów reprezentacji UTF-8). Wszystkie pozostałe bajty zawierają liczby z przedziału 80H do BFH.

Zakresy kodów

Kod UTF-8

od - do

00000000 ÷ 0000007F

0xxxxxxx

00000080 ÷ 000007FF

110xxxxx 10xxxxxx

00000800 ÷ 0000FFFF

1110xxxx 10xxxxxx 10xxxxxx

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.

Podprogram powinien być przystosowany do wywoływania z poziomu języka C (w trybie 32-bitowym), a jego prototyp ma postać

void przesun ( void ∗ obszar, int n, int p);

43. W pewnym programie obszar pamięci zawierający n bajtów jest traktowany jako rejestr k bitowy (k = n ∗ 8). Numeracja bitów tego rejestru pokazana jest na rysunku.

k−1

k−2

k−3

k−4

. . .

. . .

. . .

. . .

3

2

1

0

Napisać podprogram w asemblerze, który będzie wykonywał zamianę bitów tego rejestru: bit nr (k−1) z bitem nr 0, bit nr (k−2) z bitem nr 1, bit nr (k−3) z bitem nr 2, itd.

Podprogram powinien być przystosowany do wywoływania z poziomu języka C, a jego prototyp ma postać

void zamien ( void ∗ obszar, int n);

44. W pewnym programie obszar pamięci zawierający n bajtów jest traktowany jako rejestr k bitowy (k = n ∗ 8). Numeracja bitów tego rejestru pokazana jest na rysunku.

k−1

k−2

k−3

k−4

. . .

. . .

. . .

. . .

3

2

1

0

Napisać podprogram w asemblerze, który wyszuka w rejestrze najbliższy bit o wartości 1, poszukując go w ciągu bitów o numerach p, p−1, p−2, p−3, . . , itd. Numer znalezionego bitu powinien być zwrócony jako wartość funkcji. Jeśli bitu o wartości 1 nie udało się znaleźć, to funkcja zwraca wartość −1.

Podprogram powinien być przystosowany do wywoływania z poziomu języka C (w trybie 32-bitowym), a jego prototyp ma postać

int znajdz ( void ∗ obszar, int n, int p);

45. 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ć.

Zadania różne

46. W niektórych programach słownik słów kluczowych przechowywany jest w postaci skondensowanej. Każde słowo kluczowe zapisane jest na kilku bajtach, przy czym:

pierwsze dwa bajty zawierają kod przypisany temu słowu,

trzeci bajt zawiera ilość znaków słowa,

czwarty bajt podaje ile początkowych znaków słowa kluczowego należy pobrać z poprzedniego słowa kluczowego,

dalsze bajty zawierają kolejne znaki słowa kluczowego z pominięciem znaków pobranych z poprzedniego słowa kluczowego.

Przykład :

END kod kod 3 0 E N D

ENDIF kod kod 5 3 I F

ENDM kod kod 4 3 M

Napisać podprogram w asemblerze przekształcający listę słów kluczowych zapisaną w postaci konwencjonalnej na postać skondensowaną. Przyjąć, że postać konwencjonalna znajduje się w segmencie danych w obszarze wskazanym przez zawartość rejestru ESI, a postać skondensowana ma być umieszczona w obszarze wskazanym przez rejestr EDI. Obszar KONW zakończony jest znakiem .

47. W operacjach przesyłania plików za pomocą poczty elektronicznej powszechnie stosuje się kodowanie w standardzie MIME Base64. W standardzie tym kolejne trzy bajty pliku traktuje się jako ciąg 24 bitów, które dzieli na cztery grupy po 6 bitów. Zawartość grupy 6-bitowej traktuje się jako liczbę binarną z przedziału 0 63. Liczba stanowi indeks w poniższej tablicy znaków

znaki db 'ABCDEFGHIJKLMNOPQRSTUWXYZ'

db 'abcdefghojklmnopqrstuwxyz0123456789+/'

Kodowanie polega na przypisaniu każdej grupie 6-bitowej odpowiedniego znaku z tablicy. W rezultacie cała zawartość pliku będzie reprezentowana wyłącznie przez znaki kodu ASCII pobrane z powyższej tablicy. Przykładowo, jeśli początkowe bajty pliku mają postać DBH, A5H, 2DH, 00H, 31H, 40H, to po przekodowaniu otrzymamy 26UtADFA.

Napisać dwa podprogramy w asemblerze realizujące kodowanie i rozkodowanie ciągu bajtów umieszczonych w podanym obszarze pamięci. Przyjąć, że bajty podlegające zakodowaniu znajdują się w obszarze pamięci wskazanym przez rejestr ESI, zaś położenie obszaru wynikowego wskazuje rejestr EDI. Analogicznie, dla podprogramu rozkodowującego rejestr ESI wskazuje obszar zawierający znaki ASCII, zaś EDI wskazuje obszar docelowy. Liczba przetwarzanych bajtów obszaru źródłowego znajduje się w rejestrze ECX.

48. Napisać podprogram w asemblerze, który przekształci wiersz programu w asemblerze na odpowiadający kod binarny. Tłumaczony wiersz w postaci ciągu znaków ASCII zakończonych bajtem zerowym znajduje się w obszarze pamięci wskazanym przez adres zawarty w rejestrze ESI. Utworzony ciąg bajtów powinien zostać wpisany do obszaru pamięci wskazanego przez rejestr EDI. Liczbę wygenerowanych bajtów należy wpisać do rejestru ECX.

Założenia dodatkowe:

  1. Opracowana wersja podprogramu powinna uwzględniać jedynie rozkazy z mnemonikiem MOV, przy czym używane są wyłącznie rejestry 8- i 32-bitowe.

  2. Wiersze źródłowe zawierają rozkazy, które dadzą się zakodować wg podanych niżej (wybranych) formatów. W szczególności podprogram nie uwzględnia rozkazów działających na rejestrach segmentowych.

  3. Liczby podawane jako argumenty są kodowane wyłącznie w systemie dziesiętnym.

  4. Przyjąć, że wiersz jest napisany poprawnie.

Wybrane formaty rozkazu MOV.

1. przesłanie liczby do rejestru

1011 w reg

liczba (L)

liczba (..)

liczba (..)

liczba (H)

2. przesłanie rejestru do rejestru

1000 10 d w

11 reg r/m

3. przesłanie zawartości lokacjii pamięci do rejestru

1000101 w

mod reg r/m

Przes.(L)

Przes. (..)

Przes. (..)

Przes. (H)

3. przesłanie zawartości rejestru do lokacji pamięci

1000100 w

mod reg r/m

Przes.(L)

Przes. (..)

Przes. (..)

Przes. (H)

49. Procesory Pentium starszych typów nie realizują operacji MMX. W takich przypadkach brakujące rozkazy MMX można zdefiniować ma pomocą techniki makroprzetwarzania. Napisać makrodeficję

PADDUSW MACRO arg1, arg2

która jest rozwijana w ciąg rozkazów wykonujących działania identyczne z czynnościami rozkazu PADDUSW. Wewnątrz makrodefinicji nie mogą występować rozkazy MMX. Przyjąć, że rejestry MMX są reprezentowane przez zmienne (zdefiniowane w segmencie danych) o tych samych nazwach.

Opis rozkazu PADDUSW:

Rozkaz

PADDUSW mm, mm/m64

(ang. Packed Add with Unsigned Saturation) dodaje pierwsze słowo (16-bitowe) ze źródłowego rejestru do pierwszego słowa docelowego rejestru. Wynik jest przycinany do wartości 0..65635 i przechowywany w pierwszym słowie rejestru docelowego. To samo dzieje się dla pozostałych 3 słów.

50. W programach obsługi kalendarza MS Visual Studio dni świąteczne w miesiącu koduje się w postaci jedynek umieszczonych na odpowiednich bitach słowa 32-bitowego. Tablica zawierająca 12 takich elementów pozwala zakodować informacje obejmujące rok.

Napisać podprogram w asemblerze wyświetlający na ekranie daty dni świątecznych w podanym miesiącu. Parametry wywołania podprogramu znajdują się w rejestrach:

CL - numer miesiąca (1 - 12)

EBX - adres tablicy zawierającej zakodowane daty dni świątecznych w poszczególnych miesiącach.

Obliczenia zmiennoprzecinkowe

51. Napisać podprogram w asemblerze, który wyświetli na ekranie część całkowitą liczby znajdującej na wierzchołku stosu rejestrów koprocesora arytmetycznego. W podprogramie można wykorzystywać instrukcje z listy procesora i koprocesora arytmetycznego.

52. W programie asemblerowym zdefiniowano format 32-bitowych liczb mieszanych ze znakiem (kod U2), przyjmując, że najmniej znaczący bit ma wagę 212.

0x01 graphic

Napisać podprogram w asemblerze, który przekształci liczbę zmiennoprzecinkową znajdującą się na wierzchołku stosu koprocesora arytmetycznego na liczbę stałoprzecinkową w podanym formacie i umieści ją w rejestrze EAX. Omawiany podprogram powinien także wyświetlać liczbę na ekranie w postaci dziesiętnej w formacie z trzema cyframi po kropce.

53. W programie asemblerowym zdefiniowano format 32-bitowych liczb mieszanych ze znakiem (kod U2), przyjmując, że najmniej znaczący bit ma wagę 212.

0x01 graphic

Napisać podprogram w asemblerze, który przekształci liczbę stałoprzecinkową w podanym formacie znajdującą się w rejestrze EAX na liczbę zmiennoprzecinkową, która zostanie umieszczona na wierzchołku stosu koprocesora arytmetycznego. Omawiany podprogram powinien także wyświetlać liczbę na ekranie w postaci dziesiętnej w formacie z dwiema cyframi po kropce.

54. W programie asemblerowym zdefiniowano format 32-bitowych liczb mieszanych bez znaku. Położenie (umownej) kropki rozdzielającej cześć całkowitą i ułamkową liczby podane jest w rejestrze CL. Podana tam liczba określa numer bitu, któremu została przyporządkowana waga 20. Przykładowo, jeśli rejestr CL zawiera liczbę 12, to format ma postać pokazaną na rysunku.

0x01 graphic

Napisać podprogram w asemblerze, który przekształci liczbę stałoprzecinkową w podanym formacie znajdującą się w rejestrze EAX na 32-bitową liczbę zmiennoprzecinkową, która należy wpisać do rejestru ESI.

Uwaga: podprogram powinien uwzględniać zawartość rejestru CL (zawartość CL = 12 została podana tylko dla przykładu).

55. W rejestrze EAX znajduje się 32-bitowa liczba zmiennoprzecinkowa. Napisać podprogram w asemblerze, który zwiększy tę liczbę o 1. Wynik sumowania powinien być wpisany do EAX. W podprogramie nie można używać rozkazów koprocesora arytmetycznego. Zakładamy, że liczba zmiennoprzecinkowa nie jest wartością specjalną, jednak liczba 0 powinna być akceptowana.

Wskazówka: mantysa liczby zmiennoprzecinkowej kodowana jest wg zasady „znak-moduł”.

56. Napisać podprogram wykonujący dodawanie dwóch 32-bitowych liczb zmiennoprzecinkowych znajdujących się w rejestrach ESI i EDI. Sumę obu liczb, w tym samym formacie, należy wpisać do rejestru EAX. Przyjąć następujące założenia:

W podprogramie nie mogą być stosowane instrukcje koprocesora arytmetycznego.

Dodawane liczby nie są wartościami specjalnymi; również wynik operacji na pewno nie będzie wartością specjalną, jednak liczba 0 powinna być akceptowana jako argument lub wynik operacji.

Zaokrąglanie uzyskanej sumy można pominąć.

Wskazówka: obie dodawane liczby zamienić na stałoprzecinkowe, w których umowna kropka rozdzielająca część całkowitą i ułamkową znajdować się będzie na tej samej pozycji.

57. Napisać podprogram w asemblerze, który wczyta z klawiatury liczbę dziesiętną bez znaku i umieści ją w postaci zmiennoprzecinkowej na wierzchołku stosu koprocesora arytmetycznego. Wprowadzana liczba zawiera kropkę, po której występuje co najmniej jedna cyfra i nie więcej niż 6 cyfr. Liczba cyfr przed kropką wynosi co najwyżej 10.

Napisać także program w asemblerze ilustrujący sposób wywoływania opracowanego podprogramu.

58. Napisać podprogram wysw_zm wyświetlający na ekranie wartość dziesiętną liczby zmiennoprzecinkowej znajdującej się w rejestrze EAX. Przyjąć, że umieszczona tam liczba zmiennoprzecinkowa jest liczbą całkowitą dodatnią, której wartość nie przekracza 500. Przyjąć, że podprogram powinien działać również w komputerach nie wyposażonych w koprocesor arytmetyczny.

W celu sprawdzenia działania podprogramu należy go wywołać w poniższy sposób.

mov eax, 43100000

call wysw_zm

W przypadku pozytywnym na ekranie powinna się pojawić liczba 144.

59. Liczbę zmiennoprzecinkową można stosunkowo łatwo wyświetlić na ekranie, jeśli uprzednio zostanie zapisana w formacie BCD. Instrukcja koprocesora FBSTP powoduje zapisanie liczby zmiennoprzecinkowej w upakowanym formacie BCD, a następnie usunięcie liczby ze stosu. Argumentem instrukcji FBSTP musi być 10-bajtowy obszar pamięci deklarowany w asemblerze za pomocą dyrektywy DT. Przed zapisaniem liczba zmiennoprzecinkowa jest zaokrąglana do liczby całkowitej. Przykładowo, liczba 1000*pi zostaje zapisana w 10-bajtach w postaci (szesnastkowo) 42 31 00 00 00 00 00 00 00 00.

Napisać podprogram w asemblerze wyświetlający na ekranie liczbę zmiennoprzecinkową znajdującą się na wierzchołku stosu koprocesora. Liczba cyfr po kropce podana jest w rejestrze CL. Przyjąć, że wyświetlana liczba jest zawsze dodatnia.

Wskazówka: przed wykonaniem rozkazu FBSTP wykonać mnożenie przez 10a, gdzie a jest zawartością rejestru CL. Mnożnik powinien być przedstawiony w postaci zwykłej liczby binarnej, a mnożenie należy wykonać za pomocą rozkazu FIMUL. W trakcie wyświetlania liczby należy dodatkowo wyświetlić kropkę przed cyframi części ułamkowej.

60. Napisać podprogram w asemblerze obliczający wartość funkcji sin(x)/x za pomocą koprocesora arytmetycznego.

Bezpośrednio przed wywołaniem podprogramu wartość x w postaci 64-bitowej liczby zmiennoprzecinkowej (typ double w języku C) zostaje umieszczona na stosie (procesora). Obliczona wartość funkcji sin(x)/x powinna pozostać na wierzchołku stosu rejestrów koprocesora arytmetycznego. W przypadku x=0 przyjąć wartość funkcji = 1.

Podprogram nie powinien odwoływać się do danych statycznych. Przed zakończeniem podprogramu wszelkie wyniki pośrednie znajdujące się na stosie rejestrów koprocesora powinny zostać usunięte.

61. Napisać podprogram w asemblerze obliczający wartość funkcji arcsin(x) za pomocą koprocesora arytmetycznego.

Bezpośrednio przed wywołaniem podprogramu wartość x (| x | < 1) w postaci 32-bitowej liczby zmiennoprzecinkowej (typ float w języku C) zostaje umieszczona na stosie. Obliczona wartość funkcji arcsin(x) powinna pozostać na wierzchołku stosu rejestrów koprocesora arytmetycznego.

Podprogram powinien pracować w trybie 32-bitowym. Podprogram nie powinien odwoływać się do danych statycznych (poprzez rejestr DS). Przed zakończeniem podprogramu wszelkie wyniki pośrednie znajdujące się na stosie rejestrów koprocesora powinny zostać usunięte.

Wskazówka: skorzystać z zależności: 0x01 graphic

62. Napisać program w asemblerze, wykorzystujący także rozkazy koprocesora arytmetycznego, wyznaczający miejsce zerowe funkcji 0x01 graphic
w przedziale <0, 1> metodą bisekcji. W celu znalezienia miejsca zerowego należy kolejno dzielić przedział na pół, i kontynuować poszukiwania w podprzedziale, wybierając ten, na krańcach którego funkcja przyjmuje różne znaki. Znalezione miejsce zerowe x0 można uważać za wystarczająco dokładne, jeśli długość przedziału w kolejnym kroku iteracji jest mniejsza od 0.0001.

Wskazówki:

1. Omawiany algorytm zakodowany w języku C ma postać:

#include <stdio.h>

#include <math.h>

double fun (double x) {return (pow (10.0, x) - x - 3.0); }

int main ()

{

double a, b, x, y, p; int i; a = 0.0; b = 1.0; printf("\n\n");

do

{

x = (a + b)/2.0; y = fun(x);

printf("\nx = %f y = %f", x, y);

if ((y * fun(a)) < 0) b = x; else a = x;

} while (fabs(a-b) >= 0.0001);

return 0;

}

2. Wygodnie jest opracować i wykorzystać podprogram obliczający wartość 0x01 graphic
dla dowolnych wartości zmiennoprzecinkowych x. W podprogramie należy wykorzystać zależność 0x01 graphic
, gdzie c i u oznacza, odpowiednio, część całkowitą i ułamkową wykładnika x. Część całkowitą wykładnika x można wyznaczyć za pomocą rozkazu frndint. Wartość potęgi dla wykładnika całkowitego oblicza się za pomocą rozkazu fscale, natomiast dla wykładnika ułamkowego za pomocą rozkazu f2xm1.

3. Następnie, korzystając z podprogramu obliczającego 0x01 graphic
, napisać podprogram obliczający 0x01 graphic
. Można wykorzystać tu związek 0x01 graphic
(rozkaz fldl2t wpisuje na wierzchołek stosu koprocesora liczbę 0x01 graphic
).

4



Wyszukiwarka

Podobne podstrony:
Mechanika Budowli II - Projekty (rok III), Mechanika - Zadanie Projektowe Nr1, Politechnika Gdańska
EGZ 2010, PYTANIA EGZAMINACYJNE 2007/2008
Pytania i zadania egzaminacyjne FIZYKA, Politechnika Poznańska, Edukacja Techniczno Informatyczna, S
ako pytania zadania cz2 2010, Studia - informatyka, materialy, Architektura komputerów
prawo wykroczeń pytania z egzaminu 2007 - 2008, pliki zamawiane, edukacja
AKO pytania zadania cz1 2010, AA informatyka - studia, Architektura komputerów
Mechanika Budowli II - Projekty (rok III), Mechanika - Zadanie Projektowe Nr2, Politechnika Gdańska
Mechanika Budowli II - Projekty (rok III), Mechanika - Zadanie Projektowe Nr3, Politechnika Gdańska
pytania z testowe z egzaminów 2007 2008, Prywatne, FIZJOLOGIA od LILI, pytania
Dystrybucja, Politechnika Gdańska, Zarządzanie WZiE, semestr 2, Podstawy marketingu, zadania
Suszarnictwo - Pytania 2007-2008, Technologia żywności i żywienia człowieka, Przechowalnictwo, susza
Zadania z kinematyki, Politechnika Gdańska, Budownictwo, Semestr I, Fizyka I, Ćwiczenia
zadania konkurs 2007 2008, konkurs polonistyczny
pytania egzamnacyjne licencjat 2007 2008, finanse publiczne
Zadania - ruch harmoniczny prosty, Politechnika Gdańska, Budownictwo, Semestr I, Fizyka I, Ćwiczenia
chemia-Kolokwium-Przykladowe-pytania-i-odpowiedzi, Politechnika Gdańska Budownictwo, Semestr 3, Chem
Cw 2 MPS pytania zadania dane kolokwium 2008 1

więcej podobnych podstron