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ęć).