А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 24
Текст из файла (страница 24)
Äàëåå (â ïîðÿäêå óáûâàíèÿïðèîðèòåòà) èäóò îïåðàöèè ñäâèãîâ, îïåðàöèÿ &, çàòåì îïåðàöèÿ ^, è çàìûêàåò ñïèñîê îïåðàöèÿ |, èìåþùàÿ ñàìûé íèçêèé ïðèîðèòåò. Ïîðÿäîêâûïîëíåíèÿ îïåðàöèé ìîæíî èçìåíèòü, ïðèìåíèâ êðóãëûå ñêîáêè. 3.4.2. Êðèòè÷åñêèå âûðàæåíèÿÀññåìáëåð àíàëèçèðóåò èñõîäíûé òåêñò â äâà ïðîõîäà. Íà ïåðâîì ïðîõîäå âû÷èñëÿåòñÿ ðàçìåð âñåõ ìàøèííûõ êîìàíä è äðóãèõ äàííûõ, ïîäëåæàùèõ ðàçìåùåíèþ â ïàìÿòè ïðîãðàììû; â ðåçóëüòàòå ýòîãî àññåìáëåðóñòàíàâëèâàåò, êàêîå ÷èñëîâîå çíà÷åíèå äîëæíî áûòü ïðèïèñàíî êàæäîéèç âñòðåòèâøèõñÿ â òåêñòå ïðîãðàììû ìåòîê. Íà âòîðîì ïðîõîäå ãåíåðèðóåòñÿ ñîáñòâåííî ìàøèííûé êîä è ïðî÷åå ñîäåðæèìîå ïàìÿòè.
Âòîðîéïðîõîä íóæåí, ÷òîáû, íàïðèìåð, ìîæíî áûëî ññûëàòüñÿ íà ìåòêó, ñòîÿùóþ â òåêñòå ïîçæå, ÷åì ññûëêà íà íå¼: êîãäà àññåìáëåð âèäèò ìåòêó,ñêàæåì, â êîìàíäå jmp, ðàíüøå, ÷åì âñòðåòèòñÿ ñîáñòâåííî êîìàíäà, ïîìå÷åííàÿ ýòîé ìåòêîé, íà ïåðâîì ïðîõîäå îí íå ìîæåò ñãåíåðèðîâàòüêîä, ïîñêîëüêó íå çíàåò ÷èñëåííîãî çíà÷åíèÿ ìåòêè. Íà âòîðîì ïðîõîäåâñå çíà÷åíèÿ óæå èçâåñòíû, è íèêàêèõ ïðîáëåì ñ ãåíåðèðîâàíèåì êîäàíå âîçíèêàåò.101Âñ¼ ýòî èìååò ïðÿìîå îòíîøåíèå ê ìåõàíèçìó âû÷èñëåíèÿ âûðàæåíèé. ßñíî, ÷òî âûðàæåíèå, ñîäåðæàùåå ìåòêó, àññåìáëåð ìîæåò âû÷èñëèòü íà ïåðâîì ïðîõîäå òîëüêî â ñëó÷àå, åñëè ìåòêà ñòîÿëà â òåêñòåðàíüøå, ÷åì âû÷èñëÿåìîå âûðàæåíèå; â ïðîòèâíîì ñëó÷àå âû÷èñëåíèåâûðàæåíèÿ ïðèõîäèòñÿ îòëîæèòü äî âòîðîãî ïðîõîäà. Íè÷åãî ñòðàøíîãîâ ýòîì íåò, åñëè òîëüêî çíà÷åíèå âûðàæåíèÿ íå âëèÿåò íà ðàçìåðêîìàíäû, âûäåëÿåìîé îáëàñòè ïàìÿòè è ò.
ï., òî åñòü îò çíà÷åíèÿýòîãî âûðàæåíèÿ íå çàâèñÿò ÷èñëåííûå çíà÷åíèÿ, êîòîðûå íóæíî áóäåòïðèïèñàòü äàëüíåéøèì âñòðå÷åííûì ìåòêàì. Åñëè æå ýòî óñëîâèå íåâûïîëíåíî, òî íåâîçìîæíîñòü âû÷èñëèòü âûðàæåíèå íà ïåðâîì ïðîõîäåïðèâåä¼ò ê íåâîçìîæíîñòè âûïîëíèòü çàäà÷ó ïåðâîãî ïðîõîäà îïðåäåëèòü ÷èñëåííûå çíà÷åíèÿ âñåõ ìåòîê.
Áîëåå òîãî, â íåêîòîðûõ ñëó÷àÿõíå ïîìîãëî áû íèêàêîå êîëè÷åñòâî ïðîõîäîâ, äàæå åñëè áû àññåìáëåð ýòîóìåë.  äîêóìåíòàöèè ê àññåìáëåðó NASM ïðèâåä¼í òàêîé ïðèìåð:label:times (label-$) db 0db'Where am I?'Çäåñü ñòðî÷êà ñ äèðåêòèâîé times äîëæíà ââåñòè ñòîëüêî íóëåâûõ áàéòîâ, íàñêîëüêî ìåòêà label îòñòîèò îò ñàìîé ýòîé ñòðî÷êè íî âåäüìåòêà label êàê ðàç è îòñòîèò îò ýòîé ñòðî÷êè íàñòîëüêî, ñêîëüêî íóëåâûõ áàéòîâ áóäåò ââåäåíî. Òàê ñêîëüêî æå èõ äîëæíî áûòü ââåäåíî?! ñâÿçè ñ ýòèì ìû ââîäèì ïîíÿòèå êðèòè÷åñêîãî âûðàæåíèÿ :ýòî òàêîå âûðàæåíèå, âû÷èñëÿåìîå âî âðåìÿ àññåìáëèðîâàíèÿ, êîòîðîåàññåìáëåðó íåîáõîäèìî âû÷èñëèòü âî âðåìÿ ïåðâîãî ïðîõîäà. Êðèòè÷åñêèìè àññåìáëåð ñ÷èòàåò ëþáûå âûðàæåíèÿ, îò êîòîðûõ òåì èëè èíûìîáðàçîì çàâèñèò ðàçìåð ÷åãî áû òî íè áûëî, ðàñïîëàãàåìîãî â ïàìÿòè (è êîòîðûå, ñëåäîâàòåëüíî, ìîãóò ïîâëèÿòü íà çíà÷åíèÿ ìåòîê, ââîäèìûõ ïîçæå).
 êðèòè÷åñêèõ âûðàæåíèÿõ ìîæíî èñïîëüçîâàòü òîëüêî÷èñëîâûå êîíñòàíòû, à òàêæå ìåòêè, îïðåäåë¼ííûå âûøå ïî òåêñòó ïðîãðàììû, ÷åì ðàññìàòðèâàåìîå âûðàæåíèå. Ýòî ãàðàíòèðóåò âîçìîæíîñòüâû÷èñëåíèÿ âûðàæåíèÿ íà ïåðâîì ïðîõîäå.Êðîìå àðãóìåíòà äèðåêòèâû times, ê êàòåãîðèè êðèòè÷åñêèõ îòíîñÿòñÿ, íàïðèìåð, âûðàæåíèÿ â àðãóìåíòàõ ïñåâäîêîìàíä resb, resw èäð., à òàêæå â íåêîòîðûõ ñëó÷àÿõ âûðàæåíèÿ â ñîñòàâå èñïîëíèòåëüíûõ àäðåñîâ, êîòîðûå ìîãóò ïîâëèÿòü íà èòîãîâûé ðàçìåð àññåìáëèðóåìîé êîìàíäû.
Òàê, êîìàíäû ¾mov eax,[ebx]¿, ¾mov eax,[ebx+10]¿ è¾mov eax,[ebx+10000]¿ ïîðîæäàþò ñîîòâåòñòâåííî 2 áàéòà, 3 áàéòà è 6áàéòîâ êîäà, ïîñêîëüêó ÷èñëî, âõîäÿùåå â ñîñòàâ èñïîëíèòåëüíîãî àäðåñà, â ïåðâîì ñëó÷àå çàíèìàåò âñåãî 1 áàéò, âî âòîðîì 2, à â ïîñëåäíåì 4; íî ñêîëüêî ïàìÿòè çàéì¼ò êîìàíäàmov eax, [ebx+label]102åñëè çíà÷åíèå label ïîêà íå îïðåäåëåíî? Âïðî÷åì, ýòèõ òðóäíîñòåé ìîæíî èçáåæàòü, åñëè âíóòðè èñïîëíèòåëüíîãî àäðåñà â ÿâíîì âèäå óêàçàòüðàçðÿäíîñòü ñëîâîì byte, word èëè dword. Òàê, åñëè íàïèñàòümov eax, [ebx + dword label]òî, äàæå åñëè çíà÷åíèå label åù¼ íå èçâåñòíî, äëèíà åãî (è, êàê ñëåäñòâèå, äëèíà âñåé ìàøèííîé êîìàíäû) óæå óêàçàíà. 3.4.3.
Âûðàæåíèÿ â ñîñòàâå èñïîëíèòåëüíîãî àäðåñàÍà ðèñ. 2.2 (ñì. ñòð. 49) ìû ïðèâîäèëè îáùèé âèä èñïîëíèòåëüíîãîàäðåñà (îïåðàíäîâ òèïà ¾ïàìÿòü¿) ñ òî÷êè çðåíèÿ ìàøèííûõ êîìàíä.Àññåìáëåð NASM ìîæåò âîñïðèíèìàòü è áîëåå ñëîæíûå âûðàæåíèÿ âêâàäðàòíûõ ñêîáêàõ, ëèøü áû èõ áûëî âîçìîæíî ïðèâåñòè ê óêàçàííîìóâèäó. Òàê, íàïðèìåð, â êîìàíäåmov eax, [5*ebx]èñïîëüçóåòñÿ óìíîæåíèå íà ÷èñëî 5, ÷òî âðîäå áû çàïðåùåíî (óìíîæàòüìîæíî òîëüêî íà 1, 2, 4 è 8), íî àññåìáëåð ñïðàâëÿåòñÿ ñ ýòîé ñëîæíîñòüþ,ïðèâåäÿ â êîìàíäå îïåðàíä ê âèäó [ebx+4*ebx], êîòîðûé óæå âïîëíåêîððåêòåí. Åñëè æå ðàññìîòðåòü êîìàíäómov eax, [ebx+4*ecx+5*x+y]â êîòîðîé x è y íåêîòîðûå ìåòêè, òî è ñ ýòèì àññåìáëåð ñïðàâèòñÿ,ïîïðîñòó âû÷èñëèâ âûðàæåíèå 5*x+y è ïîëó÷èâ â èòîãå îäíî ÷èñëî, ÷òîóæå âïîëíå ñîîòâåòñòâóåò îáùåìó âèäó èñïîëíèòåëüíîãî àäðåñà.Íåîáõîäèìî òîëüêî ïîìíèòü, ÷òî, åñëè òîëüêî â ÿâíîì âèäå íå óêàçàòüíóæíóþ ðàçðÿäíîñòü, òàêèå âûðàæåíèÿ áóäóò ñ÷èòàòüñÿ êðèòè÷åñêèìè,òî åñòü äîëæíû çàâèñåòü òîëüêî îò ìåòîê, óæå ââåä¼ííûõ ê ìîìåíòóðàññìîòðåíèÿ âûðàæåíèÿ (ñì.
ïðåäûäóùèé ïàðàãðàô). 3.5. Ìàêðîñðåäñòâà è ìàêðîïðîöåññîð 3.5.1. Îñíîâíûå ïîíÿòèÿÏîä ìàêðîïðîöåññîðîì ïîíèìàþò ïðîãðàììíîå ñðåäñòâî, êîòîðîåïîëó÷àåò íà âõîä íåêîòîðûé òåêñò è, ïîëüçóÿñü óêàçàíèÿìè, äàííûìè âñàìîì òåêñòå, ÷àñòè÷íî ïðåîáðàçóåò åãî, äàâàÿ íà âûõîäå, â ñâîþ î÷åðåäü, òåêñò, íî óæå íå èìåþùèé óêàçàíèé ê ïðåîáðàçîâàíèþ.  ïðèìåíåíèè ê ÿçûêàì ïðîãðàììèðîâàíèÿ ìàêðîïðîöåññîð ýòî ïðåîáðàçîâàòåëü èñõîäíîãî òåêñòà ïðîãðàììû, îáû÷íî ñîâìåù¼ííûé ñ êîìïèëÿòîðîì;103текст программыс макродирективамии макровызовамимакропроцессортекст программыбез макросоврезультаттранслятортрансляцииÐèñ. 3.1.
Ñõåìà ðàáîòû ìàêðîïðîöåññîðàðåçóëüòàòîì ðàáîòû ìàêðîïðîöåññîðà ÿâëÿåòñÿ òåêñò íà ÿçûêå ïðîãðàììèðîâàíèÿ, êîòîðûé ïîòîì óæå îáðàáàòûâàåòñÿ êîìïèëÿòîðîì âñîîòâåòñòâèè ñ ïðàâèëàìè ÿçûêà (ñì. ðèñ. 3.1).Ïîñêîëüêó ÿçûêè àññåìáëåðà îáû÷íî âåñüìà áåäíû ïî ñâîèì èçîáðàçèòåëüíûì âîçìîæíîñòÿì (åñëè ñðàâíèâàòü èõ ñ ÿçûêàìè âûñîêîãîóðîâíÿ), òî, ÷òîáû õîòü êàê-òî êîìïåíñèðîâàòü ïðîãðàììèñòàì íåóäîáñòâà, îáû÷íî àññåìáëåðû ñíàáæàþò î÷åíü ìîùíûìè ìàêðîïðîöåññîðàìè. ÷àñòíîñòè, ðàññìàòðèâàåìûé íàìè àññåìáëåð NASM ñîäåðæèò â ñåáåàëãîðèòìè÷åñêè ïîëíûé ìàêðîïðîöåññîð, êîòîðûé ìû ìîæåì ïðè æåëàíèè çàñòàâèòü íàïèñàòü çà íàñ åäâà ëè íå âñþ ïðîãðàììó.Ñ ìàêðîñàìè ìû óæå âñòðå÷àëèñü: ÷àñòî èñïîëüçîâàâøèåñÿ íàìèPRINT è FINISH ïðåäñòàâëÿþò ñîáîé èìåííî ìàêðîñû, èëè, òî÷íåå, èìåíàìàêðîñîâ .Âîîáùå, ìàêðîñîì íàçûâàþò íåêîòîðîå ïðàâèëî, â ñîîòâåòñòâèè ñêîòîðûì ôðàãìåíò ïðîãðàììû, ñîäåðæàùèé îïðåäåë¼ííîå ñëîâî, äîëæåíáûòü ïðåîáðàçîâàí.
Ñàìî ýòî ñëîâî íàçûâàþò èìåíåì ìàêðîñà ; ÷àñòîâìåñòî òåðìèíà ¾èìÿ ìàêðîñà¿ èñïîëüçóþò ïðîñòî ñëîâî ¾ìàêðîñ¿, õîòÿýòî è íå ñîâñåì âåðíî.Ïðåæäå ÷åì ìû ñìîæåì âîñïîëüçîâàòüñÿ ìàêðîñîì, åãî íåîáõîäèìî îïðåäåëèòü, òî åñòü, âî-ïåðâûõ, óêàçàòü ìàêðîïðîöåññîðó, ÷òî íåêèéèäåíòèôèêàòîð îòíûíå ñ÷èòàåòñÿ èìåíåì ìàêðîñà (òàê ÷òî åãî ïîÿâëåíèå â òåêñòå ïðîãðàììû òðåáóåò âìåøàòåëüñòâà ìàêðîïðîöåññîðà), è, âîâòîðûõ, çàäàòü òî ïðàâèëî, ïî êîòîðîìó ìàêðîïðîöåññîð äîëæåí äåéñòâîâàòü, âñòðåòèâ ýòî èìÿ. Ôðàãìåíò ïðîãðàììû, îïðåäåëÿþùèé ìàêðîñ, íàçûâàþò ìàêðîîïðåäåëåíèåì . Êîãäà ìàêðîïðîöåññîð âñòðå÷àåòâ òåêñòå ïðîãðàììû èìÿ ìàêðîñà è ïàðàìåòðû (òàê íàçûâàåìûé âûçîâìàêðîñà , èëè ìàêðîâûçîâ ), îí çàìåíÿåò èìÿ ìàêðîñà (è, âîçìîæíî,ïàðàìåòðû, îòíîñÿùèåñÿ ê íåìó) íåêèì ôðàãìåíòîì òåêñòà, ïîëó÷åííûìâ ñîîòâåòñòâèè ñ îïðåäåëåíèåì ìàêðîñà.
Òàêàÿ çàìåíà íàçûâàåòñÿ ìàêðîïîäñòàíîâêîé , à òåêñò, ïîëó÷åííûé â ðåçóëüòàòå ìàêðîðàñøèðåíèåì 5 .Áûâàåò è òàê, ÷òî ìàêðîïðîöåññîð ïðîèçâîäèò ïðåîáðàçîâàíèå òåêñòà ïðîãðàììû, íå âèäÿ íè îäíîãî èìåíè ìàêðîñà, íî ïîâèíóÿñü åù¼áîëåå ïðÿìûì óêàçàíèÿì, âûðàæåííûì â âèäå ìàêðîäèðåêòèâ . Îäíóòàêóþ ìàêðîäèðåêòèâó ìû óæå çíàåì: ýòî äèðåêòèâà %include, êîòîðàÿ5 Òåðìèí ¾ìàêðîðàñøèðåíèå¿ ýòî íå ñëèøêîì óäà÷íàÿ êàëüêà ñ ñîîòâåòñòâóþùåãî àíãëèéñêîãî òåðìèíà ¾macro expansion¿.104ïðèêàçûâàåò ìàêðîïðîöåññîðó çàìåíèòü å¼ ñàìó íà ñîäåðæèìîå ôàéëà,óêàçàííîãî ïàðàìåòðîì äèðåêòèâû. Òàê, ïðèâû÷íàÿ íàì ñòðîêà%include "stud_io.inc"çàìåíÿåòñÿ íà âñ¼, ÷òî åñòü â ôàéëå stud_io.inc. 3.5.2.
Ïðîñòåéøèå ïðèìåðû ìàêðîñîâ×òîáû ñîñòàâèòü ïðåäñòàâëåíèå î òîì, êàê ìîæíî âîñïîëüçîâàòüñÿìàêðîïðîöåññîðîì è äëÿ ÷åãî îí íóæåí, ïðèâåä¼ì äâà ïðîñòûõ ïðèìåðà.Êàê ìû âèäåëè èç 2.6.6, 2.6.7 è 2.6.9, çàïèñü âûçîâà ïîäïðîãðàììû íàÿçûêå àññåìáëåðà çàíèìàåò íåñêîëüêî ñòðîê (åñëè áûòü òî÷íûìè, 2 + n,ãäå n ÷èñëî ïàðàìåòðîâ ïîäïðîãðàììû).