[Saidi indeks] [Sisukord]
 

 


4.4. Aritmeetikatehted

4.4.1. Arvude esitamine protsessoris

4.4.1.1. Põhimõte
Protsessoris Z80180 esitatakse arve otsekoodis, kui kasutatakse ainult positiivseid arve või kahendtäiendkoodis, kui kasutatakse korraga nii positiivseid kui ka negatiivseid arve. Otsekood on tavaline kahendkood, kahendtäiendkoodi korral on arvu vanim bitt märgibitt. Positiivsete arvude märgibitt on 0, negatiivsetel 1.

HBinaarkoodKümnendkood, kui binaararv on HBinaarkoodKümnendkood, kui binaararv on
otsekoodistäiendkoodisotsekoodistäiendkoodis
F111115-1701117+7
E111014-2601106+6
D110113-3501015+5
C110012-4401004+4
B101111-5300113+3
A101010-6200102+2
910019 -7100011+1
810008 -80000000
Tabel 4.4.1: Arvude esitamine protsessoris
H - heksakood

Positiivse ja negatiivse arvu teisendamiseks vastavalt negatiivseks ja positiivseks (1) inverteeritakse teisendatava arvu kõik bitid, mis on samaväärne lahutamisega arvust, mille kõik bitid on ühed, ja liidetakse saadud arvule 1 või (2) lahutatakse teisendatav arv arvust null.
Täiendkoodis oleva sama absoluutväärtusega positiivse ja negatiivse arvu summa on null.

D(1)D(1)D(2)D(2)
+ 60110- 6101000000000 arv null
10010101 inverteeritud arv+ 6-0110- 6-1010 lahutada teisendatav arv
+ 1+ 1 liita 1- 61010+ 60110tulemus
- 61010+ 60110tulemus

Programmi täitmise kiiruse seisukohast on meetod (2) kiirem, sest kahe tehte (lahutamine ja liitmine) asemel tuleb teha vaid 1 tehe (lahutamine).
Protsessoril on olemas käsk CPL 8-bitise arvu inverteerimiseks ja käsk NEG 8-bitise arvu teisendamiseks negatiivseks või positiivseks.

4.4.1.2. Ülesanded
(1) Koostada algoritm ja programm 16-bitise arvu teisendamiseks negatiivseks ja positiivseks.

4.4.2. Korrutamine

4.4.2.1. Põhimõte
Protsessoril Z80180 on olemas käsk MLT ww 8-bitiste arvude korrutamiseks. Kui vajatakse suuremat bittide arvu, tuleb vastavad (alam)programmid ise koostada. See vajadus tekib aga kohe siis, kui soovitakse teostada signaali- ja andmetöötlust

Korrutamisalgoritme on mitmeid. Siin vaadeldakse algoritmi, mille korral korrutatakse järjest korrutaja vanima kohaga läbi korrutatav, saadud vahetulemus liidetakse lõpptulemusele ja nihutatakse lõpptulemust 1 koha võrra vasemale [14, lk. 185...187]. Selliste tsüklite arv on võrdne korrutaja kohtade arvuga. Tulemuse kohtade arv on võrdne korrutaja ja korrutatava kohtade arvu summaga. Seega kahe 8-bitise arvu korrutis on maksimaalselt 16-bitine, 8- ja 16-bitise arvu korrutis on maksimaalselt 24-bitine jne. Nt.:


56D*453D=25368D		38H*1C5H=(0)6318H		01B*101B=(00)101B
99D*999D=98901D 	FFH*FFFH=FEF01H 		11B*111B=10101B 

(D - kümnendkood; H - heksakood; B - binaarkood)

[Image - Joonis 4.4.1]
Joonis 4.4.1: Kahendsüsteemis korrutamine
See põhialgoritm joonisel 4.4.1 on ühesugune nii täis- kui ka murdarvude korrutamisel. Programmi kasutaja peab siis ise jälgima, et täis- ja murdosad saaksid õigesti interpreteeritud. Nt.:
14.5D*10.5D=(0)152.25D	E.8H*A.8H=98.4(0)H
1110.1000B*1010.1000B=10011000.01000000B 
Algoritmis joonisel 4.4.2 esinevad tähised nagu VAHETULEMUS, LOENDUR, KORRUTAJA, KORRUTATAV, TULEMUS jne. tähistavad registreid ja/või mälupesi, kus on vastavad suurused. Korrutamisprogrammi sisendandmeteks on tegurid, väljundandmeteks korrutis.

[Image - Joonis 4.4.2]
Joonis 4.4.2: Korrutamine vahetulemi nihutamisega vasemale
Kui kasutatakse ka negatiivseid arve, tuleb enne korrutamist leida nende absoluutväärtused. Seejärel määrata tegurite märkide järgi korrutise märk ja see korrutamise ajaks salvestada, et pärast korrutis õigele kujule viia.
Korrutise märgi määramiseks tuleb tegurite märgibittidega teha XOR-tehe. Vastavalt selle tulemusele seada Carry-lipp (CF). Kui korrutis on positiivne, siis CF:=0, kui aga negatiivne, siis CF:=1. Carry-lipu seis tuleb korrutamise ajaks säilitada. Selleks on kõige otstarbekam viia lipuregister käsuga PUSH AF pinusse ja pärast korrutamist lugeda korrutise märk pinust käsuga POP AF. Seejuures tuleb jälgida, et pinusse salvestamiste ja pinust lugemiste arv oleks võrdne. Vastavalt Carry seisule seada korrutise märk.

4.4.2.2. Ülesanded
(1) Siluda alljärgnev programm MLT816 vastavalt algoritmile joonisel 4.4.2. Esitada leitud vead. Täiendada seda programmi monitorprogrammis olevate alamprogrammidega nii, et tegureid oleks võimalik sisestada klaviatuurilt ja korrutis inditseerida kuvaril.

(2) Koostada programm kahe 32-bitise märgita arvu korrutamiseks. Programm koostada nii, et seda oleks võimalik kasutada teiste programmide alamprogrammina.

; Programm MLT816
;Programm korrutab omavahel 2 8-bitist märgita täis- vôi murdarvu, kusjuures korrutis 
;on 16-bitine. Korrutatav peab olema D-registris ja korrutaja E-registris. Korrutis on 
;registris HL. Kasutatakse DE-, HL-, BC- ja A-registreid.

		include LKZ180.INC

MLT816:	LD	SP,STACK		;Seada pinuviit
		LD	HL,0H		;Vahetulemus:=0
		LD	BC,08H		;C:=loendur
MLT8162:	LD	A,L
		SRA	E
		JP	C,MLT8163	;Korrutaja vanim bitt = 0? 
		ADD	A,D		;Liita tulemusele korrutatav
		LD	L,A
		LD	A,H
		ADC	A,B
		LD	H,A
MLT8163:	DEC	C		;Vähendada loendurit
		JP	Z,MLT8161	;Loendur = 0? Kui JA, minna lõppu
		SLA	L		;Ei, nihutada tulemust vasemale
		RR	H
		JP	MLT8162		;Tagasi tsükli algusesse
MLT8161:	RST	8

		END
(3) Koostada algoritm märgiga arvude korrutamiseks. Koostada programm märgiga arvude korrutamiseks, kasutades silutud programmi MLT816, enda koostatud programmi 32-bitiste arvude korrutamiseks või püsimälus olevat 16-bitiste arvude korrutamise alamprogrammi MULT16.

4.4.3. Täisarvude jagamine

4.4.3.1. Põhimõte
Protsessoril Z80180 puuduvad käsud jagamistehete sooritamiseks. Seepärast tuleb kasutajal vajaduse korral vastavad alamprogrammid ise koostada.
Jagamine toimub binaar- ja heksakoodis sama algoritmi järgi nagu kümnendkoodiski [14, lk.187...192]:

[Image - Jagamine]

[Image - Joonis 4.4.3]

Joonis 4.4.3: Täisarvude jagamine

Kui jagatav ja/või jagaja on märgiga arvud, tuleb selgitada välja jagatise ja jäägi märgid ning need jagamise ajaks salvestada. Seejärel teisendada negatiivsed arvud positiivseks, teostada jagamine ja vastavalt salvestatud märkidele teisendada jagatis ning jääk.
Märgid määratakse järgmiselt [15, lk.95]:

(+) : (+) = (+, +)
(+) : (-) = (-, +)
(-) : (+) = (-, -)
(-) : (-) = (+, -)

Sulgudes paremal pool võrdusmärki on vasemal jagatise märk ja paremal - jäägi märk. n-bitise täisarvu jagamisel m-bitise täisarvuga (n >= m) on jagatis maksimaalselt n-bitine (16:1=16). Alamprogrammidesse tuleb enne jagamise teostamist lisada jagaja kontroll. Kui jagaja on null, tuleb seada vealipp ja väljuda programmist. Võib lisada ka jagatava kontrolli. Kui jagatav on null, kirjutada jagatiseks kohe null ja väljuda programmist. See lisakontroll muudab nullise jagatava korral programmi kestuse lühemaks, mittenullise jagatava korral aga pisut pikemaks.

4.4.3.2. Ülesanded
(1) Siluda ja kommenteerida alamprogramm DIV8. Esitada avastatud vead. Millises registris on jääk?

(2) Koostada jagamisalgoritmid koos nullise jagaja kontrolliga, nullise jagatava kontrolliga ning jagatise ja jäägi märkide määramisega.

(3) Koostada programm 16-bitise märgiga täisarvu jagamiseks 16-bitise märgita täisarvuga, kontrollides seejuures kas jagatav ja jagaja on nullid või mitte.

; Programm DIV8
;Programm jagab 2 8-bitist märgita täisarvu. Jagatav peab olema registris B, jagaja aga
; registris C. Tulemus on registris L. Kui jagaja on 0, kirjutatakse L-registrisse tulemus FFH. 
;Jääk on D-registris. Kasutatakse A-, BC-, HL- ja D-registreid. 

		include LKZ180.INC

DIV8:		LD	SP,STACK
		LD	H,08H
		LD	D,0H
		LD	L,0H
		LD	A,0FFH
		TST	C
		JP	NZ,DIV80
		LD	L,0FFH
		JP	DIV82
DIV80:	SLA	B
		RR	D
		LD	D,A
		ADD	C
		JP	NC,DIV81
		LD	D,A
		SCF
		RL	L
		JP	DIV83
DIV81:	SCF
		CCF
		RR	L
DIV83:		DEC	H
		JP	Z,DIV82
		JP	DIV80
DIV82:		RST	8

		END

4.4.4. Murdarvude jagamine

4.4.4.1. Põhimõte
Murdarvu T.M saab esitada järgmisel kujul [15, lk.12]:

T.M = TM*A^-n.

T - murdarvu täisosa, M - murdarvu murdosa, A - arvusüsteemi alus, n - murdosa kohtade arv.
Edaspidi vaadeldakse murdarve, kus murdosa kohtade arv võrdub täisosa kohtade arvuga. Nt.:

25.16D = 2516*10^-2 --> T=25, M=16, TM=2516, A=10, n=2
34A.D8CH = 34AD8C*16^-3 --> T=34A, M=D8C, TM=34AD8C, A=16, n=3
1101.1001B = 11011001*2^-4 --> T=1101, M=1001, TM=11011001, A=2, n=4

Selleks, et murdarvu T1.M1 jagamisel murdarvuga T2.M2 püsiks koma fikseerituna ja jagatise T.M täisosa kohtade arv võrduks murdosa kohtade arvuga, kasutatakse algoritmi:

T.M = T1.M1 / T2.M2 := [(T1M1*A^n) / T2.M2] · A^-n.

Jagamisel tuleb arvestada, et täis- ja murdosa kohtade arv võib kahekordistuda. Nt. FF.FFH:00.01H=FFFF.0000H, 00.01H:FF.FFH=0000.0001H

Märgiga murdarvude jagamine toimub analoogselt märgiga täisarvude jagamisele: määrata jagatise märk, salvestada see, teisendada negatiivsed arvud positiivseteks, jagada, teisendada vastavalt märgile jagatis. Samuti tuleb kontrollida, kas jagaja on null või mitte ja võiks kontrollida ka, kas jagatav on null.

4.4.4.2. Ülesanded
(1) Koostada algoritm ja programm 16-bitise (8+8) märgita murdarvu jagamiseks 16-bitise (8+8) märgita murdarvuga. Seejuures kontrollida, kas jagaja on null või mitte.

(2) Koostada algoritm ja programm 16-bitise (8+8) märgiga murdarvu jagamiseks 16-bitise (8+8) märgiga murdarvuga. Seejuures kontrollida, kas jagaja on null või mitte.


Üles seatud Thu., 09.07.1998.
Viimati muudetud Sat., 06.11.1999 03:07 PM CEST
WWW-lehekülje kujundus, õigused, vastutus © Heiki Kasemägi, 1998-1999

[Tagasi eelmisele leheküljele (JavaScript)] [Peatükid 4.1..4.3] [Sisukord] [Peatükk 4.5]