Temat: Konwersja szesnastkowo-dziesiętna.
Skład grupy:
Paweł Wyszyński
Arkadiusz Żanowski
Zadanie:
Zamodelować program realizujący konwersję szesnastkowo-dziesiętną za pomocą procesora Z80.
Do zrealizowania tego zadania zakładamy że:
liczba poddawana konwersji jest ośmiobitowa i znajduje się w komórce pamięci o adresie 100h;
wynik konwersji zapisany zostaje w następującej postaci:
- w komórce 101h - liczba setek;
- w komórce 102h - liczba dziesiątek;
- w komórce 103h - liczba jedności;
Algorytm działania programu:
Sprawdź czy liczba jest większa lub równa 100, jeśli tak to podziel ją przez 100, wynik zapisz do komórki pamięci 101h. Przejdź do 2). Jeśli nie to do 101h wpisz wartość 0. Jeśli liczba jest mniejsza od 100 i jest większa lub równa 10 to podziel ją przez 10, wynik zapisz do komórki pamięci 102h. Jeśli liczba jest mniejsza od 10 to zapisz ją do komórki pamięci 103h.
Resztę z dzielenia przez 100 sprawdź czy jest większa lub równa 10 jeśli tak to podziel ją przez 10, wynik zapisz do komórki pamięci 102h. Przejdź do 3). Jeśli nie to do 101h wpisz wartość 0.
Resztę z dzielenia przez 10 wpisz do komórki pamięci 103h.
Graficzny algorytm programu:
Program konwersji z opisami:
################################################################################
# #
# Micro Series Z80 Assembler V1.25/MD1 14/Apr/99 19:30:05 #
# #
# Source = c:kon.s01 #
# List = c:kon.lst #
# Object = c:kon.r01 #
# Options = #
# #
# (c) Copyright IAR Systems 1984 #
################################################################################
1 ;konwersja szesnastkowo-dziesiętna
2 ;wejście 100h
3 ;wynik 101h-setki, 102h-dziesiatki, 103h-jednosci
4
5 0000 org 0h
6 0000 3A0001 ld a,(100h)
7 0003 4F ld c,a
8 0004 3E64 ld a,100 ;sprawdzanie czy liczba < 100
9 0006 B9 cp c ;porównaj zawartość c z a
10 0007 CA1500 jp z,pierwsza
11 000A DA1500 jp c,pierwsza
12 000D 3E00 ld a,0 ;mniejsza do 100 wiec do 101h wartość 0
13 000F 320101 ld (101h),a
14 0012 C32200 jp druga ;mniejsze od 100 to do druga
15 0015 pierwsza: ;dzielenie przez 100
16 0015 1664 ld d,100
17 0017 CD4B00 call dziel
18 001A 79 ld a,c
19 001B 320101 ld (101h),a
20 001E 48 ld c,b
21 001F C33300 jp druga1
22 0022 druga: ;mniejsza od 100
23 0022 3E0A ld a,10 ;sprawdzanie czy liczba < 10
24 0024 B9 cp c
25 0025 CA3300 jp z,druga1
26 0028 DA3300 jp c,druga1 ;mniejsze od 10 to do trzecia i od 102 wartość 0
27 002B 3E00 ld a,0
28 002D 320201 ld (102h),a
29 0030 C34300 jp trzecia
30 0033 druga1:
31 0033 160A ld d,10
32 0035 CD4B00 call dziel
33 0038 79 ld a,c
34 0039 320201 ld (102h),a ;wynik dzielenia przez 10
35 003C 78 ld a,b
36 003D 320301 ld (103h),a ;reszta z dzielenia przez 10
37 0040 C34A00 jp koniec
38 0043 trzecia: ;mniejsza od 10
39 0043 79 ld a,c
40 0044 320301 ld (103h),a ;to co na wejściu było to do 103h bo mniejsze od 10
41 0047 C34A00 jp koniec
42
43 004A koniec:
44 004A 76 halt
45
46 004B dziel: ;dzielenie z poprzedniego laboratorium
47 004B 0600 ld b,0
48 004D 1E09 ld e,9 ;inicjalizacja licznika bitów w rejestrze pomocniczym
49 004F 78 ld a,b ;najbardziej znaczący bit dzielnika do akumulatora
50 0050 start:
51 0050 47 ld b,a ;zawartość a do b
52 0051 79 ld a,c ;najmniej znaczący bit dzielnej do akumulatora
53 0052 17 rla ;przesuń akumulator w lewo (najmniej znaczący bit
54 ;dzielnika)
55 0053 4F ld c,a ;zawartość akumulatora zapisz do c
56 0054 1D dec e ;zmniejsz o 1 licznik bitów
57 0055 CA6200 jp z,p1 ;jeśli licznik=0 to skocz do p1
58 0058 78 ld a,b ;najbardziej znaczący bit dzielnej do akumulatora
59 0059 17 rla ;przesuń w lewo a (najbardziej znaczący bit dzielnika)
60 005A 92 sub d ;odejmij od a zawartość d (dzielnik)
61 005B D25000 jp nc,start ;jeśli CY=0 to skocz na start
62 005E 82 add a,d ;jeśli nie to dodaj do a zawartość d (dzielnik)
63 005F C35000 jp start ;skocz na start
64 0062 p1:
65 ;p1 jest wykonywane dopiero po przetestowaniu
66 ;wszystkich bitów
67
68 0062 17 rla ;przesuń a w lewo
69 0063 5F ld e,a ;zawartość a do e (rejestr pomocniczy)
70 0064 3EFF ld a,255 ;do a wpisz wartość 255 (FFh)
71 0066 A9 xor c ;dodaj modulo 2 zawartość c do akumulatora
72 0067 4F ld c,a ;zawartość a zapisz do c (wynik dzielenia)
73 0068 7B ld a,e ;zawartość e (rejestr pomocniczy) do akumulatora
74 0069 1F rra ;przesuń w prawo akumulator
75 006A C9 ret
76
77 006B end
Errors: None #######
Bytes: 107 # kon #
CRC: DB10 #######
Konwersja szesnastkowo-dziesiętna wykorzystuje algorytm dzielenia, operację porównywana zawartości rejestrów oraz zapisu poszczególnych wyników do odpowiednich komórek pamięci. Operację dzielenia przeprowadzamy za pomocą programu zamodelowanego na poprzednim laboratorium.
Przykładowa konwersja i postać jej zapisu w programie:
Liczba - 100h |
101h |
102h |
103h |
FF (255) |
02 |
05 |
05 |
CB (203) |
02 |
00 |
03 |
AA (170) |
01 |
07 |
00 |
Laboratorium
z
Techniki Mikroprocesorowej
Temat: Konwersja szesnastkowo-dziesiętna.
Skład grupy:
Paweł Wyszyński
Arkadiusz Żanowski
Sprawdź, czy liczba lub reszta dzielenia przez100 jest >=10...
Podziel przez 100, wynik wstaw do 101h
Sprawdź, czy liczba jest >=100...
START
Podziel przez 10, wynik wstaw do 102h
Wstaw resztę z dzielenia przez 10 do 103h
Zapisz liczbę do 103h
Koniec