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