Tūrinys
1. Įvadas. Užduoties analizė. 32. Komandų paskirtis ir operandų adresavimas. Komandų formatai. 42.1. Pagrindiniai adresavimo būdai: 42.2. Komanda mul. Paskirtis ir adresavimo būdai. 72.3. Komanda imul. 93. Komandų šešioliktainiai kodai. 114. Eksperimentinė dalis. 115. Išvados 13Literatū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 procesai 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 kodo 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 atveju efektyvusis adresas yra pačioje komandoje. Duomenų apdorojimo komandose tiesioginis adresas nurodomas po adresavimų einančiu poslinkiu7 1 7 0 7 0 7 0COP 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 0COP Disp L Disp H Seg L Seg H
2 pav. Besąlyginės pereigos ir kreipimosi į paprogramiuskomandų formatas, kai adresavimas tiesioginis
Komandos vykdymo metu poslinkis perduodamas į komandų skaitiklį IP, o segmento adresas – į registrą CS. Šiuo atveju komandos ilgis yra 5 baitai. 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, jiems vykdyti reikalingas minimalus kompiuterio laikas, nes operandai yra procesoriaus viduje. Galimi tokie komandų formatai:1) registro adresas nurodomas operacijos kodo baite;7 3 2 0COP Reg
2) registro (registrų) adresas nurodomas adresavimo baite;7 1 0 7 6 5 3 2 0COP 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 DI7 1 0 7 6 5 3 2 0COP 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 0COP d W Mod Reg R/M Disp L Disp H7 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 BP 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 0COP d W Mod Reg R/M Disp L Disp H
15 0BX / BP 15 0SI / 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čiuojamassumuojant komandų skaitiklio IP einamąjį turinį (pirmojo kitos komandos baito adresas) su postūmiu, nurodytu komandoje.7 0 7 0 7 0COP Disp L Disp H
15 0IP 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 registre 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 00OF SF ZF AF PF CF0 ? ? ? ? 0
O jeigu aukštesnioji rezultato dalis nelygi nuliui, tuomet:11 07 06 04 02 00OF SF ZF AF PF CF1 ? ? ? ? 1
Adresavimo būdai:
Mnemoninis kodas Adresavimo būdasmul dword ptr [m32] Tiesioginismul ebx Registrinismul [si] Šalutinis registrinismul [ebx+esi]+disp32 Bazinis-indeksinismul [bp]+disp16 Bazinismul [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 pirmas 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 00OF SF ZF AF PF CFr ? ? ? ? rSkiltys 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 registrai 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ūdasvienas operandas du operandai trys operandai imul word ptr [m16] imul ebx, dword ptr [m32] imul ax, dword ptr [32], 2 Tiesioginisimul ebx imul ebx, edx imul eax, ebx, 5 Registrinisimul [di] imul ecx, [edi] imul ecx, [esi], 2 Šalutinis registrinisimul [ebx+esi]+disp32 imul ebx,[ebp+edi]+disp32 imul ax, [bx+si]+disp16, 7 Bazinis-indeksinisimul [ebp]+disp32 imul bx,[bp]+disp16 imul cx, [esp]+disp32, 4 Bazinismul [esi]+disp32 imul cx,[edi]+disp32 imul edx, [esi]+disp32, 3 Indeksinis
3. Komandų šešioliktainiai kodai.
Komandos forma Šešioliktainis kodasmul r8/m8 F6mul r16/m16 F7mul r32 66| F7mul m32 66| 67| F7imul r8 F6imul m8 67| F6imul r16/m16 F7imul r32 66| F7imul m32 66| 67| F7imul r32/m32, r32 66| 0F AFimul r16/m16, r16/m16 0F AFimul r32/m32, m32 66| 67| 0F AFimul r32, r32, d16 66| 6Bimul r32, m32, d16 66| 67| 6Bimul r16, r16, d16 6Bimul r32, r32, d32 66| 69imul r32, m32, d32 66| 67| 69imul r16, r16, d32 694. Eksperimentinė dalis.
Komandų mul ir imul taikymas mikroprocesoriuje intel 8086:
Adr. Šešioliktainis kodas Mnemoninis kodas Pradiniai duomenys Rezultatas0122 F7h MUL [SI]+disp8, AX SI = 02240228 = 03AX = 0002 AX = 00060123 64h 0124 04h 0125 00h 0100 F7h IMUL disp16,AX AX = 050235 = 03 AX = 000F,0101 2Eh 0102 35h 0103 02h
Paprasčiausia programėlė parodanti komandos mul taikymą:
masmmodel small.386 ;reiškia, kad naudosime praplėstus registrus.stack 256.data ;duomenų segmentasrez_l db 45 rez_h db 0.code ;kodo segmentasmain: 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_hm1: mov rez_l,al ;rezultato žemesnįjį baitą perkeliame į rez_l exit: mov ax,4c00h ;išėjimas iš programos int 21hend 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 turi daugiau galimybių adresuojant operandus.
5. IšvadosFunkcijos 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