Zadania przykładowe do laboratorium z "Architektury komputerów" cz. I (studia niestacjonarne 2011/2012)

1. Zmodyfikować program opracowany na zajęciach laboratoryjnych w taki sposób, by tekst wyświetlany na ekranie był dwukrotnie szerszy od oryginalnego (druk rozstrzelony), np.

zamiast „Nazywam się ...” powinno być ”N a z y w a m s i ę . . .”. Nie

należy zmieniać sekcji danych programu (część programu zaczynająca się od dyrektywy

.data).

2. Zmodyfikować podprogram wyświetlania liczb (opracowany na zajęciach laboratoryjnych) w taki sposób, by w liczbie dziesiętnej wyświetlanej na ekranie za pomocą funkcji MessageBox zera nieznaczące zostały zastąpione znakami gwiazdki *, np. ****654321.

Plik z rozwiązaniem powinien zawierać podprogram, program główny (etykieta _main i dalsze rozkazy) oraz wszystkie niezbędne dyrektywy.

3. Zmodyfikować podprogram wyświetlania liczb (opracowany na zajęciach laboratoryjnych) w taki sposób, by liczba dziesiętna wyświetlana na ekranie za pomocą funkcji MessageBox poprzedzona była słowem "Kwota =", np. Kwota = 654321. Plik z rozwiązaniem powinien zawierać podprogram, program główny (etykieta _main i dalsze rozkazy) oraz wszystkie niezbędne dyrektywy.

4. Opracować nową wersję podprogramu dokonującego konwersji liczby binarnej zawartej w rejestrze EAX na postać dziesiętną, która zostaje wyświetlona na ekranie. Nowy podprogram powinien wyświetlać liczbę w formacie, w którym po każdej cyfrze wystąpi spacja, np.: 4 0 3 7 4 5 6 5 0 2.

Wykorzystując ten podprogram, napisać program w asemblerze, który wyświetli na ekranie wartość dziesiętną liczby binarnej 11111111111111111111111111111110 Plik z rozwiązaniem powinien zawierać podprogram, program główny (etykieta _main i dalsze rozkazy) oraz wszystkie niezbędne dyrektywy.

5. Napisać program w asemblerze, który wczyta jeden wiersz z klawiatury i wyświetli na ekranie liczbę znaków tego wiersza.

Wskazówki:

1. W części asemblerowej zdefiniować pomocniczy, 81-bajtowy obszar danych:

.data

obszar

db

81 dup (?)

2. Tekst z klawiatury można wczytać za pomocą funkcji __read (uwaga: dwa znaki podkreślenia _) .Funkcję tę na poziomie kodu w asemblerze można wywołać za pomocą sekwencji rozkazów

push 81

push OFFSET

obszar

push 0

call __read

add esp, 12

3. Należy pamiętać, że funkcja __read zmienia zawartości rejestrów procesora (z wyjątkiem EBX, EBP, ESI, EDI). W rejestrze EAX zostaje umieszczona liczba znaków wpisanego tekstu.

4. Do wypisania na ekranie liczby znaków wykorzystać podprogram opracowany na zajęciach laboratoryjnych.

6. Napisać program w asemblerze, który wczyta jeden wiersz z klawiatury i wyświetli go na ekranie za pomocą funkcji MessageBox, przy czym znaki spacji zostaną zastąpione znakami gwiazdki*, np. po wprowadzeniu wiersza "Ala ma kota" na ekranie powinien pojawić się tekst "Ala*ma*kota ". Zakładamy, że wprowadzany tekst ma dokładnie 11 znaków (nie licząc kodu klawisza Enter na końcu tekstu).

Wskazówki:

1. W części asemblerowej zdefiniować pomocniczy, 12-bajtowy obszar danych:

.data

obszar

db

12 dup (?)

2. Tekst z klawiatury można wczytać za pomocą funkcji __read (uwaga: dwa znaki podkreślenia _) .Funkcję tę na poziomie kodu w asemblerze można wywołać za pomocą sekwencji rozkazów

push 12

push OFFSET

obszar

push 0

call __read

add esp, 12

3. Znaki wpisane z klawiatury zostaną wprowadzone do tablicy obszar.

4. Należy pamiętać, że funkcja __read zmienia zawartości rejestrów procesora (z wyjątkiem EBX, EBP, ESI, EDI). W rejestrze EAX zostaje umieszczona liczba znaków wpisanego tekstu.

7. Opracować nową wersję podprogramu dokonującego konwersji liczby binarnej zawartej w rejestrze EAX na postać dziesiętną, która zostaje wyświetlona na ekranie. Nowy podprogram powinien przeprowadzać konwersję liczby binarnej ze znakiem (w kodzie U2) na postać dziesiętną. Plik z rozwiązaniem powinien zawierać podprogram, program główny (etykieta _main i dalsze rozkazy) oraz wszystkie niezbędne dyrektywy.

Wskazówki:

1. Znak liczby w rejestrze EAX można sprawdzić w poniższy sposób

or

eax, eax

js

ujemna ; skok, gdy liczba ujemna

2. Jeśli liczba w rejestrze EAX jest nieujemna, to konwersję przeprowadza się w tak samo jak dla liczb bez znaku.

3. Jeśli liczba jest ujemna, to należy zmienić jej znak za pomocą rozkazu NEG i postępować dalej tak samo jak dla liczb nieujemnych.

4. Przed cyframi liczby należy także wyświetlić znak + lub −.

8. Opracować nową wersję podprogramu dokonującego konwersji liczby binarnej zawartej w rejestrze EAX na postać dziesiętną, która zostaje wyświetlona na ekranie. Nowy podprogram powinien wyświetlać liczbę w formacie, w którym po każdych trzech cyfrach, począwszy od cyfr najmniej znaczących, wystąpi spacja, np. 12 345 678. Plik z rozwiązaniem powinien zawierać podprogram, program główny (etykieta _main i dalsze rozkazy) oraz wszystkie niezbędne dyrektywy.

Wskazówki:

1. Utworzyć licznik cyfr, który będzie inkrementowany po wygenerowaniu kolejnej cyfry.

2. W trakcie generowania cyfr sprawdzać, czy zawartość licznika cyfr jest podzielna przez 3.

3. Licznik cyfr nie może być utożsamiony z indeksem używanym przy zapisie cyfr.