Zadania przykładowe do laboratorium z "Architektury komputerów" cz. I
(studia niestacjonarne 2015/2016)
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 ę . . .”.
Wskazówka
: w sekcji danych programu (.data) należy zarezerwować obszar pamięci 80-
bajtowy, do którego trzeba przepisać znaki z obszaru źródłowego przeplatając je znakami
spacji. Rezerwacja obszaru może mieć postać:
obszar_wynikowy
db
80 dup (?)
Lepszym rozwiązaniem jest zarezerwowanie obszaru 80-bajtowego na stosie, np. za pomocą
rozkazu
sub esp, 80
W tym przypadku, po wykonaniu rozkazu powyższego rozkazu, rejestr ESP będzie
wskazywał adres początkowy tego obszaru.
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 sekcji danych 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.