cw lab 1 id 122230 Nieznany

background image

P

OLITECHNIKA

O

POLSKA

Instytut Automatyki i Informatyki




Laboratorium architektury komputerów






Operacje arytmetyczne oraz logiczne na

liczbach całkowitych w kodzie U2.

Kod binarny, ósemkowy i szesnastkowy

.

background image

Ć

wiczenie Nr 1


Zaprojektowa

ć

i uruchomi

ć

program w asemblerze 80x86 realizuj

ą

cy wielokrotn

ą

operacj

ę

:

a. dzielenia
b. mno

ż

enia

c. logiczn

ą

=<

d. dodawania
e. logiczn

ą

>

f. odejmowania
g. logiczn

ą

<

h. modulo


dla liczb o słowie 8-bitowym w kodzie U2.

Dane wprowadzane s

ą

z klawiatury w kodzie binarnym. Kolejno

ść

wprowadzania

danych i wykonania operacji dowolna i wielokrotna. Na ekranie istnieje stał

ą

linia (linia polece

ń

), gdzie wprowadzamy polecenia oraz dane. Z klawiatury

przyjmujemy tylko nast

ę

puj

ą

ce klawisze :

- <L> - wybór dane1
- <P> - wybór dane2
- <W> - wykonanie operacji
- <1>, <0> - wprowadzenie warto

ś

ci danej

- <Enter> - akceptacja danej
- <BS> - korekta
- <Esc> - wyj

ś

cie z programu


Z chwil

ą

wprowadzenia danej z linii wy

ś

wietlamy j

ą

w stałym miejscu ekranu w

kodzie szesnastkowym, a w nawiasach [] w kodzie ósemkowym. Na ekranie
zmieniamy tylko te pola które uległy zmianie. W

ś

rodku mi

ę

dzy danymi na

ekranie umieszczamy znak operacji.
Na pocz

ą

tku programu dan

ą

1 oraz dan

ą

2 zerujemy i wy

ś

wietlamy je na ekranie a

polu wyniku spacje. Zmiana dowolnej danej „kasuje” na ekranie poprzedni wynik.
Dla operacji arytmetycznych wynik operacji wy

ś

wietlamy w stałym miejscu ekranu

w kodzie szesnastkowym, a w nawiasach [] w kodzie ósemkowym. Dla wyniku
operacji z bł

ę

dem (np. dzielenie przez 0) lub przekroczymy zakres liczby

wy

ś

wietlamy w polu wyniku „***”.


Przykładowy wygl

ą

d ekranu


Dana1 = 0A [012]

+

Dana2 = FF [177]

=

Wynik = 09 [011]


Linia polece

ń

: L 00001101





background image

Materiały pomocnicze:


Pobieranie danych z klawiatury

1.

Wykrywanie naciśnięcia wybranych pojedynczych kodów ASCII

Siódma funkcja przerwania 21h umożliwia pobranie jednego znaku z klawiatury. Funkcja zwraca
wartość w rejestrze AL. W celu wykrycia naciśnięcia wybranych klawiszy należy napisać
procedurę odpowiednich porównań i skoków warunkowych (patrz skrócona lista rozkazów x86).
Instrukcja porównania ma następującą postać:

cmp arg1, arg2

np.:

cmp al,30h

W wyniku jej zadziałania ustawiane są odpowiednie flagi procesora. Kod ASCII z którym
porównujemy rejestr AL można podać w postaci cyfry (np.: 48, 30h) lub wstawienie zlecić
asemblerowi przez wstawienie w apostrofach znaku jaki nas interesuje (np. ‘0’).
Przykładowy fragment programu reagujący na naciśnięcie klawiszy + oraz - :

TASM

/

FASM

ety1:
mov ah,7
int 21h
cmp al,'+’
je ety1
cmp al,'-'
je ety2
jmp ety1

ety1:

; operacje

ety2:

;operacje


background image

Wyświetlanie wartości zmiennych


1.

Wyświetlanie zmiennej w postaci binarnej
Najprostszy sposób wyświetlenia zmiennej w postaci binarnej polega na wysuwaniu
kolejnych bitów ze zmiennej przez flagę C w rejestrze flagowym procesora. Rozkaz
taki posiada mnemonik RCL. Przykładowa funkcja wyświetlająca wartość zmiennej
za pomocą wysuwania kolejnych bitów i wyświetlaniu 1, gdy flaga C jest ustawiona i
0, gdy nie jest ustawiona może wyglądać następująco:

TASM

/

FASM

wysw_bin:
mov cl,8
ety1:
push cx
rcl [zmienna],1
jc ety2
mov dl,'0'
jmp ety3
ety2:
mov dl,'1'
ety3:
mov ah,2
int 21h
pop cx
loop ety1
rcl [zmienna],1
ret



background image

2.

Wyświetlanie zmiennej w kodzie ósemkowym
Wyświetlanie w kodzie ósemkowym polega na podziale zmiennej na 3 bitowe pola,
np.: wartość 01011110 należy podzielić na grupy 01 011 110 i wyświetlić kody
ASCII otrzymanych wartości tj. 136. W celu wyświetlenia pierwszej cyfry konieczne
jest przesunięcie 2 najstarszych bitów na pozycje 0 oraz 1 bajtu (z usunięciem
pozostałych bitów zmiennej) oraz dodaniem wartości 30h, w wyniku czego z cyfry 2
otrzymamy kod ASCII cyfry 2 (kod o numerze 50 dziesiętnie lub 32h szesnastkowo).
Przesunięcia bitowe mają mnemonik SHR dla przesunięcia w prawo oraz SHL w
lewo. Kolejne grupy bitów w identyczny sposób należy przesunąć na pozycje bitowe
0-2. Przykładowy program może wyglądać następująco:

TASM

/

FASM

wysw_oct:
mov al,[zmienna] ;pierwsza cyfra oct
shr al,6
add al,30h
mov dl,al
mov ah,2
int 21h

mov al,[zmienna] ;druga cyfra oct
shl al,2
shr al,5
add al,30h
mov dl,al
mov ah,2
int 21h

mov al,[zmienna] ; trzecia cyfra oct
and al,7
add al,30h
mov dl,al
mov ah,2
int 21h
ret



background image

3.

Wyświetlanie zmiennej w postaci dziesiętnej
Wyświetlanie w kodzie dziesiętnym pojedynczego bajtu polega na wydzieleniu
wartości setek, dziesiątek i jedności (dla zmiennych o wielobajtowych będą
dochodziły kolejne potęgi dziesiątki – tysiące, dziesiątki tysięcy itd.).
Dzielenie instrukcją DIV wymaga podania jedynie dzielnika, gdyż dzielna musi
znajdować się w ustalonym rejestrze (rejestrach). Również wynik dzielenia znajduje
się również ustalonych rejestrach np.:

DIV BL

Powoduje wykonanie operacji dzielenia zmiennej znajdującej się w rejestrze AX
przez rejestr BL. Część całkowita z dzielenia znajdzie się w rejestrze AL, natomiast w
rejestrze AH znajdzie się reszta z dzielenia.
Kolejne operacje dzielenia umożliwiają uzyskanie kolejnych reszt z dzielenia, które
należy zamienić na kody ASCII cyfr. Dzielenia należy wykonywać dopóki część
całkowita z dzielenia jest większa niż 10. Przykładowy podprogram może wyglądać
następująco:

TASM

/

FASM

wysw_dec:
mov al,[zmienna]
mov ah,0
mov bl,10
div bl

mov dl,ah ;ah - jednostki,
add dl,30h ; al -setki i dziesiatki
push dx

mov ah,0
div bl ;ah - dziesiatki, al - setki
add ax,3030h
push ax
mov dl ,al

mov ah,2 ;wyswielt setki
int 21h

pop ax
mov dl,ah ;wyswietl dziesiatki
mov ah,2
int 21h

pop dx ;wyswietl jednostki
mov ah,2
int 21h
ret

background image

4.

Wyświetlanie zmiennej w postaci heksadecymalnej
Wyświetlanie w kodzie heksadecymalnym jest bardzo podobne do wyświetlania w
kodzie ósemkowym. Polega na podziale zmiennej na 4 bitowe pola, np.: wartość
01011110 należy podzielić na grupy 0101 1110 i wyświetlić kody ASCII otrzymanych
wartości tj. 5E. W celu wyświetlenia pierwszej cyfry konieczne jest przesunięcie 4
starszych bitów na pozycje 4 młodszych bitów bajtu. Dla cyfr 0-9 wyświetlenie polega
na dodaniu wartości 30h, w wyniku czego otrzymamy kod ASCII cyfry. Dla wartości
większych niż 9 konieczne jest dodanie takiej wartości, aby w jej wyniku uzyskać
zakres liter A-F. Kod ASCII liter wynoszą:
A - 65, B – 66 … F – 70. Konieczne jest zatem dodanie wartości 55 w przypadku, gdy
w bajcie znajdują się liczby większe niż 9. Przykładowy podprogram może wyglądać
następująco:

TASM

/

FASM

wysw_hex:
mov al,[zmienna] ;pierwsza cyfra hex
shr al,4
cmp al,10
jb ety4
add al,55 ; kody ascii liter
jmp ety5
ety4:
add al,30h
ety5:
mov dl,al
mov ah,2
int 21h

mov al,[zmienna] ;druga cyfra hex
and al,0Fh
cmp al,10
jb ety6
add al,55 ; kody ascii liter
jmp ety7
ety6:
add al,30h
ety7:
mov dl,al
mov ah,2
int 21h
ret




Wyszukiwarka

Podobne podstrony:
Bio lab cw 10 id 85936 Nieznany (2)
cw med 5 id 122239 Nieznany
PO lab 5 id 364195 Nieznany
lab [5] id 258102 Nieznany
lab [1] id 258099 Nieznany
chemia fizyczna lab id 112228 Nieznany
cw excel3 id 166408 Nieznany
cw 6 podobienstwo id 122439 Nieznany
cw 13 id 121763 Nieznany
Lab 4 id 257946 Nieznany
Cw mikrob 2 id 122249 Nieznany
CW K2 id 217375 Nieznany
cw mocz id 100534 Nieznany
cw med 2 id 122233 Nieznany
cw 11 id 122151 Nieznany
Instrukcja cw 3 PI id 216486 Nieznany
cw 1 ZL id 100327 Nieznany
Lab 1 id 257555 Nieznany
fcs lab 5 id 169065 Nieznany

więcej podobnych podstron