Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych



Podobne dokumenty
Ćwiczenie 3. Konwersja liczb binarnych

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Architektura komputerów. Asembler procesorów rodziny x86

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

Sterowanie pracą programu

1.1. Pozycyjne systemy liczbowe

ARYTMETYKA BINARNA. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia.

Techniki multimedialne

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

Cyfrowy zapis informacji. 5 grudnia 2013 Wojciech Kucewicz 2

Systemy zapisu liczb.

L6.1 Systemy liczenia stosowane w informatyce

Sprzęt i architektura komputerów

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Programowanie Niskopoziomowe

Systemy liczbowe używane w technice komputerowej

CPU ROM, RAM. Rejestry procesora. We/Wy. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki

Operacje arytmetyczne

Pzetestuj działanie pętli while i do...while na poniższym przykładzie:

Arytmetyka komputera. Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka. Opracował: Kamil Kowalski klasa III TI

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

Sprzęt i architektura komputerów

Architektura komputerów

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego

Zuzanna Hartleb i Artur Angiel

SYSTEMY LICZBOWE. Zapis w systemie dziesiętnym

12. Wprowadzenie Sygnały techniki cyfrowej Systemy liczbowe. Matematyka: Elektronika:

SYSTEMY LICZBOWE 275,538 =

Samodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =

Kod U2 Opracował: Andrzej Nowak

organizacja procesora 8086

DYDAKTYKA ZAGADNIENIA CYFROWE ZAGADNIENIA CYFROWE

Urządzenia Techniki. Klasa I TI. System dwójkowy (binarny) -> BIN. Przykład zamiany liczby dziesiętnej na binarną (DEC -> BIN):

Zapis liczb binarnych ze znakiem

Przedmiot: Urządzenia techniki komputerowej Nauczyciel: Mirosław Ruciński

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

Luty 2001 Algorytmy (7) 2000/2001

System Liczbowe. Szesnastkowy ( heksadecymalny)

Architektura systemów komputerowych Laboratorium 7 Symulator SMS32 Stos, Tablice, Procedury

Architektura komputerów

Arytmetyka stałopozycyjna

Kodowanie informacji. Kody liczbowe

Kod znak-moduł. Wartość liczby wynosi. Reprezentacja liczb w kodzie ZM w 8-bitowym formacie:

Pracownia Komputerowa wykład V

Algorytmy i struktury danych. Wykład 4

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

INSTRUKCJE Instrukcje przeniesienia: Instrukcje konwersji: Arytmetyczne instrukcje:

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Znaki w tym systemie odpowiadają następującym liczbom: I=1, V=5, X=10, L=50, C=100, D=500, M=1000

Wstęp do Informatyki

Wstęp do informatyki- wykład 2

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

1259 (10) = 1 * * * * 100 = 1 * * * *1

B.B. 2. Sumowanie rozpoczynamy od ostatniej kolumny. Sumujemy cyfry w kolumnie zgodnie z podaną tabelką zapisując wynik pod kreską:

Ćwiczenie 2. Siedmiosegmentowy wyświetlacz LED

Systemy liczenia. 333= 3*100+3*10+3*1

System liczbowy jest zbiorem reguł określających jednolity sposób zapisu i nazewnictwa liczb.

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Kod uzupełnień do dwóch jest najczęściej stosowanym systemem zapisu liczb ujemnych wśród systemów binarnych.

Systemy liczbowe. 1. System liczbowy dziesiętny

1. Pobrać plik masm.zip (Macro Assembler 6.15 & Segmented Executable Linker 5.60) (

Pracownia elektryczno-elektroniczna klasa IV

Lista instrukcji mikroprocesora Programowanie w assemblerze

Architektura Systemów Komputerowych

ARCHITEKRURA KOMPUTERÓW Kodowanie liczb ze znakiem

DZIESIĘTNY SYSTEM LICZBOWY

Pracownia Komputerowa wykład IV

Wprowadzenie do informatyki i użytkowania komputerów. Kodowanie informacji System komputerowy

do instrukcja while (wyrażenie);

Wstęp do informatyki- wykład 1

Pracownia Komputerowa wyk ad V

PROGRAMY REZYDENTNE Terminate and State Resident, TSR

Wstęp do informatyki- wykład 1 Systemy liczbowe

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Jednostki informacji. Bajt moŝna podzielić na dwie połówki 4-bitowe nazywane tetradami (ang. nibbles).

1 Podstawy c++ w pigułce.

Metoda znak-moduł (ZM)

Logiczny model komputera i działanie procesora. Część 1.

Arytmetyka komputera

Adam Kotynia, Łukasz Kowalczyk

Programowanie komputera

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

Dane, informacja, programy. Kodowanie danych, kompresja stratna i bezstratna

Podstawy Informatyki

1. Operacje logiczne A B A OR B

Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.

Przykładowe pytania DSP 1

Adam Korzeniewski p Katedra Systemów Multimedialnych

Architektura systemów komputerowych Laboratorium 13 Symulator SMS32 Operacje na bitach

Adam Korzeniewski p Katedra Systemów Multimedialnych

Treść wykładu. Pierścienie wielomianów. Dzielenie wielomianów i algorytm Euklidesa Pierścienie ilorazowe wielomianów

Ćwiczenie nr 1: Systemy liczbowe

ARCHITEKTURA KOMPUTERÓW Systemy liczbowe

Pracownia Komputerowa wyk ad IV

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

Transkrypt:

Ćwiczenie nr 3 Wyświetlanie i wczytywanie danych 3.1 Wstęp Współczesne komputery przetwarzają dane zakodowane za pomocą ciągów zerojedynkowych. W szczególności przetwarzane liczby kodowane są w systemie dwójkowym. Ponieważ człowiek posługuje się systemem dziesiętnym zachodzi więc konieczność każdorazowego przetworzenia danych liczbowych na postać binarną przy wprowadzaniu ich do komputera i odwrotnie przy wyprowadzaniu danych. Okazuje się, że algorytmy używane do takiej zamiany są stosunkowo proste, i dają się łatwo zakodować na poziomie instrukcji procesora. Niniejsza instrukcja omawia podstawowe algorytmy używane przy wprowadzaniu i wyprowadzaniu danych liczbowych. 3.2 Zamiana liczby binarnej na dziesiętną Na poziomie programu, uzyskanie reprezentacji dziesiętnej pewnej liczby binarnej sprowadza się w istocie do uzyskania cyfr dziesiętnych tej liczby, zakodowanych w postaci znaków ASCII. W tym celu daną liczbę dzieli się wielokrotnie przez 10, a uzyskane reszty, po konwersji na znaki ASCII, stanowią poszukiwane cyfry. Wyjaśnimy to na przykładzie. Dzielna Reszta 27409 9 2740 0 274 4 27 7 2 2 0 Wprawdzie podany przykład dotyczy liczb dziesiętnych, ale identyczne wartości uzyskuje się dla liczb zapisanych w systemie dwójkowym wartość ilorazu i reszty z dzielenia nie zależy bowiem od podstawy systemu w jakim zostały zapisane liczby! Zauważmy, że po pierwszym dzieleniu uzyskaliśmy cyfrę jednostek, w drugim dzieleniu cyfrę dziesiątek, w trzecim dzieleniu cyfrę setek, itd. Uzyskane reszty można łatwo zamienić na cyfry w kodzie ASCII. Kody przyporządkowane kolejnym cyfrom podane są w poniższej tabelce. Cyfra Kod ASCII 0 30H 1 31H 2 32H 3 33H 4 34H 5 35H 6 36H 7 37H 8 38H 9 39H

Nietrudno zauważyć, że kod ASCII cyfry jest o 30H większy od wartości cyfry. Zatem zamiana na kod ASCII polega po prostu na dodaniu liczby 30H. Na poziomie instrukcji procesora dzielenie wykonywane jest za pomocą instrukcji: div dla liczb bez znaku, idiv dla liczb ze znakiem. Obie te instrukcje mają kilka odmian różniących się rozmiarem dzielnej i dzielnika. Przed wykonaniem dzielenia dzielna musi się znajdować w ustalonych (niżej podanych) rejestrach. Dzielnik może się znajdować w jednym z rejestrów ogólnego przeznaczenia albo w postaci 1-, 2- lub 4-bajtowej liczby umieszczonej w komórkach pamięci. Iloraz i reszta z dzielenia umieszczane są w ustalonych rejestrach. Dzielna, dzielnik, iloraz i reszta spełniają poniższą zależność dzielna = iloraz dzielnik+ reszta przy czym znak reszty jest taki sam jak znak dzielnej. Jednocześnie wartość bezwzględna reszty jest zawsze mniejsza od wartości bezwzględnej dzielnika. Zestawienie operandów i wyników instrukcji dzielenia div i idiv zawiera poniższa tabela. Rodzaj Dzielna Dzielnik Iloraz Reszta 64b./32b. EDX (starsza część) rejestr 32-bitowy albo i EAX (młodsza część) liczba 4-bajtowa w pamięci EAX EDX 32b./16b. DX (starsza część) rejestr 16-bitowy albo i AX (młodsza część) liczba 2-bajtowa w pamięci AX DX 16b./8b. AX rejestr 8-bitowy albo liczba 1- bajtowa w pamięci AL AH Przykładowo, instrukcja div bx wykonuje dzielenie liczby 32-bitowej bez znaku umieszczonej w rejestrach DX i AX przez liczbę 16-bitową bez znaku umieszczoną w rejestrze BX. Iloraz z dzielenia zostaje wpisany do rejestru AX, a reszta z dzielenia do rejestru DX. Przypuśćmy, że zamierzamy wyświetlić na ekranie w postaci dziesiętnej liczbę 16- bitową, która znajduje się w rejestrze AX. Jak to wcześniej opisano, konwersja wymaga wielokrotnego dzielenia podanej liczby przez 10. Czy instrukcja 16b./8b. będzie tu odpowiednia? Instrukcja ta dzieli liczbę 16-bitową przez 8-bitową, więc wydaje się doskonale pasować do postawionego zadania. Rozpatrzmy jednak prosty przykład. Jeśli w rejestrze AX znajduje się liczba 4705, a w rejestrze BL liczba 10, to w wyniku zastosowania instrukcji dzielenia div bl uzyskamy iloraz: 4705/10 = 470 i resztę: 4705 mod 10 = 5. Zauważmy jednak, że dla podanej instrukcji iloraz wpisywany jest do rejestru AL. Ponieważ AL jest rejestrem 8-bitowym, więc mogą być w nim przechowywane liczby bez znaku z zakresu 0 255. Zatem iloraz nie da się zapisać w rejestrze AL pojawi się nadmiar! Konsekwencją wystąpienia nadmiaru przy dzieleniu jest wyjątek generowany przez procesor, co praktycznie oznacza zakończenie wykonywania programu.

Tak więc wybrany rodzaj instrukcji dzielenia jest nieodpowiedni. Trzeba zatem wybrać dzielenie 32b./16b., w którym iloraz zapisywany jest w postaci liczby 16-bitowej i może przyjmować wartości z przedziału 0 65535. W tym jednak przypadku dzielna jest 32-bitowa. Jednak zamiana 16-bitowej liczby bez znaku na liczbę 32-bitową sprowadza się po prostu do wyzerowania najstarszych 16 bitów. Na podstawie podanych wyjaśnień można już napisać fragment programu wyznaczający kolejne cyfry dziesiętne. Ponieważ maksymalna wartość liczby w rejestrze AX wynosi 65535, więc w trakcie konwersji należy uzyskać 5 cyfr dziesiętnych. Omawiane czynności realizuje poniższy fragment programu. ;wyświetlanie liczby całkowitej zawartej w AX ;uwaga: poniższy fragment wymaga korekty (zob. dalszy opis)! div bx ;dzielenie przez 10 - iloraz w AX, reszta w DX add dx, 30 ;zamiana reszty na kod ASCII push ax ;przechowanie ilorazu na stosie mov ah, 2 int 21H ;wyświetlenie cyfry na ekranie pop ax ;przywrócenie ilorazu w AX loop p1 ;sterowanie pętlą Niestety, podany fragment nie będzie wyświetlał poprawnych wartości. Przykładowo, jeśli w rejestrze AX znajdować się będzie liczba 0100000000000000 (dziesiętnie 16384), to na ekranie pojawi się liczba 48361. Przyczyny uzyskania takiego wyniku są oczywiste: zastosowany algorytm generuje cyfry począwszy od jednostek, potem dziesiątek, setek, itd. I w takiej też kolejności cyfry wyświetlane są na ekranie. Istnieje kilka różnych sposobów poprawienia podanego programu. Jeden z tych sposobów wymaga magazynowania uzyskiwanych cyfr w tablicy. Po uzyskaniu wszystkich pięciu cyfr są one pobierane z tablicy w odpowiedniej kolejności i wyświetlane. Skorygowana wersja programu podana jest poniżej. ; wyświetlanie liczby całkowitej zawartej w AX dane SEGMENT cyfry db 5 dup (?) ;zdefiniowanie tablicy 5-cio bajtowej mov bx, SEG dane mov ds, bx mov si, 4 ;indeks początkowy w tablicy cyfry div bx ;dzielenie przez 10 - iloraz w AX, reszta w DX mov cyfry[si], dl ;odesłanie kodu ASCII kolejnej cyfry do tablicy dec si loop p1 mov cx, 5 ;wyświetlanie cyfr, liczba obiegów pętli p2: mov dl, cyfry[si] ;pobranie kodu ASCII kolejnej cyfry mov ah, 2 ;wyświetlenie cyfry na ekranie int 21H inc si ;zwiększenie indeksu w rejestrze SI o 1 loop p2 ;sterowanie pętlą wyświetlania

Przedstawione tu rozwiązania ma ciągle pewne wady. Wprawdzie liczba 0100000000000000 będzie wyświetlana poprawnie jako 16384, to jednak liczba 0000000011001111 (dziesiętnie 207) będzie wyświetlana w postaci 00207. W wyświetlanej liczbie zamiast dwóch pierwszych zer lewej strony powinny być umieszczone spacje. Zamiana na spacje nie może jednak obejmować wszystkich zer w liczbie, ale tylko zera z lewej strony przed pierwszą cyfrą niezerową. Podany niżej fragment programu zawiera także operacje usuwania zer nieznaczących z lewej strony. ; wyświetlanie liczby całkowitej zawartej w AX dane SEGMENT cyfry db 5 dup (?) mov bx, SEG dane mov ds, bx mov bx, 10 ; dzielnik mov si, 4 ;indeks początkowy w tablicy tbl_cyfr div bx ;dzielenie przez 10; iloraz w AX, reszta w DX mov cyfry[si], dl ;odesłanie kodu ASCII kolejnej cyfry do tablicy dec si ;zmniejszenie indeksu w rejestrze SI o 1 loop p1 ;sterowanie pętlą ;usuwanie zer nieznaczących z lewej strony mov cx, 4 ;liczba obiegów pętli usuwania zer nieznaczących p2: cmp byte PTR cyfry[si], 30H ;czy cyfra '0' jne druk mov byte PTR cyfry[si], 20H ;wpisanie kodu spacji w miejsce zera inc si loop p2 ;wyświetlanie cyfr druk: p3: mov dl, cyfry[si] ;pobranie kodu ASCII kolejnej cyfry mov ah, 2 ;wyświetlenie cyfry na ekranie int 21H inc si ;zwiększenie indeksu w rejestrze SI o 1 loop p3 ;sterowanie pętlą wyświetlania Rozpatrzymy teraz nieco inne rozwiązanie, w którym uzyskiwane cyfry będą gromadzone na stosie. Zaletą poniższego rozwiązania jest także to, że nie powstają tu zera nieznaczące z lewej strony. mov cx, 0 ;licznik cyfr div bx ;dzielenie przez 10 iloraz w AX, reszta w DX push dx ;zapisanie cyfry na stosie inc cx ;inkrementacja licznika cyfr cmp ax, 0 ;porównanie uzyskanego ilorazu jnz p1 ;skok gdy iloraz jest różny od zera p2: pop dx ;pobranie kodu ASCII kolejnej cyfry mov ah, 2 int 21H ;wyświetlenie cyfry na ekranie loop p2 ; sterowanie pętlą wyświetlania

3.3 Zamiana liczby dziesiętnej na binarną W poprzednio omówionym algorytmie konwersji na postać binarną stosowane było wielokrotne dzielenie przez 10. Z kolei przy zamianie z postaci dziesiętnej na binarnej wykonuje się wielokrotnie mnożenie przez 10. Wyjaśnimy to dokładniej na przykładzie. Przypuśćmy, że użytkownik programu napisał na klawiaturze liczbę 30982. Z punktu widzenia programu oznacza to, że zostały wprowadzone kody ASCII cyfr 3, 0, 9, 8, 2. W celu uzyskania postaci binarnej liczby trzeba wykonać obliczenie (na liczbach binarnych za pomocą rozkazów komputera): 3 10000 + 0 1000 + 9 100 + 8 10 + 2 = (((((0 10 + 3) 10 + 0) 10 + 9) 10 + 8) 10 + 2) Prawa strona powyższego wyrażenia wskazuje na możliwość zastosowania pętli: w każdym obiegu pętli należy mnożyć dotychczas uzyskany wynik przez 10 i dodać wartość kolejnej cyfry. Przyjmujemy, że początkowa wartość wyniku konwersji jest równa 0. Poniższy fragment wczytuje liczbę dziesiętną bez znaku z klawiatury i wpisuje ją w postaci binarnej do rejestru AX. Zakładamy, że liczba nie przekracza 65535. Po wprowadzeniu wszystkich cyfr liczby użytkownik naciska klawisz Enter. Ponadto zakładamy, że użytkownik programu wprowadza wyłącznie znaki cyfr i nie używa klawisza Backspace. ; wczytywanie liczby do AX, zakończenie wczytywania po Enter mov si, 0 ;początkowa wartość wyniku konwersji w SI p1: mov ah, 1 ;wczytanie znaku w kodzie ASCII int 21H ;z klawiatury do AL cmp al, 13 je nacis_enter ;skok gdy naciśnięto klawisz Enter sub al, 30H ;zamaiana kodu ASCII na wartość cyfry mov bl, al ;przechowanie kolejnej cyfry w AL mov bh, 0 ;zerowanie rejestru BH mov ax, 10 ;mnożnik mul si ;mnożenie dotychczas uzyskanego wyniku przez ;10 iloczyn zostaje wpisany do rejestrów DX:AX add ax, bx ;dodanie aktualnie wczytanej cyfry mov si, ax ;przesłanie wyniku obliczenia do rejestru SI jmp p1 ; nacis_enter: mov ax, si ;przepisanie wyniku konwersji do rejestru AX