Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




"Elektroniniai mikroprocesoriiniai įtaisai ir valdikliai"

Ceha slovaca


"Elektroniniai mikroprocesoriiniai įtaisai ir valdikliai"

Pratybos

SKAIČIAVIMO SISTEMOS IR VEIKSMAI SU SKAIČIAIS

Mikroprocesoriniuose įtaisuose naudojamos skaičiavimo sistemos

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.

Dvejetainiai skaičiai ir veiksmai su jais

1 lentelė Rysys tarp desimtainės ir dvejetainės skaičiavimo sistemų

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ų reiks­mes, kai vyriausiasis bitas skirtas skaitmeniui ir kai jis skirtas zenklui.

Sesioliktainiai skaičiai ir veiksmai su jais

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

2 lentelė Dvejetainių, desimtainių ir sesioliktainių skaičių atitikimas

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

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

Loginės operacijos

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

Kaip ALĮ vykdo kai kurias operacijas?

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.

Intel mikroprocesorių seimos x86 (Pentium) programavimas Assembler programavimo kalba

Mikroprocesoriaus Intel 80x86 (Pentium) vidiniai registrai:

Pozymių registro F turinys

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 turi­nys 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

  XOR AH, 0FFh

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ų komandos

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

Loginių operacijų, perstūmimų ir rotacijų komandos

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.

Valdymo perdavimo, kreipimosi į paprogrames, testų ir operacijų su steku komandos

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.

Programių pavyzdziai

Kaip sudauginti du skaičius?

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ą

Programė lygiagrečiajai sąsajai valdyti

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.

Programėlė pertraukimui apdoroti, kai į spausdintuvą įvedamas simbolis "p

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ą

Texas Instruments mikrovaldiklių seimos MSP Assembler programavimo kalba

Mikrovaldiklio MSP430 programinis modelis

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


Document Info


Accesari: 2013
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )