Ma’ruza Assemblerning ikkita o’tishli translyatori Reja
Assembler tilining translyatorlari («assemblerlar») Assember tili bu quyi daraja dasturlash tilidir. Ushbu tilning strukturasi va zanjirlari orasidagi o’zaroxarakatlari maqsadli hisoblash tizimining, natijaviy dastur bajariladigan, mashina komandalariga yaqinroqdir. Assembler tilining qo’llanilishi ishlab chiqaruvchiga maqsadli hisoblash tizimining zahiralarini mashina komandalari darajasida boshqarish imkonini yaratadi (jarayonchini, tezkor xotirani, tashqi qurilmalami va x.k) Assembler tilidagi boshlang’ich dastur matnining har bir komandasi kompilyasiya jarayoni natijasida bitta mashina komandasigaiylantiriladi.
Assembler tilining translyatori har doim kompilyator bo’lib ham hisoblanadi, chunki natijaviy dastur tili bo’lib mashina kodlari hisoblanadi. Assembler tilining translyatorini ko’pincha oddiygina qilib, «assembler» yoki «assembler dasturi» deb ataladi.
Assembler tili kompilyatorlarining amalga oshirishilishi. Assembler tili, mashina komandalaring mnemonik kodlaridan 'tashkil topadi. Ko’pincha ingliz tili komandalari mnemonikasidan foydalaniladi, lekin assembler tilining boshqa variantlari ham mavjud (shu jumladan rustili variantlarfham mavjud). Xuddi shuning uchun assembler tili awalda «mnemokodlar tili» deb atalgan (hozirda ushbu atama amaliyotda umuman qo’llanilmayapti).
Assembler tilining har birida mavjud bo’lishi mumkin bo’lgan komandalarini ikki guruhga bo’lish mumkin: birinchi guruhga tilning oddiy komandalari kiradilar, va ular translyasiya jarayonida mashina komandalariga aylanadilar; ikkinchi guruhga tilning maxsus komandalari kiradilar, ular mashina komandalariga aylantirilmaydilar, lekin ulardan kompilyator tomonidan kompilyasiya masalasini bajarish uchun foydalaniladilar (masalan, xotirani tarqatish masalasi).
Tilni sintaksisi juda sodda. Boshlang’ich dastur matnlari dastuming bitta qatorida bitta komanda yozilishini ko’zda tutadi. Assembler tilining har bir komandasi uchta, biri biridan keyin ketma-ket keluvchi: belgi bo’yicha, amal kodi va Operand maydoni kabi, tashkil etuvchilarga bo’linishi mumkin.
Assember tilining kompilyatori ko’pincha kiruvchi dastur matnida, komandalardan berilgan ajratkichlar bilan ajratiluvchi, izohlar bo’lishi imkoniyatini ko’zda tutadi.
Belgi maydoni belgini ifodalovchi identifikatordan tashkil topadi, yoki bo’sh bo’lishi mumkin. Belgining har bir identifikatori assembler tilining dasturida faqat bir marta uchrashi mumkin. Belgi dasturda birinchi uchragan joyida ifodalangan hisoblanadi, ya'ni belgilami awaldan ifodalanishi talab qilinadi. Belgidan o’zi olgan. komandaga boshqaruvni uzatish uchun foydalanilishi mumkin. Kam hollarda belgi komandalaming boshqa bo’laklaridan maxsus ajratkich bilan ajratiladi (ko’pincha bu -ikki nuqta «:»).
Amal kodi har doim' jarayonchining qat'iy aniqlangan mumkin bo’lgan komandalaridan birini ifodalaydi. Amal kodi kiruvchi til alfaviti belgilari orqali yoziladi. Ulaming uzunligi ko’pincha 3-4 ga teng, kam hollarda — 5 yoki 6 belgidan iboratdir.
Operandlar maydoni yoki bo’sh, yoki bitta, ikkita kam hollarda uchta operanddan tashkil topgan ro’yxatni ifodalaydi. Operandlar soni qat'iy aniqlangan va amal kodidan bog’liq bo’Iadi, assembler tilining har bir amali o’zining qattiq berilgan operandlarini ko’zda tutadi. Mos ravishda, ushbu variantlaming har biriga manzilsiz, birmanzilli, ikkimanzilli yoki uchmanzilli komandalar mos keladilar (operandlaming ko’pgina soni amalda foydalanilmaydi, zamonaviy EHMlarida hattoki, uchmanzilli komandalar kam uchraydi). Operandlar sifatida identifikatorlar yoki konstantalar kelishi mumkin.
Assembler tilining xususiyatlaridan biri shundaki, qator identifikatorlar jarayonchi registrlarini belgilish uchun maxsus ajratiladi. Bunday identifikatorlar bir tomondan, awaldan ifodalashni talab qilmaydilar, lekin boshqa tomondan ular foydalanuvchi tomonidan boshqa maqsadlarda ishlatila olmaydilar. Bunday identifikatorlar to’plami har bir assembler tili uchun aniqlangan bo’Iadi.
Gohida assembler tili operandlar sifatida registrlami, identifikatorlami va konstantalami belgilashning aniqlangan chegaraviy tarkibidan foydalanishni ko’zda tutadi va ular qandaydir amal ishoralari bilan birlashtiriladilar. Bunday tarkiblar ko’pincha manzillash toifalarini belgilash uchun maqsadli hisoblash tizimining mashina komandalarida foydalaniladi.
Masalan, quyidagi komandalar ketma-ketligi
dctasdb 16 dup(O) lccp nrv dfc [bt+4].cxdec
bxjnz loops
assembler tilining Intel 80x86 jarayonchilarining oilasi komandalari ketma-ketligini ifodalaydi. Bu erda (db) berilganlar to’plamini ifodalash komandasi, (loops) belgisi, (mov, dec va jnz) amal kodlari mavjud. Operandlar bo’iib identifikator berilganlari to’plami (datas) hisoblanadi, jarayonda registrlami (bx va sx), belgini (loops) va konstanta (4) sifatida belgilangan. Tarkibiy Operand datas[bx+4] datas berilganlar to’plamini baza registrlari bx va sx bo’yicha 4 birlikka surgan holda bilvosita manzillashni aks ettiradi.
Tilning bunday sintaksisini regulyar grammatika yordamida qiyinchiliklarsiz ifodalanishi mumkin. SHu sababli, assembler tili uchun anglovchini qurish qiyin emas. Shu sababdan ham assembler tilining kompilyatorlarida leksik va sintaksis tahlilni bitta anglovchiga yuklatilgan.
Assembler tilining semantikasi butunligicha va to’liq, berilgan tilga mo’ljallangan, maqsadli hisoblash tizimi orqali aniqlanadi. Assembler tilining semantikasi assembler tilining har bir komandasiga qanday mashina komandasi mos kelishini, shuningdek, qanday operandlar va qanday sonda u yoki bu amal kodi uchun ruxsat etilishini aniqlaydi.
Shu sababli kompilyatorda assembler tilidan Semantik tahlil sintaksis tahlil kabi oddiy. Uning asosiy masalasi bo’lib, har bir amal kodi uchun operandlaming ruxsat etilishini tekshirish hisoblanadi, shuningdek, kiruvchi dasturda uchraydigan barcha identifikatorlar va belgilar ifodalangan va ulami belgilagan identifikatorlar avval ifodalangan, amal kodlari va jarayonchilami belgilash uchun foydalanilgan, identifikatorlar bilan mos tushmasligini tekshiradi.
Kompilyatorda assembler tilidan sintaksis va Semantik tahlil oddiy chekli avtomatlar asosida amalga oshirilgan bo’Iishi mumkin. Xuddi ana shu xususiyat, assembler tilining kompilyatorlari EHM uchun tashkil etilgan birinchi kompilyatorlar sifatida tarixda qolganligini aniqlaydi. Yana bir qancha boshqa xususiyatlar ham mavjudki, ular faqat assembler tiliga tegishli va ular uchun kompilyatorlar qurishni osonlashtiradi.
Birinchidan, assembler tilining kompilyatorlarida o’zgaruvcKilami qo’shimcha identifikasiyalash bajarilmaydi — tilning barcha o’zgaruvchilari foydalanuvchi tomonidan berilgan o’z ismini saqlaydi. Ismlaming yagonaligi uchun kiruvchi dasturda ishlab chiqaruvchi javobgardir, til semantikasi bu jarayönga hech qanday qo’shimcha talablar qo’ymaydi.
Ikkinchidan, assembler tilining kompilyatorlarida xotiraning taqsimlanishi juda soddalashtirilgan. Assembler tilining kompilyatori faqat Statik xotira bilan ishlaydi. Agar dinamik xotira ishlatilayotgan bo’Isa, u holda u bilan ishlash uchun mos kutubxona va OT funksiyalaridan foydalanish kerak bo’ladi, uning taqsimlanishi uchun boshlang’ich dastur ishlab chiqaruvchisi javob beradi. Parametrlami uzatish va prosedura va funksiyalami displey xotirasini tashkil etish uchun ham boshlang’ich dastumi ishlab chiqaruvchisi javob beradi. U yana berilganlami dastur kodidan ajratish masalasini ham o’ylashi kerak, assembler tilining kompilyatori, yuqori daraja dasturlash tillarining kompilyatorlaridan farqli ravishda avtomatik tarzda bunday ajratishni bajarmaydi.
Va uchinchidan, assembler tilining kompilyatorida kodni generasiyalash bosqichida optimalIash amalga oshirilmaydi, chunki boshlang’ich dastumi ishlab chiqaruvchisi hisoblashlami, ya'ni mashina komandalarining ketma-ketligi va jarayonchi registrlarini taqsimlashni, tashkil etilishi uchun o’zi javob beradi. Ushbu xususiyatlami e'tiborga olinmasa assembler tilining kompilyatori oddiy kompilyator hisoblanadi, lekin yuqori daraja dasturlash tilining ixtiyoriy kompilyatoriga nisbatan anchagina soddalashtirilgan bo’ladi. Assembler tilining kompilyatori ko’pincha ikkio’tishli chizma bo’yicha amalga oshiriladilar. Birinchi o’tishda kompilyator boshlang’ich dastumi tahlilini bajaradi, uni mashina kodlariga aylantiradi va bir vaqtning o’zida identifikatorlar jadvalini to’ldiradi. Lekin birinchi o’tishda mashina komandalarida tezkor xotirada joylashgan operandlaming manzillari to’ldirilmay qoladi. Ikkinchi o’tishda kompilyator ushbu manzillami to’ldiradi va bir vaqtning o’zida ifodalanmagan identifikatorlami topadi. Bu esa, Operand dasturda birinchi marta ishlatilgaiiidan keyin ifodalangan hol bilan bog’liq. U holda uning manzili mashina komandalarini qurish vaqtida ma'lum bo’lmaydi, va shu sababli ikkinchi o’tish talab etiladi. Bunday operandga misol bo’lib, komandalar ketma-ketligi bo’yicha oldingao’tishni ko’zlayotgan, belgi hisoblanadi.