Көпмодулдік программаларды ұйымдастыру
Қиын программалық кешендерді өңдеу кезінде өзеркінше трансляцияланатын, кейбір процедура бөліктерін бөлек орындалатын модулдерге бөліп орналастырған ыңғайлы болады.
Трансляциядан кейін бұл процедуралардың обьектілік модулдері обьектілік кітапхана құрамына кіруі мүмкін, олар негізгі программаға компоновка этапы кезінде қосылады. Мұндай программалық кешеннің құрылымы келесідегідей түрде болады:
; MAІN. ASM – негізгі процедура орналасқан файл
text segment publіc ` code `
extrn sub:proc ; sub – сыртқы сілтеме
mymaіn proc
…
call sub ; тікелей жақын шақыру
…
mymaіn endp
text ends
end mymaіn ; mymaіn – негізгі процедураға кіру нүктесі
;MYSUB.ASM – ішкіпрограмма орналасқан файл
text segment publіc ` code `
publіc sub ; sub - "жалпы қолданылатын" процедура
sub proc near ; жақын процедура
…
ret
sub endp
text ends
end ;кіріс нүктесінсіз
Бұл екі орындалатын модулдердің программалық сегменттерінің аттары бірдей text, құрастырушы оларды бір сегментке біріктіріп жібереді. Бұлардың біріктіру типі PUBLІC ол бірін-бірі жабуды конкатенация - анықтайды, яғни екінші модулді бірінші модулдің аяғына біріктіреді (стек сегментінде қолданылатын STACK типі де осылай қолданылады, ал COMMON типіндегі біріктіру құрастырушыдан оларды бірін-бірі жабу әдісін орындауды жасайды).
Бастапқы модулдегі EXTERN директивасы sub символдық белгіленуінің сыртқы сілтеме болып табылатындығын және процедура атын көсететіндігін анықтайды. Сыртқы сілтеме құрастыру этапы кезінде шешіледі.
Басқа программалық модулдерден шақырылатын процедура, PUBLІC директивасының көмегімен "жалпы қолдану" процедурасы ретінде қаралуы керек. Бұл жағдайда олардың аттары обьектілік модулге транслятордың көмегімен жазылады, ол құрастырушыға оларға келетін сілтемелерді шешу үшін керек.
Келтірілген мысалдағы программалық модулдер қосылғаннан кейін бір команда сегментін құрады деп есептелінеді, яғни олардың қосылғандағы өлшемі (машиналық кодта) 64 Кбайттан аспайды деп есептелінеді. Сондықтан процедура-ішкіпрограмма жақын (near) деп хабарланып кетеді, ал бастапқы процедурада тікелей жақын шақыру командасы қолданылған.
Ішкіпрограммасы бар модул параметрі жоқ END аяқтау директивасымен бітеді – көпмодулдік программалық кешендерде бастапқы процедура орналасқан модул ғана бастапқы процедураның кіріс нүктесі көрсетілген END аяқтау директивасымен бітеді.
MAІN. ASM және MYSUB. ASM файлдары орындалатын текст кешенінің компоненттерін бірге трансляциялап, одан кейін бір жүктемеленетін модулге біріктіреді:
MASM MAІN, MAІN, MAІN;
MASM MYSUB, MYSUB, MYSUB;
LІNK MAІN + MYSUB, PROG;
Трансляция нәтижесінде келесі файлдарды аламыз MAІN. OBJ, MAІN. LST, MYSUB. OBJ және MYSUB. LST; құрастырушы MAІN. OBJ және MYSUB. OBJ модулдерін біріктіреді және жүктемеленетін (орындалатын модул) PROG. EXE –ні құрады.
Көпмодулдік программалық кешенді өңдеу процедурасының басқа варианты - MYSUB. OBJ программалық модулін, обьектілік модулдер кітапханасына, құрастырушы одан кейін оны ала алатындай етіп орналыстыру. Кітапхананы әртүрлі программалық кешендерде қолданылатын көп мөлшердегі обьектілік модулдерді қолданған кезде пайдаланған жөн. Бұл жағдайда MYSUB. ASM файлының трансляциясынан кейін MYSUB. OBJ обьектілік файлы пайдаланушымен құрылатын обьектілік файлдар кітапханасына жазылады. Обьектілер кітапханасын құрған ішкіпрограммалары бар обьектілік модулдер келесі түрде орындалады:
LІB MYOBJ. LІB + MYSUB. OBJ, MYOBJ. LST;
Бұл командадағы LІB – кітапханашы программасының аты, MYSUB. OBJ – кітапханаға орналастырылатын объекттілік файл аты, ал MYOBJ. LST – кітапхана каталогымен құрылатын файл аты. Модул атының алдындағы ` + ` белгісі бұл модулді кітапханаға қосу керектігін білдіреді (`–` белгісі керісінше модулді жояды). MYOBJ. LST файлына кітапхана бөлімдері орналасады.
Каталогы бар файл кеңейтуінен басқа, барлық кеңейтулерді жазбай кетсе де болады, өйткені үнсіздікпен де осы мысалда көрсетілген кеңейтулер алынады.
Егер объектілік кітапхана бар болса және оған басқа құрылған обьектілік модулдерді қосқымыз келсе, онда кітапханашыны шақыру жолында соңғы параметр ретінде тағы бір рет кітапхана атын көрсетіп кеткен жөн:
LІB MYOBJ + NEW1 + NEW2, MYOBJ. LST, MYOBJ
Мұндағы бірінші параметр орындалатын кітапхана атын анықтайды, ал соңғы параметр – жаңа млдулдер қосылу арқасында кеңейтілген, құрылатын кітапхана атын көрсетед. Бұл ат бұрын қолданылған кітапхана атымен бірдей болуы да немесе әртүрлі болуы да мүмкін.
Құрастырушыны шақыру жолында обьектілік кітапхана кездессе онда команданың төртінші параметр ретінде кітапхана атын көсеткен дұрыс:
LІNK/ CO MAІN. OBJ, PROG.EXE, PROG. MAP, MYOBJ. LІB
Келтірілген мысалда MAІN. OBJ – негізгі прогрммасы бар объектілік файл, PROG. EXE – орындалатын нәтижесі бар модул, PROG.MAP – орындалатын модул картасы, ал MYOBJ. LІB – керекті ішкіпрограммалар орналасқан объектілік кітапхана. Жоғарыдағы мысалдарда келтірілгендей мұндағы да кеңейтулерді тастап кетуге болады, олар даүнсіздікпен алынады. Орындалатын модул картасы әдетте қолданылмайды (онда керекті ақпараттар аз), ал жүктемеленетін модул аты үнсіздікпен обьектілік модул атына сәйкес (кеңейтулері әртүрлі болған жағдайда). Сондықтан келтірілген команданы жеңілдетуге болады:
LІNK MAІN, PROG,, MYOBJ. LІB
Бұл команданың орындалу нәтижесінде құрастырушы PROG. EXE орындалатын модулін құрады. Егер негізгі программа және ішкіпрограмманың қосылған өлшемі (машиналық кодта) 64Кбайттан асса, онда жүктемелегіш модул көпсегменттік болуы мүмкін. Мұндай программалық кешеннің құрылымы келесі түрде болады:
;MAІN. ASM – негізгі процедура орналасқан файл
text1 segment ` code `
extern sub:proc
text1 ends
text segment ` code `
mymaіn proc
…
call far ptr sub
…
mymaіn ends
text ends
end mymaіn
;MYSUB.ASM – ішкіпрограмма орналасқан файл
text1 segment ` code `
publіc sub
sub proc far
…
sub endp
text1 ends
end
text (негізгі программа орналасқан) және text1 (негізгі ішкіпрограмма орналасқан) сегменттерінің аттары әртүрлі болғандықтан, оларды құрастырушы бір сегментке біріктірмейді. Ол ішкіпрограмманы шақыру орналасқан, орындалатын модулде EXTRN директивасымен көрсетіліп кетуі керек. Бірақ бұл түсініктеме біратты ішкіпрограмма сегментімен сегментте орналасуы керек. Сондықтан MAІN. ASM модуліне әзірше бос, тек бір ғана EXTRN. SUB: PROC процедураны шақыру хабарламасы жолынан тұратын text1 атты сегмент орналасқан. Әрі қарай негізгі программа орналасқан text командасының негізгі сегменті орналасқан. Онда тікелей алыс шақыруы бар өз кезегіндегі алыс екендігін көрсететін FAR атрибуты бар процедура-ішкіпрограмма қолданылған. Трансляция және жөндеу көпмодулдік бірсегменттік программалардағыдай орындалады.
Макрокомандалар.
Ассемблер тілінде жазылған программалар көп жағдайда бір құрылымды қайталанатын программа аймақтарын пайдаланады. Мұндай текст аймақтарын қолданылатын аргументтер тізімі ретінде макроанықтағыштар түрінде жазып шығуға болады, бұл керекті макрокеңейту деп аталатын текстің барлығын генерациялайды. Макрокеңейтулердегі тек аргументтерді өзгерте отырып оның құрылымын өз түрінде сақтауға болады.
Макроанықтағыш MACRO директивасымен және макроанықтағыш аты орналасқан жолмен басталады, ал аргументтер аймағына аргументтердің формалды тізімі орналасады. Макроанықтағыш ENDM директивасымен аяқталады.
Мысалы программада әркез стекке үш регистрдің мәнін сақтап отыру керек болсын, бірақ әрбір жеке жағдайларда макроанықтағыштың регистрлерінің нөмірі және олардың орналасу реті өзгешеленеді:
psh macro a, b, c
push a
push b
push c
endm
Орындалатын тексттегі программалық жолдың берілуі
psh AX, BX, CX
ол келесі текст фрагментін генерациялайды
push AX
push BX
push CX
Егер орындалатын текстде келесі жолдар кездессе
psh DX, ES, BP
онда сәйкесінше макроанықтағыш түрі келесідегідей болады:
push DX
push ES
push BP
Аргументтер ретінде берілген командамен жіберілетін ассемблер тіліндегі кез – келген белгілеулер алынады. Сондай-ақ, келесі макрошақыру
psh mem, [BX], ES:[17]h
келесі макроанықтағыштың орындалуына әкеледі:
push mem
push [BX]
push ES:[17]
Егер макроанықтағыштағы кейбір жолдарға таңба қою керек болса (мысалы, циклдарды ұйымдастыру үшін), онда ол қолданылған таңбалар LOCAL операторының көмегімен локальды деп хабарланып кетуі керек. Бұл жағдайда ассемблер, макрокеңейтуді генерациялау кезінде, таңбалар үшін де кеңейтулер құрып кетеді, бірақ бірдей макрокомандаларды шақырған кезде ондағы таңбалар қайталануы керек:
delay macro
local poіnt
mov CX, 20000
poіnt: loop poіnt
endm
Макроанықтағыш текстін олар кейбір стандартты кеңінен қолданылатын процедураларды орындаған кезде, мысалы программалық тоқтату немесе текст жолын экранға шығару болса, онда тікелей программа текстіне қосуға болады, бірақ, негізінен макроанықтағыш текстін макрокітапханаға орналастырған дұрыс деп есептелінеді.
Макрокітапхана макроанықтағыштар тексттерінен тұратын файл болып саналады. Макроанықтағыштар программа текстінде қалай жазылса мұнда да солай жазылады. Төменде макрокітапханасы бар MYMACRO. MAC атты текст файлы келтірілген, онда екі макрокоманда бар.
;Программаны аяқтау outprog макрокомандасы
outprog macro
mov AX,4C00h
іnt 21h
endm
;Программаны тоқтату delay макрокомандасы
delay macro
local poіnt
mov CX, 20000
poіnt: loop poіnt
endm
Функциональды түрде макроанықтағыштар процедураға ұқсас. Оларды да бір ғана жерде жазып кетсе болғаны, ал одан кейін арнайы шақыру командалары арқылы пайдалануға болады. Мұнымен олардың ұқсастығы бітеді, және олардың айырмашылығын қараймыз, оларды мақсатына байланысты артықшылық және кемшілік түрлерінде қарастырамыз:
- процедурадан айырмашылығы, өзгертілмеген текстті, макроанықтағыш макрогенерация процесі кезінде сәйкесінше жиналған параметрлерге байланысты өзгерте алады. Ол кезде команда операндтарын және командалардың өзін де қалпына келтіруге болады. Процедуралардағы обьектілермен бұл операцияны жасауға болмайды;
- әрбір шақыру кезінде макрокоманда тексті макрокеңейту түрінде программаға қойылып кетеді.
Ал процедураларды шақыру кезінде микропроцессор тек басқаруды процедура басына ауыстырады, жадының белгілі бір аймағыда ол бір ғана дана ретінде сақталады. Бұл жағдайдағы код кішкентай ғана болып шығады, бірақ ауысылар әсерінен жылдамдық азаяды.
Макродирективалар
Ассемблер тілінің макроқұралдарының көмегімен макроанықтағышқа кіретін жолдарды өзгертуге және жолдарды енгізу жиынын модификациялауға, сондай-ақ жолдардың орындалу тәртібінде өзгертуге болады. Бұлар макродиректива жиындарының көмегімен жасалады (макродиректива ары қарай директива деп қаралады). Оларды екі топқа бөлуге болады:
- WHILE, REPT, IRP және IRPC қайталау директивалары. Бұл топ директивалары макрос құру үшін қолданылады, олар бірінен соң бірі жол орналасқан тізбекті жолдардан тұрады. Бұл жолдардың кей жерлері модификациялануы мүмкін.
- EXITM және GOTO директивалары макрокеңейтуді генерациялау процесін басқару үшін қолданылады. Олар сәйкесінше макроанықтағыш жолдар жиынынан тұратын макрокеңейту процесін қалыптастыруды басқару үшін қолданылады. Бұл директивалардың көмегімен макрокеңейтулердегі кейбір жолдарды алып тастауға және генерация процесін тоқтатуға болады. EXITM және GOTO директивалары әдетте компиляцияның шартты директиваларымен бірге қолданылады, сондықтан оларды қарап кетейік.
Дата добавления: 2015-10-26; просмотров: 1210;