6 Podstawowe operacje arytmetyczne – cz.2.

Transkrypt

6 Podstawowe operacje arytmetyczne – cz.2.
Technika Mikroprocesorowa – Asembler
Materiały do ćwiczeń laboratoryjnych
1
6 Podstawowe operacje arytmetyczne – cz.2.
Zagadnienia do przygotowania:
- przypomnienie poleceń asemblerowych z zajęć nr 1-5,
- pojęcia: bit przeniesienia - C, rejestr stanu, kod U2 (uzupełnieniowy
do dwóch),
- polecenia: ADDC, SUBB, SJMP, MUL AB, XCH.
Wstęp
Bit przeniesienia
Bit przeniesienia C jest ustawiany (na 1) w wyniku zaistnienia przeniesienia z
najstarszego bitu (MSB – ang. Most Significant Bit) na zewnątrz lub pożyczka z zewnątrz na
MSB podczas wykonywania operacji arytmetycznych lub logicznych. Bit ten jest jednym z
bitów (flag) rejestru stanu (PSW – ang. Program Status Word).
Rejestr stanu
Rejestr stanu to rejestr procesora lub urządzenia zewnętrznego określający stan
wywołany wykonaniem ostatniej operacji lub informujący o trwaniu operacji lub jej
zakończeniu i skutkach. Programowe sprawdzanie rejestru stanu pozwala na sterowanie pracą
procesora lub urządzenia. W skład rejestru stanu wchodzą bity: znaku (ustawiany, gdy wynik
operacji jest ujemny), zera (ustawiany, gdy wynik operacji jest równy 0), przeniesienia
połówkowego (z bitu 3 na 4), przeniesienia (z/na MSB), parzystości (0 oznacza parzystą
liczbę jedynek w badanym słowie), przepełnienia/nadmiaru (ustawiany, gdy nastąpiło
przeniesienie na bit znaku lub pożyczka na bit znaku).
Kod U2
Kod uzupełnień do dwóch (w skrócie U2 lub ZU2) jest obecnie najpopularniejszym
sposobem zapisu liczb całkowitych na bitach. Jego popularność wynika z faktu, że operacje
dodawania i odejmowania są w nim wykonywane tak samo jak dla liczb binarnych bez znaku.
Z tego też powodu oszczędza się na kodach rozkazów procesora. Zaletą tego kodu jest też
istnienie tylko jednego zera. Przedział kodowanych liczb nie jest zatem symetryczny. W U2
na n bitach da się zapisać liczby z zakresu: [-2n-1 , 2n-1-1].
Dla 8 bitów (bajta) są to liczby od –128 do 127. Liczba –2n–1 nie posiada swojego
przeciwieństwa w n-bitowej reprezentacji kodu U2. W dwójkowym systemie liczbowym
najstarszy bit liczby n-cyfrowej ma wagę 2n–1. Jedyną różnicą, jaką wprowadza tu kod U2,
jest zmiana wagi tego bitu na przeciwną (–2n–1). Bit ten jest nazywany bitem znaku, ponieważ
świadczy o znaku całej liczby – jeśli jest ustawiony (=1) cała liczba jest ujemna, jeśli jest
skasowany (=0) – liczba jest dodatnia lub równa 0.
W celu zamiany liczby w U2 na przeciwną, należy wykonać dwa kroki: 1) dokonać inwersji
bitów, czyli pozamieniać 0 na 1 i odwrotnie, 2) zwiększyć wynik o 1.
Przykład:
Technika Mikroprocesorowa – Asembler
Materiały do ćwiczeń laboratoryjnych
2
01001010U2 = 0 ⋅ -(27) + 1 ⋅ 26 + 0 ⋅ 25 + 0 ⋅ 24 + 1 ⋅ 23 + 0 ⋅ 22 + 1 ⋅ 21 + 0 ⋅ 20 = 7410
Po inwersji: 10110101, zwiększamy o 1:
10110110U2 = 1 ⋅ -(27) + 0 ⋅ 26 + 1 ⋅ 25 + 1 ⋅ 24 + 0 ⋅ 23 + 1 ⋅ 22 + 1 ⋅ 21 + 0 ⋅ 20 = -7410
Dodawanie i odejmowanie w U2 odbywa się standardową metodą – traktujemy liczby jako
zwykłe liczby binarne (dodatnie), dodajemy je lub odejmujemy, a wynik otrzymujemy w
zapisie U2. Dodawanie i odejmowanie odbywa się łącznie z bitem znaku, a przeniesienia i
pożyczki poza najstarszy bit (bit znaku) ignorujemy. Jeśli jednak przepełnienie (lub
pożyczka) nie będzie występować jednocześnie na bit znaku i poza niego, wówczas możemy
być pewni przekroczenia zakresu wyniku np.
0110U2 (6)
+0111U2 (7)
---------------
=1101U2
(-23+22+20=-3) – przekroczenie zakresu wyniku – wynik nieprawidłowy
(z przeniesieniem tylko na bit znaku);
1100U2 (-4)
+ 1101U2 (-3)
-----------------
=11001U2 (-23+20=-7) – wynik prawidłowy na 4 bitach (z przeniesieniem na bit znaku i poza
niego); 5-y bit nie jest brany pod uwagę;
1100U2 (-4)
+ 0101U2 (5)
-----------------
=10001U2 (20=1) – wynik prawidłowy na 4 bitach (z przeniesieniem na bit znaku i poza
niego); 5-y bit nie jest brany pod uwagę;
Przykład 4-bitowego systemu U2 przedstawiono w tabeli 1.
Tabela 1
Technika Mikroprocesorowa – Asembler
Materiały do ćwiczeń laboratoryjnych
3
6.1 Ćwiczenia do wykonania
6.1.1 Stworzenie nowego projektu w środowisku Keil
6.1.2 Dodawanie liczb o wyniku większym od 255 (praca wspólna):
- wpisać do akumulatora liczbę 250,
- dodać liczbę 120,
- użyć odpowiednich przekształceń matematycznych w celu wyświetlenia wyniku,
- wynik dodawania wyświetlić na LCD (w kodzie BCD),
- zapalić diodę testową, jeśli bit przeniesienia jest równy 1.
6.1.3 Modyfikacja poprzedniego programu (praca samodzielna):
- polecenie ADD zastąpić poleceniem ADDC,
- na początku programu ustawić bit przeniesienia na 1,
- sprawdzić działanie programu.
6.1.4 Odejmowanie (praca wspólna):
- wykonać odejmowanie np. ‘10-1’, wykorzystać polecenie SUBB,
- odejmowanie wykonać w 2 przypadkach: zerując bit C i ustawiając bit C na 1,
- sprawdzić działanie programu i określić wnioski (jak wykonywane jest
odejmowanie?).
6.1.5 Odejmowanie – wynik ujemny (praca wspólna):
- napisać program wykonujący kilka operacji odejmowania/dodawania z wynikami
ujemnymi (na czym polega kod UV2?),
- użyć pustej pętli SJMP $.
6.1.6 Mnożenie (praca wspólna):
- napisać program mnożący dwie liczby np. 10*2,
- wyświetlić wynik w HEX na LCD wykorzystując polecenie XCH.
6.1.7 Kalkulator - mnożenie (praca samodzielna):
- napisać program mnożący dwie liczby wprowadzone z klawiatury matrycowej
(liczby z zakresu 0-15 tak jak na poprzednich zajęciach),
- wynik wyświetlić w postaci dziesiętnej (uwaga – wynik max. = 225, nie ma potrzeby
zajmowania się bardziej znaczącą częścią wyniku mnożenia – „B”),
- należy wynik (z założenia 3-cyfrowy) przeliczyć matematycznie w celu poprawnego
wyświetlenia (powtórzenie z poprzednich zajęć).

Podobne dokumenty