ALTE DOCUMENTE |
"Elektroniniai mikroprocesoriiniai įtaisai ir valdikliai"
Pratybos
Mikroprocesoriuje visi duomenys yra isreiskiami 1 ir 0 ir veiksmai atliekami su skaičiais sudarytais tik is 1 ir 0. Skaičiavimo sistema, kurioje naudojami tik du skirtingi skaitmenys vadinama dvejetaine. Desimtainėje sistemoje yra 10 skaitmenų (0,1,2,3,4,5,6,7,8,9), astuntainėje - astuoni skaitmenys (0,1,2,3,4,5,6,7), o sesioliktainėje - sesiolika (0,1,2,3,4, 5,6,7,8,9,A,B,C,D,E,F). Desimtainė sistema naudojama rezultatams isvesti, nes prie jos yra pripratęs rezultatų vartotojas - zmogus.
Informacija yra matuojama bitais, baitais (1 baitas = 8 bitams), kilobaitais (1 KB = 1024 baitų), megabaitais (1 MB = 1024 KB) ir t.t. Dvejetainėje sistemoje uzrasyti kodai yra labai ilgi ir dėl to nepatogūs. mP zodį sudaro 8, 16, 32 ir net 64 bitai, todėl kodams rasyti naudojamos patogesnės astuntainė ir sesioliktainė skaičių sistemos.
Skaičius |
Skaičius |
Skaičius |
|||
Dvejetainis |
Desimtainis |
Dvejetainis |
Desimtainis |
Dvejetainis |
Desimtainis |
Dvejetainį skaičių, kaip ir bet kurį kitą, paversti desimtainiu galima sumuojant dėmenis, kuriuos sudaro skilties reiksmė padauginta is skaičiavimo sistemos pagrindo pakelto laipsniu, lygiu skilties numeriui. Pavyzdziui:
11010111=1x27+1x26+0x25+1x24+0x23+1x22+1x21+1x20 = 1x128+1x64+0x32+1x16+ +0x8+1x4+1x2+1 = 215
Pats didziausias skaičius, kurį galima sutalpinti į 8 dvejetaines skiltis (vieną baitą) 11111111 = 255.
Skaičiai paprastai koduojami baitais, todėl, norint uzkoduoti didesnį skaičių, reikia naudoti daugiau baitų. Registrų ir atmininių talpa matuojama baitais. Krastiniai baitai vadinami zemiausiuoju (LSB - Least Significant Bit) ir auksčiausiuoju (MSB - Most Significant Bit). Pavyzdziui, dviejuose baituose uzkoduotas skaičius būtų apskaičiuojamas prie zemiausiosios skilties reiksmes pridedant 256 kartus padidintą auksčiausiosios skilties reiksmę.
Auksčiausioji skiltis Zemiausioji skiltis
Bito Nr | |||||||||||||||||
Reiksmė |
Pavyzdziui:
Dviejų baitų dvejetainis skaičius 11110100 001011012, tai. du baitai:
vyresnysis 111101002 = 24410 ir jaunesnysis 001011012 = 4510.
Tokiu būdu 17517c24r dviejų baitų dvejetainį skaičių atitinka desimtainis skaičius:
244 x 256 + 45 = 6250910
Desimtainį skaičių verčiant dvejetainiu, pirmiausia is jo atimamas artimiausias mazesnis skaičius gautas pakėlus 2 laipsniu, po to tas pat daroma su gaunamomis liekanomis. Į skiltis, kurių reiksmės lygios artimiausiam skaičiui įrasome 1, o į kitas 0. Pavyzdziui:
Desimtainį skaičių 43 paversime dvejetainiu:
1. Randame 43 artimiausią mazesnį desimtainį skaičių lygų 2n, juo bus 32 = 25.. Į vyriausiąją skiltį įrasome 1 (100000).
2. Liekanai 43 - 32 = 11 artimiausias skaičius bus 23 = 8. Į jai atitinkančią skiltį įrasome 1 (101000).
3. Liekanai 43 - 32 - 8 = 3 artimiausias skaičius bus 21 = 2. Į jai atitinkančią skiltį įrasome 1 (101010).
4. Liekanai 43 - 32 - 8 - 2 = 1 artimiausias skaičius bus 20 = 1. Į jai atitinkančią skiltį įrasome 1 (101011).
5. Gautą rezultatą 43 = 101011 patikriname 1x25+0x24+1x23+0x22+1x21+1x20 = 43.
Uzduotys:
1) Dvejetainį skaičių 110111011 paverskite desimtainiu.
2) Desimtainį skaičių 12425 paverskite sesioliktainiu.
Aritmetiniai veiksmai su dvejetainiais skaičiais
Jų vykdymo taisyklės tokios pačios, kaip ir dirbant su desimtainiais skaičiais.
Sudėtis 0 + 0 = 0; 1 + 0 = 1; 0 + 1 = 1; 1 + 1 = (1)0; 1 + 1 + 1 = (1)1
Atimtis 0 - 0 = 0; 1 - 0 = 1; 0 - 1 = -1; 1 - 1 = 0
Daugyba: 0 x 0 = 0; 0 x 1 = 0; 1 x 1 = 1
59 0011 1011 85 0101 0101 15 1111
+ 42 0010 1010 - 57 0011 1001 x 9 x 1001
101 0110 0101 28 0001 1100 135 1111
1111 10000111
Vienas is dvejetainių skaičių atvaizdavimo būdų - dvejetainiai skaičiai su zenklu. Skaičiaus zenklas nurodomas vyriausioje skiltyje. Kai skaičius teigiamas, joje įrasomas 0, o kai neigiamas - 1. Pavyzdziui, dvejetainis skaičius 1001 0001 reikstų desimtainį -17. Astuntosios skilties panaudojimas skaičiaus zenklui sumazina baite telpančio skaičiaus absoliutinę vertę. Siame formate vietoje maksimalaus skaičiaus - 255 (skaičiaus be zenklo atvaizdavimo formatas), galima įrasyti skaičius nuo -128 iki +127.
Mikroprocesoriuje atimties operacija keičiama sudėtimi pries tai neigiamą skaičių atitinkamai transformuojant, t.y. vietoje operacijos "7 - 3", mikroprocesorius atlieka operaciją "7 + (skaičiaus 3 papildomas kodas)". Papildomas kodas gaunamas neigiamo dvejetainio skaičiaus visas skiltis invertuojant (t.y. vienetus pakeičiant nuliais) ir prie gauto skaičiaus jauniausios skilties pridedant 1. Pavyzdziui, skaičius "-3" būtų transformuojamas taip:
3 inversija +1
1111 1100 1111 1101.
Tokia būdu atimties operacija mikroprocesoriuje atrodytų taip:
7 0000 0111
+1111 1101
4 1 0000 0100
Operacijos metu atsiradęs perpildymo vienetas rodo, kad rezultatas teigiamas. Jeigu pernesimo nėra - tai reiskia, kad atimties rezultatas neigiamas
Kai atėminio absoliutinė reiksmė didesnė uz turinio, gauname neigiamą rezultatą (t.y. n4ra persipildimo vieneto), norint suzinoti neigiamo rezultato absoliutinę vertę, reikia gautą atimties rezultatą invertuoti ir prie jauniausios skilties pridėti 1.
Pavyzdziui: atlikime operaciją "4 - 15"; Raskime atsakymo absoliutinę vertę.
Desimtainių skaičių atimtį (4 - 15) dvejetainių skaičių atimtis (0000 0100 - 0000 1111) =
4 0000 0100
15 pap. kodas + 1111 0001
11 pap. kodas 1111 0101
Matome, kad pernesimo is vyriausios skilties nėra, tai reiskia, kad gautas atimties rezultatas neigiamas. Gauname neigiamo skaičiaus 1111 01012 absoliutinį dydį:
Skaičiaus 1111 01012 inversija 0000 10102 +1 ir gauname neigiamo dvejetainio skaičiaus 1111 01012 absoliutinį dydį 0000 10112 (dvejetainis) = 1110 (desimtainis).
Baitas |
Be zenklo |
Su zenklu |
|
2) Raskime vienu baitu uzrasytų skaičių reiksmes, kai vyriausiasis bitas skirtas skaitmeniui ir kai jis skirtas zenklui.
Rasant programas mikroprocesoriui dazniausiai vartojama sesioliktainė skaičiavimo sistema (2 lentelė). Tam kiekvienas dvejetainį skaičių sudarantis baitas padalinamas pusiau į dvi lygias dalis po 4 bitus. Į pusę baito galima įrasyti dvejetainius skaičius nuo 0000 (desimtainio 0) iki 1111 (desimtainio 15).
Dvejetainis |
Sesioliktainis |
Desimtainis |
Dvejetainis |
Sesioliktainis |
Desimtainis |
A | |||||
B | |||||
C | |||||
D | |||||
E | |||||
F |
Sesioliktainis skaičius 10 atitinka desimtainį skaičių 16. Tam, kad zinotume, kokioje skaičiavimo sistemoje parasytas skaičius, sesioliktainiai skaičiai zymimi raide H, pavyzdziui 10h (= 1610), 0Ah (= 1010).
Viename baite telpa du sesioliktainiai skaitmenys. Sesioliktainė sistema patogi tuo, kad sesioliktainis skaičius labai paprastai paverčiamas dvejetainiu ir atvirksčiai. Tam dvejetainis skaičius suskirstomas į tetradas (po 4-ias dvejetaines skiltis) ir vietoje kiekvienos tetrados uzrasomas ją atitinkantis sesioliktainis skaičius (2 lentelė). Pavyzdziui:
1011 0011 1101 1001 (dvejetainis skaičius)
B 3 D 9 = B3D9h (jį atitinkantis sesioliktainis skaičius).
Norint desimtainį skaičių paversti astuntainiu galima: pirmąjį paversti dvejetainiu ir po to astuntainiu; naudoti tą patį būdą, kaip ir keičiant dvejetainiu (laipsniu kelti 16);
Veiksmai su sesioliktainiais skaičiais atliekami taip pat, kaip su desimtainiais, tik pernesamas į vyresniąją skitį atsiranda, tuomet, kai atitinkamų skilčių suma yra lygi arba didesnė uz 16. Pavyzdziui:
Skiltis: 3 2 1 0
6 E 8 8 h
+ 1 D 3 h
7 0 5 B h
Dvejetainis - desimtainis kodas (BCD - Binary Coded Decimal) vartojamas, kai reikia didelio tikslumo (reiksmių po kablelio) arba atvaizduojant skaičiavimo rezultatus. Naudojant sį kodą, kiekvienas desimtainis skaitmuo koduojamas atskirai 4 bitais, jam isreiksti naudojama tiek bitų, kiek jų reikia. Kadangi yra 16 keturių bitų kombinacijų, kai kurios jų nenaudojamos (3 lentelė). Skaičius įrasytas viename baite atitinka dvi desimtainio skaičiaus skiltis.
3 lentelė Dvejetainiai desimtainiai skaičiai
Dvejet |
Desimt. |
Dvejet |
Desimt. |
X |
|||
X |
|||
X |
|||
X |
|||
X |
|||
X |
Čia X - uzdrausta kombinacija.
Pavyzdziui, turime du dvejetainius - desimtainius skaičius 03h ir 86h:
0 3 3 9
0000 0011 = 03h ir 1000 0110 = 86h.
Susumuokime siuos skaičius:
0000 0011 (=03h)
+1000 0110 (=86h)
1000 1001 (=89h)
Kai kvarteto reiksmė virsija 9, rezultatą reikia koreguoti. Pavyzdziui:
0000 0111 (=07h)
+0000 1000 (=08h)
0000 1111 (=0?h)
Koreguojant neapibrėztą sumą reikia persokti per sesis lentelės skaitmenis ir pridėti 1 prie aukstesniosios skilties. Duotame pavyzdyje vietoje 1111 reikėtų imti 0101 (5), nes 9+6 = (1)5 ir į aukstesniąją skiltį įrasyti 1. Tuomet atsakymas bus 0001 0101 (=15h).
Tai duomenų (dvejetainio skaičiaus) perstūmimas į kairę, perstūmimas į desinę, duomenų rotacija bei loginės operacijos IR (AND), ARBA (OR), suma moduliu du (XOR).
Perstumiant (Shift) duomenis per vieną registro galą įvedamas 0, o per kitą galą iseinantis signalas įrasomas į pozymių registro perpildymo skiltį (C). Vykdant rotaciją (rotate) į registrą siunčiamas signalas is pozymių registro perpildymo skilties (C).
Loginių operacijų iliustracija:
Perstūmimas į desinę Rotacija į kairę
C
0
AND OR
XOR
Loginės operacijų teisingumo
lentelės
A |
B |
AΛB |
A |
B |
A&B |
A |
B |
A B |
SUM |
Paveikslėlyje parodyti ALĮ įėjimo registrai A ir B, funkciniai įėjimai, pozymių registro skiltis C ir sumatorius.
1. Kaip vienetu padidinti registro A turinį?
Reikia isvalyti registrą B, į C įrasyti 1 ir sudėti
A+B+C = A+C = A+1.
2. Kaip vienetu sumazinti registro A turinį?
Tai galima padaryti pridedant prie A -1 (1111 1111). Pavyzdziui, 0000 0011 (3) + 1111 1111 (-1) = 0000 0010 (2). Tam registrą B reikia uzpildyti vienetukais, o į C įrasyti 0 ir sudėti A+B+C.
3. Kaip is registro A atimti registro B turinį?
Invertuokite B turinį (funkcija B). Įrasykite B reiksmę į SUM, po to perkelkite atgal į registrą B. Į C įrasykite 1 ir susumuokite A+B+C. Gausite -B, kurį įrasykite į B. Įrasykite turinį į A. Dabar sudėję A+B gausite registrų A ir B pirminių verčių skirtumas.
4. Kaip su registrų A ir B turiniais atlikti ARBA operaciją?
Tai atliksite prisiminę, kad A OR B = AB. Jau aprasytu būdu invertuokite A ir B, po to įvykdykite operaciją A&B ir invertuokite rezultatą.
5. Kaip registro A turinį perstumti į kairę per vieną skiltį?
Registro A turinį perstumsite į kairę susumavę A+A. Tam A turinį įrasykite į B, į C įrasykite 0 ir atlikite operaciją A+B+C. Pavyzdziui:
0000 1101
0001 1010 registro turinys persistūmė į kairę per vieną skiltį.
6. Kaip isvalyti registrą A?
Registro turinį paversite nulių rinkiniu operacija A&A. Tam registro turinį per ALĮ invertuokite, įrasykite į B ir atlikite operaciją A&B.
Mikroprocesoriaus Intel 80x86 (Pentium) vidiniai registrai:
D15 |
D14 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
OF |
DF |
IF |
TF |
SF |
ZF |
AF |
PF |
CF |
OF - persipildimo pozymis, DF - krypties vėliavėlė, IF - pertraukimų vėliavėlė, TF - derinimo vėliavėlė, SF- zenklo skiltis, ZF - nulinio operacijos rezultato pozymis, AF - pernesimo is zemesnės tetrados į aukstesnę pozymis, PF - lygiskumo po loginės operacijos ir perpildymo po aritmetinės operacijos skiltis, CF - perpildymo skiltis.
Pozymių registro vėliavėlių paskirtis.
Kai registre duomenims skirtos tik septynios (arba 15) skiltys, o astuntoji (arba 16-oji) skirta zenklui, t.y. pozymių registro zenklo skiltis SF atkartoja vyriausią rezultato skiltį. Kai skaičius yra neigiamas SF = 1, o kai - teigiamas SF = 0. Kai aritmetinės ar loginės operacijos rezultatas lygus nuliui, ZF = 1, kai ne nuliui ZF = 0. Kai operacijos rezultate vienetukų skaičius yra lyginis PF = 1, o kai - nelyginis PF = 0. Kai buvo perpildymas (pernesimas sumuojant, arba paskola is vyriausios skilties atimant), CF = 1, kai perpildymo nebuvo CF = 0. Kai pernesimas atsiranda sumuojant du skaičius is jaunesnės tetrados į vyresnę po aritmetinės operacijos AF = 1, priesingu atveju AF = 0.
Pavyzdziui (komandų atliekami veiksmai pateikti lentelėje):
1) Komanda ADD AL, 10h prie registro (AL) turinio prideda konstantą 10h ir patalpina rezultatą į registrą AL. Priklausomai nuo rezultato keičiasi pozymių registro F turinys.
2) Komanda ADD AL, Dh prie AL turinio prideda registro DH turinį ir patalpina rezultatą į AL. Priklausomai nuo rezultato keičiasi pozymių registro F turinys.
3) Komanda XOR AH, 0FFh su registro AH turiniu ir konstanta FFh įvykdo loginės sumos operaciją XOR ir patalpina rezultatą į registrą AH. Priklausomai nuo rezultato keičiasi pozymių registro F turinys.
4) Komanda SUB AL, BH is registro AL turinio atima registro BH turinį ir patalpina rezultatą į AL. Atliekant sią operaciją BH turinys invertuojamas, pridedamas 1 ir gautas rezultatas susumuojamas su AL turiniu. Vykdant atimties operaciją reikia invertuoti paskolos C reiksmę. Todėl pavyzdyje CF = inversija C = 0. Priklausomai nuo rezultato keičiasi pozymių registro F turinys.
5 lentelė. Komandų atliekami veiksmai
Komanda (80x86) |
Registras F: |
Veiksmas SZ0A 0P0C |
Komanda (80x86) |
Registras F: |
Veiksmas SZ0A 0P0C |
ADD AL, 10h |
AL: |
SUB AL, BH |
AL: | ||
|
10h |
|
BH: | ||
AL: |
(invBH+1) |
(1111 1101) |
|||
F: |
0000 |
AL: | |||
ADD AL, DH |
AL: |
F: | |||
DH: |
|
CL: | |||
|
AL: |
10000 0010 |
CMP CL, BH |
BH: |
|
F: |
0001 0101 |
(inv BH | |||
AH:
AL:
FFh
F:
AH:
F:
5) Komanda CMP CL, BH is CL turinio atima registro BH turinį. Tam BH turinys invertuojamas, pridedamas 1 ir gautas rezultatas susumuojama su CL turiniu. Vykdant atimties operaciją reikia invertuoti paskolos C reiksmę. Todėl pavyzdyje CF = inversija C = 1. Kadangi atimties rezultatas neissaugomas, si komanda naudojama palyginti du skaičius ir priklausomai nuo palyginimo rezultato keičiasi tik pozymių registro F turinys.
Aritmetinių veiksmų operacijos zymimos santrumpomis ADD, ADC, DAA, DEC, INC, SUB, SBB, DAS, CMP, NEG.
Komanda "ADD operandas1, operandas2" prie operando1 turinio prideda operando2 turinį ir rezultatą įraso į operandą1. Komandoje operandais gali būti 8 arba 16 bitų registrai (pvz.: AX, BH, CL, DI, BP, AH, DL) arba atminties ląstelės turinys. Pavyzdziui, registro BH turinį susumuoja su AL turiniu.
Pries vykdant komandą ADD BH, AL ir ją įvykdzius:
Pries Po
BH: 2Ah BH: 2Ah
AL: E4h AL: 0Eh
CF: ? CF: 1
Komanda ADC daro tą patį ką ir ADD, tik papildomai prideda perpildymo bitą (CF). Pavyzdziui, ADC AH, BL prie AH turinio prideda registro BL turinį ir pozymį CF:.
Pries Po
AH: 2Ah AH: 5Eh
BL: 33h BL: 33h
CF: 1 CF: 0
Komanda "SUB operandas1, operandas2" is opernando1 turinio atima operndo2 (registro arba atmintinės ląstelės) turinį. Rezultatą įraso į operandą1. Pavyzdziui, SUB AL, [SI] atminties ląstelės turinį, esantį adresu 3F40h įrasytu i registrą SI, atima is AL turinio:
Pries Po
AL: A5h AL: 52h
SI: 3F40h SI: 3F40h
[3F40h]: 53h [3F40h]: 53h
Komanda SBB daro tą patį ką ir SUB, tik papildomai atima perpildymo bitą CF. Pavyzdziui, SBB AL, BL is registro AL turinio atima registro BL turinį ir pozymį CF:. Pries Po
BL: 3Fh BL: 3Fh
AL: 5Eh AL: 1Fh
CF: 0 CF: 0
Komanda "INC operandas1" prie registrų ar atminties ląstelės turinio prideda 1. Pavyzdziui, INC BX prideda 1 prie registro BX turinio ir rezultatą įraso į registrą BX. INC [BP] - tą patį padaro su duomenimis esančiais atminties ląstelėje, esančioje registre BP nurodytu adresu. Pavyzdziui INC [BP]:
Pries Po
BP: 3F40h BP: 3F40h
[3F40h]: 53h [3F40h]: 54h
Komanda "DEC operandas1" is registrų ar atmintinės ląstelės turinio atima 1. Pavyzdziui, DEC DI atima 1 is registro DI turinio ir rezultatą įraso į registrą DI, DCR [DI] - tą patį padaro su duomenimis atmintyje, esančiais registro DI nurodytoje ląstelėje. Pavyzdziui:
Pries Po
DI: 3F40h DI: 3F40h
[3F40h]: 53h [3F40h]: 52h
Komanda "CMP operandas1, operandas2" palygina operando1 turinį su operandu2 nurodyto registro arba atmintinės ląstelės turiniu, juos atimdama (oprendas1 - operandas2). Komanda rezultato niekur neįraso, o operandų palyginimo rezultatus nurodo pozymių registro vėliavėlės CF, ZF, AF, SF ir PF. Jeigu operando2 turinys didesnis uz operando1 turinį, įvykuzius komandą CF = 1, jeigu nedidesnis, CF = 0, jeigu operandai lygūs ZF = 1, jeigu nelygūs ZF = 0. Pavyzdziui komanda CMP AH, BL:
Pries Po
AH: 32h AH: 32h
BL: 08h BL: 08h
S Z A P C
Pozymių registro vėliavėlės 0 0 0 0 0
Komanda "DAA" koreguoja registro AL turinį po dviejų dvejetainių - desimtainių (BCD) kodų sumos. Pavyzdziui, pries vykdant komandą DAA registras AL buvo lygus 12h ir įvykdyta komanda ADD AL, 79h (sudedami du BCD formato skaičiai 12h ir 79h), po kurios registre AL lieka suma 8Bh. Įvykuzius komandą DAA gausime:
Pries Po
AL: 8Bh AL: 91h
Komanda "AND operandas1, operandas2" vykdo loginę operaciją IR su operandais 1 ir 2. Operandais gali būti registrai bei atmintinės ląstelės turinys. Rezultatas įrasomas į operandą1. Pavyzdziui, AND AL, BL atliks operaciją AL & BL:
Pries Po
AL: 32h AL: 00
BL: 08h BL: 08h
Komanda "OR operandas1, operandas2" vykdo loginę operaciją ARBA su operandais 1 ir 2. Operandais gali būti registrai bei atmintinės ląstelės turinys. Rezultatas įrasomas į operandą1. Pavyzdziui, OR AL, [BX] atliks operaciją A or [BX].
Pries Po
BX: 0008h BX: 0008h
AL: 54h AL: 57h
[0008h]: 53h [0008h]: 53h
Komanda "XOR operandas1, operandas2' sumuoja moduliu 2 su operandais 1 ir 2. Operandais gali būti registrai bei atmintinės ląstelės turinys. Rezultatas įrasomas į operandą1. Pavyzdziui, XOR DX, SI atliks operaciją DX = DX SI
Komanda ROL operandas1, 1 vykdo operando1 turinio rotaciją į kairę per vieną elementą.
Pries vykdant komandą ROL AL, 1ir ją įvykdzius:
Pries Po
AL: 01110101 AL: 11101010
CF: 0 CF: 0
Pastaba. Komanda ROL operando1 turinį padaugina is 2.
Komanda su ROR operandas1, 1 vykdo operando turinio rotaciją į desinę per vieną elementą.
Pries vykdant komandą ROR CH,1 ir ją įvykdzius:
Pries Po
CH: 01110101 CH: 10111010
CF: ? CF: 1
Pastaba. Komanda ROR operando1 turinį padalina is 2.
Komanda RCL operandas1, 1 per perpildymo skiltį CF vykdo operando1 turinio rotaciją į kairę per vieną elementą.
Pries vykdant komandą RCL DL, 1 ir ją įvykdzius:
Pries Po
DL: 11010001 DL: 10100010
(D1h) (A2h)
CF: 0 CF: 1
Komanda RCR operandas1, 1 per perpildymo skiltį C vykdo operando1 turinio rotaciją į desinę per vieną elementą.
Pries vykdant komandą RCR AL, 1 ir ją įvykdzius:
Pries Po
AL: 11010001 AL: 01101000
(D1h) (68h)
CF: 0 CF: 1
Komanda NOT operandas1 invertuoja operando1 turinį.
Pries vykdant komandą NOT AL ir ją įvykuzius:
Pries Po
AL: 11010001 AL: 00101110
Komanda CLC gesina perpildymo pozymį CF:
C: = 0
Komanda STC pozymiui C suteikia 1 reiksmę, t.y. CF = 1.
Komanda JMP Adresas perkelia programą į salia operacijos nurodytą adresą. Pavyzdziui, vykdant komandą JMP Ciklas į registrą PC yra įrasomas naujasis adresas Ciklas ir programa toliau vykdoma nuo sio adreso.
Komanda JC (JNC) Adresas perkelia programą į salia operacijos nurodytą adresą, jeigu sąlyga C = 1 (C = 0) įvykdyta.
Komanda JZ (JNZ) Adresas perkelia programą į salia operacijos nurodytą adresą, jeigu sąlyga Z = 1 (Z = 0) įvykdyta.
Komanda JM (JP) Adresas perkelia programą į salia operacijos nurodytą adresą jeigu sąlyga S = 1 (S = 0) įvykdyta.
Komanda JPE (JNO) Adresas perkelia programą į salia operacijos nurodytą adresą jeigu sąlyga P = 1 (P = 0) įvykdyta.
Komanda CALL Adresas naudojama besąlyginiam paprogramės iskvietimui. Ji kaip ir komanda JMP perkelia programą į salia operacijos kodo nurodytą adresą, bet steke issaugoja pertrauktos programos adresą. Paprogramėje sutikusi komandą RET programa grįzta į steke esantį adresą, pries kurį ji buvo perkelta į paprogramę.
Komanda PUSH operandas1 dviejų baitų operandą1 įraso į steką steko rodiklio SP nurodytu adresu. Pavyzdziui, PUSH DX įraso registrą DX į steką. Įrasant operandą1 į steką, registro SP turinį sumazina 2.
Komanda POP operandas1 į operandą1 perraso duomenis is steko rodiklio SP nurodytos atminties ląstelės ir steko rodiklį padidina dviem.. Pavyzdziui, POP DI atminties ląstelės [SP] turinį perraso į registrą DI, o steko rodiklio turinys SP yra padidinamas 2, t.y. SP = SP + 2.
Sudauginti atmintyje saugomus du skaičius X ir Y, kurie yra zodzio ilgio ir sandaugą patalpinti į atmintį adresu SAND.
; Apsirasome duomenis atmintyje.. Isskiriame skaičiams X ir Y po 2 baitus,
; o sandaugai saugoti - 4 baitus.
.DATA
X dw 1234h
Y dw 9876h
Sand dd ?
.CODE
: Skaičių X ir Y sandauga
mov ax, X ; į registrą AX irasome X
mul Y ; registras AX padauginamas is atmintyje
; saugojamo skaičiaus Y
; Sandauga lieka registruose DX (vyr.dalis) ir AX (jaun.dalis)
lea di, Sand ; Į registrą DI įrasomas atminties ląstelės SAND adresas
mov [di], ax ; Į atmintį įrasoma jaunesnioji sandaugos dalis
mov [di+2], dx ; Į atmintį įrasoma vyresnioji sandaugos dalis
Kaip masyve rasti duotą skaičių?
Uzduotis: 2048 skaičių masyve raskime pirmąjį masyvo elementą, lygų skaičiui 42H.
; Apsirasome duomenis atmintyje.
.DATA
Masyvas db 2048 dup(?)
Indeksas dw 0
.CODE
: Skaičiaus 42h paieska masyve
mov cx, 2048 ; į registrą CX įrasome masyvo ilgį
lea si, Masyvas ; į registrą SI įrasome masyvo pradzios adresą
mov bp, 1 ; registre BP bus saugojamas tikrinamo masyvo
; elemento indeksas
Ciklas:
cmp [si], 42h ; palyginamas atmintyje esantis masyvo skaičius
; su konstanta 42h
jz Pabaiga ; jeigu sutapo, programa uzbaigiama
inc si ; didinamas masyvo adresas 1-tu
inc dl ; didinamas indeksas 1-tu
dec cx ; mazinamas ciklų skaitiklis 1-tu
jnz Ciklas ; ar perziūrėtas visas masyvas
Pabaiga:
cmp dl, 2049 ; tikrinama, ar buvo rastas nors vienas skaičius = 42h
jz Nerasta ; jeigu skaičius nerastas, pereinama į zymę Nerasta
mov Indeksas, bp ; jeigu - surastas, atmintyje issaugojame jo indeksą
Tegul per lygiagrečiąją programuojamą sąsają reikia nuskaityti duomenis is prievadzio C ir gautus duomenis issaugoti atmintyje adresu IND ir persiųsti tuos pačius duomenis į segmentinį indikatorių, sujungtą su lygiagrečios programuojamos sąsajos Intel 8255 prievadziu A. Sąsajos 8255 valdymo registro adresas yra 8Bh, jo A prievado adresas 88h, B prievado - 89h, C prievado - 8Ah. Programuojant sąsają 8255 reikia nustatyti jos A ir B prievadzius į informacijos isvedimo rezimą, o C prievadį - į informacijos įvedimo rezimą.
Algoritmas:
Sudarome ir įrasome valdymo zodį "10001001" - "89h". Jį nusiuntus į kontrolerio valdantį registrą nustatomi prievadzių A, B ir C darbo rezimai.
Per prievadą C įvedame duomenis į mikroprocesoriaus registrą AL.
Per prievadą A duomenis perduodame indikatoriui.
Programa:
MOV AL, 89h ; AL: = 89h, t.y. į registrą AL patalpinamas sąsajos valdymo zodis
OUT 8Bh, AL ; valdymo zodį įraso į sąsajos 8255 valdymo registrą
IN AL, 8Ah ; į registrą AL is prievadzio C įvedami duomenys indikavimui
MOV IND, AL ; AL turinys issaugojamas atmintyje adresu IND
OUT 88h, AL ; is registro AL duomenis perduodami į prievadį A indikacijai.
START: PUSH AX ; Steke issaugojamas registro AX turinys
PUSH BX ; Steke issaugojamas registro BX turinys
MOV BX, PTR ; Į BX įraso isėjimo adresą buferio, kuriame yra
; spausdinamas tekstas
MOV AL, [BX] ; Is atminties į AL įkrauna simbolį, kuris bus
; perduotas spausdintuvui
CMP AL, "p" ; AL turinį palygina su operandu
JZ ENDT ; Jeigu Al=p, ZF = 1, spausdinimas nutraukiamas
OUT PRINT, AL : Simbolis siunčiamas į spausdintuvo registrą
INC BX ; BX: = BX + 1, suformuojamas kito simbolio adresas
MOV PTR, BX ; BX turinį įraso į atmintį adresu PTR
ENDT: POP BX ; Is steko grązina registro BX turinį, buvusį iki pertraukimo
POP AX ; Is steko grązina registro AX turinį, buvusį iki pertraukimo
EI ; Leidzia isorinius mikroprocesoriaus pertraukimus
RETI ; Grįzta į pertrauktą programą
Mikrovaldiklio MSP430 programinį modelį sudaro 16 bitų RISC tipo aritmetinis loginis įrenginys ALĮ, 16 bitų vidiniai registrai R1-R15, specialios konfiguracijos atminties modelis ir vidinių modulių rinkinys Modulių tipai ir jų kiekis priklauso nuo konkretaus naudojamo mikrovaldiklio.
Komandų skaitiklis (PC/R0)
Steko rodiklis (SP/R1)
Pozymio registras (SR/CG1/R2)
Konstantų generatorius (CG2/R3)
Bendro naudojimo reg. (R4)
Bendro naudojimo reg. (R15)
Vidiniai ALĮ registrai
Texas Instruments inzinieriai sukūrė modernų 16 bitų RISC architektūros procesorių, kuris pasizymi energijos taupymu ir didele greitaveika. Buvo atsisakyta akumuliatoriaus, įdiegta 16 registrų, kuriuose esančius duomenis galima perkelti į kitą registrą, arba į/is atminties lastelę(ės). Savo ruoztu, duomenis is vienos atminties ląstelės galima perkelti į kitą atminties ląstelę panaudojant tik vieną instrukciją - tokiu būdu buvo sutrumpintas instrukcijos laikas. Centrinis procesorius turi 7 adresavimo rezimus ir 27 pagrindines ir 24 emuliuojančias instrukcijas.
CPU komandų sistema suprojektuota atsizvelgiant į siuolaikines programavimo tendencijas, pasizyminčias specialiomis valdymo perdavimo komandomis, lentelių apdorojimo instrukcijomis ir kt.
Keturi pirmieji vidiniai registrai skirti specialioms funkcijoms atlikti:
Komandų skaitiklis (PC) nurodo mikrovaldikliui, kokią instrukciją vykdyti ir kuri instrukcija bus vykdoma sekanti. Kiekviena instrukcija naudoja jai reikalingą informacijos kiekį: du, keturis, sesis ar daugiau baitų. PC registre visada lyginis skaičius, t.y. jauniausioji PC skiltis visada lygi
Steko rodiklis (SP) naudojamas centrinio procesoriaus valdymui. Tai gali būti nuoroda centriniam procesoriui, kurioje vietoje grįzti is paprogramės arba pertraukimo. Steko rodiklis gali būti programiniu būdu keičiamas (komandomis PUSH ir POP), negalima uzmirsti, kad steko rodiklį naudoja ir centrinis procesorius.
Pozymių registrą sudaro 16 bitų. Tik jaunesnysis baitas registro yra naudojamas.
Pozymių registras
V - persipildymo bitas. Nustatomas į "1", jeigu aritmetinės operacijos įvyksta aritmetinis persipildymas.
SCG1, SCG0 - siais bitais kontroliuojami (leidziami arba uzdraudziami) mikrovaldiklio vidinių generatorių taktiniai impulsai, naudojami visoje sistemoje.
OscOff - periferinius modulius sinchronizuojančio generatoriaus isjungimo bitas. Jeigu nustatytas į "1", kvarcinis generatorius pereina į isjungimo rezimą. Į sį rezimą gali pereiti tik tada, kai sistemoje nenaudojami dazniai ACLK arba MCLK.
CPU Off - centrinio procesoriaus sinchronizacijos isjungimo bitas. Jeigu nustatytas į "1", centrinio procesoriaus daznis MCLK yra isjungtas.
GIE (General Interrupt Enable) bitas. Jeigu bitas nustatytas į "1", galimi pertraukimai sistemoje. GIE bitas, įvykus pertraukimui, yra isvalomas, t.y. GIE = "0", instrukcija RETI GIE bitą atstato.
N - neigiamas bitas . Nustatomas į "1", jeigu rezultatas įvykdytos operacijos yra neigiamas.
Z - nulinis bitas . Nustatomas į "1", jeigu įvykdytos operacijos rezultatas yra lygus nuliui, priesingu atveju bitas Z isvalomas.
C - pernesimo bitas į vyresniąją skiltį sumuojant, arba paskolos bitas is vyresnės skilties, atliekant atimties operaciją.
Konstantų generatoriai CG1 ir CG2. Dazniausiai naudojamos konstantos gali būti generuojamos konstantų registrais R2 ir R3. Generuojamos konstantos suteikia galimybę sutrumpinti instrukcijos ciklo vykdymo laiką.
Bendro naudojimo registrai nuo R4 iki R15. Registrus nuo R4 iki R15 vartotojas gali naudoti savo nuoziūra. Į juos talpinti duomenis arba su jais atlikti įvairius veiksmus, naudotiregistrus atminties lastelės adresavimui. Registrai yra valdomi programiniu būdu.
Lentelėje pateikiamas pilnas MSP430 serijos mikrovaldiklių sąrasas. Panagrinėsime komandas atskirai, pagal atliekamos operacijos tipą.
Adresavimo rezimai
Adresavimo rezimas |
Sintaksė |
Aprasymas ir pavyzdziai |
Registro rezimas |
Rn |
Registras yra operandas, pvz.: MOV R6, R9 |
Indekso rezimas |
X(Rn) |
Operando adresas siuo atveju Rn + X. X reiksmė yra saugojama komandoje, pvz.: CLR 6(R9) |
Tiesioginis rezimas |
ADDR |
Operando adresas gaunamas PC + ADDR. ADDR reiksmė yra saugojama komandoje, pvz.: ADD #23h, MASS |
Absoliutinis rezimas |
&ADDR |
Absoliutinis adresas nurodomas komandoje, pvz.: MOV &0123h, R12. |
Netiesioginis registro rezimas |
@Rn |
Pvz.: MOV @R6, R8. Skaičius esantis registre Rn bus suprastas, kaip atminties ląstelės adresas ir toje ląstelėje esantys duomenys bus patalpinti į registrą R8.. |
Netiesioginis automatinio didėjimo rezimas |
@Rn+ |
Pvz.: MOV @R6+, R8. Skaičius esantis registre R6 bus suprastas, kaip atminties ląstelės adresas ir toje ląstelėje esantys duomenys bus patalpinti į registrą R8, o registras R6 bus padidintas dvejetu. |
Betarpinis rezimas |
#N |
Pvz.: MOV #2, R8. Į registrą R8 įrasomas skaičius, siuo atveju 2h. |
MSP430 serijos mikrovaldiklių komandų sąrasas
INSTRUKCIJA |
PAAISKINIMAI |
POZYMIS |
||||
V |
N |
Z |
C |
|||
ADC(B) dst |
dst + C → dst |
x |
x |
x |
x |
|
ADD(B) src, dst |
src + dst → dst |
x |
x |
x |
x |
|
ADDC(B) src, dst |
src dst + C → dst |
x |
x |
x |
x |
|
AND(B) src, dst |
src AND dst → dst |
x |
x |
x |
||
BIC(B) src, dst |
(NOT src) AND dst → dst | |||||
BIS(B) src, dst |
src OR dst → dst | |||||
BIT(B) src, dst |
src AND dst |
x |
x |
x |
||
BR(B) dst |
Programos atsaka į dst | |||||
CALL dst |
PC + 2 →TOS, dst → PC | |||||
CLR(B) dst |
dst | |||||
CLRC |
C | |||||
CLRN |
N | |||||
CLRZ |
Z | |||||
CMP(B) src, dst |
dst - src |
x |
x |
x |
x |
|
DADC(B) dst |
dst + C → dst (decimally |
x |
x |
x |
x |
|
DADD(B) src, dst |
src + dst + C → dst (decimally |
x |
x |
x |
x |
|
DEC(B) dst |
dst - 1 → dst |
x |
x |
x |
x |
|
DECD(B) dst |
dst - 2 → dst |
x |
x |
x |
x |
|
DINT |
Gesinami pertraukimai | |||||
EINT |
Leidziami pertraukimai | |||||
INC(B) dst |
dst → dst |
x |
x |
x |
x |
|
INCD (B) dst |
dst → dst |
x |
x |
x |
x |
|
INV (B) dst |
Invertuojamas dst |
x |
x |
x |
x |
|
JC/JHS label |
Persokti į zymeklį (label), jei C = 1 | |||||
JEQ/JZ label |
Persokti į zymeklį (label), jei Z = 1 | |||||
JG label |
Persokti į zymeklį , jei (N xor V) = 0 | |||||
JL label |
Persokti į zymeklį , jei (N xor V) = 1 | |||||
JMP label |
Besąlygiskai persokti į zymeklį (label) | |||||
JN label |
Persokti į zymeklį (label), jei N = 1 | |||||
JNC/JLO label |
Persokti į zymeklį (label), jei C = 0 | |||||
JNE/JNZ label |
Persokti į zymeklį (label), jei Z = 0 | |||||
MOV(B) src, dst |
src → dst | |||||
NOP |
Jokia operacija nevykdoma | |||||
POP(B) dst |
SP dst, SP SP | |||||
PUSH(B) src |
SP SP, src SP | |||||
RETI |
TOS → SR, SP + 2 → SP TOS → PC, SP + 2 → SP |
x |
x |
x |
x |
|
RET dst |
Sugrįzimas is paprogramės TOS PC, SP SP | |||||
RLA(B) dst |
MSB ← MSB-1 . LSB ← |
x |
x |
x |
x |
|
RLC(B) dst |
C ← MSB . LSB ← C |
x |
x |
x |
||
RRA(B) dst |
MSB → MSB, MSB → MSB-1. LSB → C |
x |
x |
x |
x |
|
RRC(B) dst |
C → MSB . LSB → C |
x |
x |
x |
x |
|
SBC(B) dst |
dst - C → dst |
x |
x |
x |
x |
|
SETC |
→ C | |||||
SETN |
→ N | |||||
SETZ |
→ Z | |||||
SUB(B) src, dst |
dst - src → dst |
x |
x |
x |
x |
|
SUBC(B) src, dst |
dst - src - 1 + C → dst |
x |
x |
x |
x |
|
SWPB dst |
Sukeisti baitus vietomis | |||||
SXT dst |
Bit1 ... Bit7 Bit8 ... Bit15 |
x |
x |
x |
||
TST(B) dst |
Patikrinimas |
x |
x |
x |
x |
|
XOR(B) dst |
src XOR dst → dst |
x |
x |
x |
x |
|