Mikroprocesoriaus komandos

Tūrinys

1. Įvadas. Užduoties analizė. 3

2. Komandų paskirtis ir operandų adresavimas. Komandų formatai. 4

2.1. Pagrindiniai adresavimo būdai: 4

2.2. Komanda mul. Paskirtis ir adresavimo būdai. 7

2.3. Komanda imul. 9

3. Komandų šešioliktainiai kodai. 11

4. Eksperimentinė dalis. 11

5. Išvados 13

Literatūra: 14

1. Įvadas. Užduoties analizė.

Kažkada asembleris buvo kalba, be kurios buvo neįmanoma priversti kompiuterį kažką padaryti. Laikui bėgant situacija keitėsi. Atsirasdavo naujos programavimo kalbos, kurios buvo patogesnės bendraujant su kompiuteriu – tokios kaip C, Basic, Delphi. Tačiau asembleris, skirtingai nuo kitų programavimo kalbų, nemirė, tuo labiau jis iš principo negalėjo mirti. Kodėl? Todėl, kad asembleris – tai mašininio kodo simbolinė išvaizda. Visi pprocesai kompiuteryje vykdomi tik mašininio kodo komandomis (instrukcijomis). Todėl visi aukšto lygio kalbų kompiliatoriai turi išėjimo į asemblerio lygio programavimo galimybę arba turi ryšio priemones tarp savu ir asemblerio modulių. Kompiuteriui asemblerio kalba yra suprantamiausia, todėl efektyviausia programa gali būti parašyta tik asembleriu. Tačiau tai sunkus ir labai didelis, reikalaujantis daug atidumo darbas. Todėl realiai asembleriu rašomos tik programos, kurios turi veikti labai greitai ir neužimti daug atminties. Kartais asembleriu rašoma tik programos dalis, o paskui ji suderinama su likusia kkodo dalimi parašyta aukšto lygio programavimo kalba.

Mes aptarsime dvi asemblerio programavimo kalbos komandas – mul ir imul, jų paskirtį, operandų adresavimo būdus ir pateiksime jų taikymo pavyzdžius.

2. Komandų paskirtis ir operandų adresavimas. Komandų formatai.

2.1. Pagrindiniai adresavimo būdai:

Tiesioginis adresavimas:

Tai paprasčiausias adresavimo būdas. Šiuo aatveju efektyvusis adresas yra pačioje komandoje. Duomenų apdorojimo komandose tiesioginis adresas nurodomas po adresavimų einančiu poslinkiu

7 1 7 0 7 0 7 0

COP d W 00 Reg 110 Disp L Disp H

1 pav. Komandos su tiesioginiu adresavimu formatas

Bitas „d“ rodo duomenų perdavimo kryptį. Jeigu d=1, operandas perduodamas į registrą, nustatomą lauke Reg, t. y. kai d=1– registras yra imtuvas, kai d=0 – registras yra siųstuvas.

Tiesioginis adresas besąlyginės tarpsegmentinės pereigos ir kreipimosi į paprogramius komandose formuojamas iš 16 bitų poslinkio Disp ir 16 bitų segmento adreso Seg (4 pav.).

7 0 7 0 7 0 7 0 7 0

COP Disp L Disp H Seg L Seg H

2 pav. Besąlyginės pereigos ir kreipimosi į paprogramius

komandų formatas, kai adresavimas tiesioginis

Komandos vykdymo metu poslinkis perduodamas į komandų skaitiklį IP, o segmento adresas – į registrą CS. Šiuo atveju komandos ilgis yra 5 bbaitai. Jeigu pereiga vykdoma segmento viduje, baitai Seg L ir Seg H netaikomi, o esant artimai pereigai tampa nereikalingas ir baitas Disp H. Tokiu atveju efektyvusis pereigos adresas apskaičiuojamas pagal formulę: ,

čia FA – fizinis adresas, prie kurio reikia pereiti; (IP) – komandų skaitiklyje nurodytas einamosios komandos paskutiniojo baito adresas.

Registrinis adresavimas:

Komandose su registriniu adresavimu operandas yra viename iš bendrosios paskirties registrų. Kadangi registrams adresuoti pakanka 2–3 komandos kodo skilčių, tai tokių komandų kodai yra neilgi (1–2 baitai). Be to, jjiems vykdyti reikalingas minimalus kompiuterio laikas, nes operandai yra procesoriaus viduje.

Galimi tokie komandų formatai:

1) registro adresas nurodomas operacijos kodo baite;

7 3 2 0

COP Reg

2) registro (registrų) adresas nurodomas adresavimo baite;

7 1 0 7 6 5 3 2 0

COP d W Mod Reg R/M

Kai Mod=11, abu operandai yra registruose, kuriuos nurodo laukai Reg ir R/M. Bitų d ir W paskirtis tokia pati kaip ir tiesioginio adresavimo atveju, t. y. kai d=1, registras, nurodytas lauke Reg, yra informacijos imtuvas, kai W=1, operacijos vykdomos su 16 bitų operandais.

Šalutinis registrinis adresavimas:

Komandose su šalutiniu registriniu adresavimu 16 bitų vykdymo (efektyvusis) adresas EA yra viename iš registrų, kurį nustato adresavimo baito laukas R/M. Šiam tikslui gali būti panaudotas vienas iš registrų BX, SI arba DI

7 1 0 7 6 5 3 2 0

COP d W 00 Reg R/M

15 0

BX/SI/DI EA

Toks adresavimo būdas naudojamas besąlyginių perėjimų ir kreipimosi į paprogrames komandose.

Bazinis ir indeksinis adresavimas:

Esant baziniam adresavimui vykdymo adresas EA gaunamas sudedant registrų BX arba BP turinius su 8 arba 16 skilčių poslinkiu.

7 1 0 7 6 5 3 2 0 7 0 7 0

COP d W Mod Reg R/M Disp L Disp H

7 0

BX / BP / SI / DI

Jeigu poslinkis yra 8 skilčių, tai jis pateikiamas papildomuoju kodu iš skaičių intervalo nuo –128 iki +127.

Kai adresavimas bazinis, galima dirbti su duomenimis, esančiais įvairiose atminties vietose.

Indeksinis adresavimas skiriasi nuo bazinio tik tuo, kad vietoje bazinio registro BX ir bazės rodiklio BBP panaudojami indeksų registrai SI ir DI. Toks adresavimo būdas patogus apdorojant duomenų masyvus, kai poslinkis rodo bazinį masyvo adresą, o indeksų registro turinys – masyvo elemento indeksą.

Bazinis-indeksinis adresavimas:

7 1 0 7 6 5 3 2 0 7 0 7 0

COP d W Mod Reg R/M Disp L Disp H

15 0

BX / BP

15 0

SI / DI

Šiuo atveju vykdymo adresas EA formuojamas sumuojant bazinio ir indeksų registrų turinius su postūmiu:

8 skilčių postūmis pateikiamas papildomuoju kodu iš skaičių diapazono –128 . +127.

Šio tipo adresavimas naudojamas dirbant su sudėtingos struktūros duomenimis, nes leidžia vienu metu keisti dvi adreso komponentes.

Santykinis adresavimas:

Esant šiam adresavimui vykdymo adresas EA apskaičiuojamas

sumuojant komandų skaitiklio IP einamąjį turinį (pirmojo kitos komandos baito adresas) su postūmiu, nurodytu komandoje.

7 0 7 0 7 0

COP Disp L Disp H

15 0

IP

8 arba 16 skilčių postūmis imamas iš skaičių su ženklu diapazonuose –128 .+127 arba –32768 .+32767:

Santykinis adresavimas taikomas tik pereigų, kreipinių į paprogramius ir ciklų valdymo komandose.

2.2. Komanda mul. Paskirtis ir adresavimo būdai.

Komanda mul skirta dviems sveikiems operandams sudauginti neatsižvelgiant į ženklą.

Komandos sintaksė:

Komandos formatas:

Komanda atlieka daugybos operacija neatsižvelgiant į ženklą. Algoritmas priklauso nuo komandos operando formato ir reikalauja tiksliai nustatyti tik vieną operandą, kuris gali būti atmintyje arba registre. Antro operando radimosi vieta iškarto nusakyta, o jo dydis priklauso nuo pirmo operando:

• Jeigu operandas, esantis komandoje – baitas, tai antras daugiklis turi būti laikomas rregistre al;

• Jeigu operandas, esantis komandoje – žodis, tai antras daugiklis turi būti laikomas registre ax;

• Jeigu operandas, esantis komandoje – dvigubas žodis, tai antras daugiklis turi būti laikomas registre eax.

Daugybos rezultatas įrašomas į kaupiklį:

• Jeigu dauginami du baitai rezultatas įrašomas į registrą ax;

• Jeigu dauginami du žodžiai, rezultatas įrašomas į registrų porą dx:ax;

• Jeigu dauginami du dvigubi žodžiai, registras įrašomas į registrų porą edx:eax.

Jeigu atlikus daugybos operaciją aukštesnioji rezultato dalis lygi nuliui tuomet požymių registro skiltys atrodo taip:

11 07 06 04 02 00

OF SF ZF AF PF CF

0 ? ? ? ? 0

O jeigu aukštesnioji rezultato dalis nelygi nuliui, tuomet:

11 07 06 04 02 00

OF SF ZF AF PF CF

1 ? ? ? ? 1

Adresavimo būdai:

Mnemoninis kodas Adresavimo būdas

mul dword ptr [m32] Tiesioginis

mul ebx Registrinis

mul [si] Šalutinis registrinis

mul [ebx+esi]+disp32 Bazinis-indeksinis

mul [bp]+disp16 Bazinis

mul [esi]+disp32 Indeksinis

2.3. Komanda imul.

Komanda imul skirta dviem sveikiems operandam su ženklu sudauginti.

Komandos sintaksė:

Komandos formatai:

Komandos algoritmas priklauso nuo komandos formos. Komanda gali būti su vienu, dviem arba trim operandais. Kai komandos forma yra su vienu operandu būtina nusakyti tik vieno daugiklio buvimo vietą, kuris gali būti registre arba atminties ląstelėje. Antrojo daugiklio buvimo vieta yra fiksuota ir nuo pirmojo daugiklio dydžio:

• Jeigu pirmasis daugiklis – baitas, tai pirmasis daugiklis laikomas registre al;

• Jeigu pirmasis daugiklis – žodis, tai pirmasis daugiklis laikomas registre ax;

• Jeigu pirmasis daugiklis – dvigubas žodis, tai pirmasis daugiklis laikomas registre eax;

Daugybos rezultatas, esant komandos formai su vienu operandu, taip pat įrašomas į

iš anksto numatytą vietą, kuri priklauso nuo daugiklių dydžių:

• Jeigu dauginami du baitai rezultatas įrašomas į registrą ax;

• Jeigu dauginami du žodžiai rezultatas įrašomas į registrų porą dx:ax;

• Jeigu dauginami du dvigubi žodžiai rezultatas įrašomas į registrų porą dx:ax;

Komandos su dviem ir trimis operandais vienareikšmiškai nusako daugiklių ir rezultato buvimo vietas ir dydžius sekančiu būdu:

• Komandoje su dviem operandais pirmas operandas nusako pirmo daugiklio buvimo vietą, ir į jo vietą vėliau bus įrašytas rezultatas. Antras operandas nusako antro daugiklio buvimo vietą;

• Komandoje su trimis operandais ppirmas operandas nusako vietą, kur bus įrašytas rezultatas, antras operandas nusako antro daugiklio buvimo vietą, trečias operandas gali būti konkretus užduotas skaičius, kurio dydis yra baitas, žodis arba dvigubas žodis.

Atlikus daugybos operaciją požymių registro skiltys atrodo taip:

11 07 06 04 02 00

OF SF ZF AF PF CF

r ? ? ? ? r

Skiltys OF ir CF lygus nuliui tik tuomet, jeigu rezultato dydis atitinka registro, į kurį jis bus įrašytas, dydžiui. Jeigu žymės OF ir CF nelygus nuliui tai reiškia, kad rezultato dydis yra didesnis už jam numatyto registro dydį. Taikant komandą imul su vienu operandu rregistrai ax/dx/edx yra ženklo plėtiniai registrų al/ax/eax. Taikant komandą su dviem ir trim operandais rezultatui patalpinti pakanka numatyto registro r16/32.

Adresavimo būdai:

Mnemoninis kodas Adresavimo būdas

vienas operandas du operandai trys operandai

imul word ptr [m16] imul ebx, dword ptr [m32] imul ax, dword ptr [32], 2 Tiesioginis

imul ebx imul ebx, eedx imul eax, ebx, 5 Registrinis

imul [di] imul ecx, [edi] imul ecx, [esi], 2 Šalutinis registrinis

imul [ebx+esi]+disp32 imul ebx,[ebp+edi]+disp32 imul ax, [bx+si]+disp16, 7 Bazinis-indeksinis

imul [ebp]+disp32 imul bx,[bp]+disp16 imul cx, [esp]+disp32, 4 Bazinis

mul [esi]+disp32 imul cx,[edi]+disp32 imul edx, [esi]+disp32, 3 Indeksinis

3. Komandų šešioliktainiai kodai.

Komandos forma Šešioliktainis kodas

mul r8/m8 F6

mul r16/m16 F7

mul r32 66| F7

mul m32 66| 67| F7

imul r8 F6

imul m8 67| F6

imul r16/m16 F7

imul r32 66| F7

imul m32 66| 67| F7

imul r32/m32, r32 66| 0F AF

imul r16/m16, r16/m16 0F AF

imul r32/m32, m32 66| 67| 0F AF

imul r32, r32, d16 66| 6B

imul r32, m32, d16 66| 67| 6B

imul r16, r16, d16 6B

imul r32, r32, d32 66| 69

imul r32, m32, d32 66| 67| 69

imul r16, r16, d32 69

4. Eksperimentinė dalis.

Komandų mul ir imul taikymas mikroprocesoriuje intel 8086:

Adr. Šešioliktainis kodas Mnemoninis kodas Pradiniai duomenys Rezultatas

0122 F7h MUL [SI]+disp8, AX SI = 0224

0228 = 03

AX = 0002 AX = 0006

0123 64h

0124 04h

0125 00h

0100 F7h IMUL disp16,AX AX = 05

0235 = 03 AX = 000F,

0101 2Eh

0102 35h

0103 02h

Paprasčiausia programėlė parodanti komandos mul taikymą:

masm

model small

.386 ;reiškia, kad naudosime praplėstus registrus.

stack 256

.data ;duomenų segmentas

rez_l db 45 <

rez_h db 0

.code ;kodo segmentas

main:

mov al,25

mul rez_l ;rez_l ∙ al  al

jnc m1 ;jeigu rezultatas telpa į žemesnę skiltį pereiname į m1

mov rez_h,ah ;rezultato aukštesnįjį baitą perkeliame į rez_h

m1:

mov rez_l,al ;rezultato žemesnįjį baitą perkeliame į rez_l

exit:

mov ax,4c00h ;išėjimas iš programos

int 21h

end main ;programos pabaiga

Ši programa daugina kintamąjį rez_l iš skaičiaus, esančio registre al. Sudauginus šiuos du skaičius rezultatas bus įrašomas į registrą al, tačiau jeigu jis netelpa į šitą registrą mes jo aukštesnįjį baitą perkeliame i rel_h. Žemesnįjį baitą vėl perkeliame į rez_l.

Komandos imul taikymas yra toks pats kaip ir komandos mul, ji tik įskaito ženklą ir tturi daugiau galimybių adresuojant operandus.

5. Išvados

Funkcijos mul ir imul atsirado tik su šešiolikos skilčių mikroprocesoriais ir labai palengvino programuotojų darbą, nes anksčiau tam kad sudauginti du skaičius reikėjo praktiškai parašyti mažą programėlę, o tai užima brangią vietą.

Matome, kad funkcijos mul ir imul yra labai panašios. Su funkciją imul galime atlikti tokį patį veiksmą kaip ir su mul, tačiau operanduose pusė vietos skiriama ženklui. O tai reiškia, kad su mul funkcija galime dvigubai didesnius skaičius negu su imul.

Literatūra:

• В. И. Юров „Assembler: Учебный курс“, Питер, 2003

• Питер Абель „АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC“, Технологический институт Британская Колумбия, 1999

• A. Gražulevičius „Mikroprocesoriai. Laboratorinių darbų užduotys ir metodikos nurodymai“. Vilnius: Technika, 2000

• www.intel.ru