background image

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: 

background image

 

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

 

background image

 
 
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.