А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 7
Текст из файла (страница 7)
Òî æå ñàìîå ìîæíî áûëî ñêàçàòü èîòíîñèòåëüíî ïðîöåññîðà 80186, âûïóùåííîãî â 1982 ãîäó.  ñðàâíåíèèñî ñâîèìè ïðåäøåñòâåííèêàìè ýòîò ïðîöåññîð ðàáîòàë ãîðàçäî áûñòðååçà ñ÷¼ò àïïàðàòíîé ðåàëèçàöèè íåêîòîðûõ îïåðàöèé, âûïîëíÿâøèõñÿ âïðåäûäóùèõ ïðîöåññîðàõ ïóò¼ì èñïîëíåíèÿ ìèêðîêîäà, è çà ñ÷¼ò ïîâûøåíèÿ òàêòîâîé ÷àñòîòû.
Ïðîöåññîð âêëþ÷àë â ñåáÿ íåêîòîðûå ïîäñèñòåìû, êîòîðûå ðàíåå òðåáîâàëîñü ïîääåðæèâàòü ñ ïîìîùüþ äîïîëíèòåëüíûõ ìèêðîñõåì òàêèå êàê êîíòðîëëåð ïðåðûâàíèé è êîíòðîëëåðïðÿìîãî äîñòóïà ê ïàìÿòè. Êðîìå òîãî, ñèñòåìà êîìàíä ïðîöåññîðà áûëàðàñøèðåíà ââåäåíèåì äîïîëíèòåëüíûõ êîìàíä; òàê, ñòàëî âîçìîæíûì ñïîìîùüþ îäíîé êîìàíäû çàíåñòè â ñòåê âñå ðåãèñòðû îáùåãî íàçíà÷åíèÿ.
Àäðåñíàÿ øèíà ïðîöåññîðîâ 8086, 8088 è 80186 áûëà 20-ðàçðÿäíîé,÷òî ïîçâîëÿëî àäðåñîâàòü íå áîëåå 1 Mb îïåðàòèâíîé ïàìÿòè. òîì æå 1982 ãîäó óâèäåë ñâåò è ïðîöåññîð 80286, ñòàâøèé ïîñëåäíèì16-áèòíûì ïðîöåññîðîì â ðàññìàòðèâàåìîì ðÿäó. Ýòîò ïðîöåññîð ïîääåðæèâàë òàê íàçûâàåìûé çàùèù¼ííûé ðåæèì ðàáîòû (protected mode), âêîòîðîì ðåàëèçîâûâàëàñü ñåãìåíòíàÿ ìîäåëü âèðòóàëüíîé ïàìÿòè, ïîäðàçóìåâàþùàÿ, â òîì ÷èñëå, è çàùèòó ïàìÿòè; ÷åòûðå êîëüöà çàùèòûïîçâîëèëè çàïðåòèòü ïîëüçîâàòåëüñêèì çàäà÷àì âûïîëíåíèå äåéñòâèé,âëèÿþùèõ íà ñèñòåìó â öåëîì, ÷òî íåîáõîäèìî ïðè ðàáîòå ìóëüòèçàäà÷íîé îïåðàöèîííîé ñèñòåìû. Àäðåñíàÿ øèíà ïîëó÷èëà ÷åòûðå äîïîëíèòåëüíûõ ðàçðÿäà, óâåëè÷èâ, òàêèì îáðàçîì, ìàêñèìàëüíîå êîëè÷åñòâîíåïîñðåäñòâåííî äîñòóïíîé ïàìÿòè äî 16 Mb.Îäíàêî ïî-íàñòîÿùåìó ìóëüòèçàäà÷íûå îïåðàöèîííûå ñèñòåìû áûëè ðåàëèçîâàíû ëèøü íà ñëåäóþùåì ïðîöåññîðå â ðÿäó, 32-ðàçðÿäíîìIntel 80386, äëÿ êðàòêîñòè îáîçíà÷àåìîì ïðîñòî ¾i386¿.
Ýòîò ïðîöåññîð,ìàññîâûé âûïóñê êîòîðîãî íà÷àëñÿ â 1986 ãîäó, ðåçêî îòëè÷àëñÿ îò ñâîèõïðåäøåñòâåííèêîâ, ïðåæäå âñåãî, óâåëè÷åíèåì ðåãèñòðîâ äî 32 áèò, ñóùåñòâåííûì ðàñøèðåíèåì ñèñòåìû êîìàíä, óâåëè÷åíèåì àäðåñíîé øèíû äî32 ðàçðÿäîâ, ÷òî ïîçâîëÿëî íåïîñðåäñòâåííî àäðåñîâàòü äî 4 Gb ôèçè÷åñêîé ïàìÿòè. Äîáàâëåíèå ïîääåðæêè ñòðàíè÷íîé îðãàíèçàöèè âèðòóàëüíîé ïàìÿòè , íàèëó÷øèì îáðàçîì ïðèãîäíîé äëÿ ðåàëèçàöèèìóëüòèçàäà÷íîãî ðåæèìà ðàáîòû, çàâåðøèëî êàðòèíó.
Èìåííî ñ ïîÿâëåíèåì i386 òàê íàçûâàåìûå IBM-ñîâìåñòèìûå êîìïüþòåðû, íàêîíåö, ñòàëèïîëíîöåííûìè âû÷èñëèòåëüíûìè ñèñòåìàìè. Âìåñòå ñ òåì, i386 ïîëíîñòüþ ñîõðàíèë ñîâìåñòèìîñòü ñ ïðåäøåñòâóþùèìè ïðîöåññîðàìè ñâîåéáîëåå äåøåâûìè çà ñ÷¼ò èõ ìàññîâîñòè. Òàê èëè èíà÷å, â íàñòîÿùåå âðåìÿ ñèòóàöèÿèìåííî òàêîâà è íèêàêèõ òåíäåíöèé ê å¼ èçìåíåíèþ íå ïðåäâèäèòñÿ.23ñåðèè, ÷åì îáóñëîâëåíà äîñòàòî÷íî ñòðàííàÿ íà ïåðâûé âçãëÿä ñèñòåìàðåãèñòðîâ. Íàïðèìåð, óíèâåðñàëüíûå ðåãèñòðû ïðîöåññîðîâ 808680286íàçûâàëèñü AX, BX, CX è DX è ñîäåðæàëè 16 áèò äàííûõ êàæäûé; â ïðîöåññîðå i386 è áîëåå ïîçäíèõ ïðîöåññîðàõ ëèíåéêè èìåþòñÿ ðåãèñòðû, ñîäåðæàùèå ïî 32 áèòà è íàçûâàþùèåñÿ EAX, EBX, ECX è EDX (áóêâà E îçíà÷àåòñëîâî ¾extended¿, ò. å. ¾ðàñøèðåííûé¿), ïðè÷¼ì ìëàäøèå 16 áèò êàæäîãî èç ýòèõ ðåãèñòðîâ ñîõðàíÿþò ñòàðûå íàçâàíèÿ (ñîîòâåòñòâåííî, AX, BX,CX è DX).
Áîëüøèíñòâî èíñòðóêöèé ðàáîòàåò ïî-ðàçíîìó äëÿ îïåðàíäîâäëèíîé 8 áèò, 16 áèò è 32 áèòà, è ò. ï.Äàëüíåéøåå ðàçâèòèå ñåìåéñòâà ïðîöåññîðîâ x86 âïëîòü äî 2003 ãîäàáûëî ÷èñòî êîëè÷åñòâåííûì: óâåëè÷èâàëàñü ñêîðîñòü, äîáàâëÿëèñü íîâûå êîìàíäû, íî ïðèíöèïèàëüíûõ èçìåíåíèé àðõèòåêòóðû íå ïðîèñõîäèëî.  2003 ãîäó êîìïàíèÿ AMD ïðåäñòàâèëà íîâûé ïðîöåññîð, èìåþùèé 64-áèòíûå ðåãèñòðû, è ê íàñòîÿùåìó âðåìåíè ìíîãèå îïåðàöèîííûåñèñòåìû ñïîñîáíû âûïîëíÿòüñÿ íà òàêèõ ïðîöåññîðàõ, îäíàêî íàèáîëååïîïóëÿðíîé îñòà¼òñÿ äî ñèõ ïîð èìåííî 32-áèòíàÿ ïëàòôîðìà, ðîäîíà÷àëüíèêîì êîòîðîé ñòàë ïðîöåññîð i386. 1.5.
Çíàêîìèìñÿ ñ èíñòðóìåíòîìÏðåæäå ÷åì íàïèñàòü ïåðâóþ ñàìîñòîÿòåëüíóþ ïðîãðàììó íà ÿçûêåàññåìáëåðà, íàì íåîáõîäèìî èçó÷èòü ïðîöåññîð, ñ êîòîðûì ìû áóäåì ðàáîòàòü (ïóñòü äàæå íå âñå åãî âîçìîæíîñòè, íî õîòÿ áû íåêîòîðóþ ñóùåñòâåííóþ èõ ÷àñòü), à òàêæå ñèíòàêñèñ ÿçûêà àññåìáëåðà.
Ê ñîæàëåíèþ,çäåñü âîçíèêàåò îïðåäåë¼ííàÿ ïðîáëåìà: èçó÷àòü ýòè äâå âåùè îäíîâðåìåííî íå ïîëó÷àåòñÿ, íî, â òî æå âðåìÿ, èçó÷àòü ñèñòåìó êîìàíä ïðîöåññîðà, íå èìåÿ íèêàêîãî ïðåäñòàâëåíèÿ î ñèíòàêñèñå ÿçûêà àññåìáëåðà, àðàâíî è èçó÷àòü ñèíòàêñèñ, íå èìåÿ ïðåäñòàâëåíèÿ î ñèñòåìå êîìàíä çàäà÷à íåáëàãîäàðíàÿ, òàê ÷òî, ñ ÷åãî áû ìû íè íà÷àëè, ðåçóëüòàò ïîëó÷èòñÿ íåñêîëüêî ñòðàííûé. Ìû ïîïðîáóåì ïîéòè èíûì ïóò¼ì. Íåêîòîðîåïðåäñòàâëåíèå î ñèñòåìå êîìàíä ó íàñ óæå åñòü, ïóñòü äàæå îíî âåñüìà èâåñüìà ñëàáîå; ïîïðîáóåì ïîëó÷èòü àíàëîãè÷íîå ïðåäñòàâëåíèå è î ñèíòàêñèñå ÿçûêà àññåìáëåðà, à çàòåì óæå ïðèñòóïèì ê ñèñòåìàòè÷åñêîìóèçó÷åíèþ òîãî è äðóãîãî.Ñåé÷àñ ìû íàïèøåì ðàáîòàþùóþ ïðîãðàììó íà ÿçûêå àññåìáëåðà,îòòðàíñëèðóåì å¼ è çàïóñòèì.
Ïîíà÷àëó â òåêñòå ïðîãðàììû áóäåò äàëåêî íå âñ¼ ïîíÿòíî; ÷òî-òî ìû îáúÿñíèì ïðÿìî ñåé÷àñ, ÷òî-òî îñòàâèì äîáîëåå ïîäõîäÿùåãî ìîìåíòà. Çàäà÷ó ìû äëÿ ñåáÿ âûáåðåì î÷åíü ïðîñòóþ:íàïå÷àòàòü16 ïÿòü ðàç ñëîâî ¾Hello¿. Êàê ìû óæå ãîâîðèëè íà ñòð. 17,16 Ò. å. âûâåñòè íà ýêðàí, èëè, åñëè ãîâîðèòü ñòðîãî, âûâåñòè â ïîòîê ñòàíäàðò-íîãî âûâîäà ;îòìåòèì, ÷òî ïðîöåññîð ñàì ïî ñåáå íè÷åãî íå çíàåò î âûâîäå íà ýêðàí,âñå îïåðàöèè ââîäà-âûâîäà òðåáóþò ðàáîòû ñ âíåøíèìè óñòðîéñòâàìè è îðãàíèçóþòñÿ24äëÿ âûâîäà ñòðîêè íà ýêðàí, à òàêæå äëÿ êîððåêòíîãî çàâåðøåíèÿ ïðîãðàììû íàì ïîòðåáóåòñÿ îáðàùàòüñÿ ê îïåðàöèîííîé ñèñòåìå, íî ìû ïîêàâîñïîëüçóåìñÿ äëÿ ýòîãî óæå ãîòîâûìè ìàêðîñàìè, êîòîðûå îïèñàíû âîòäåëüíîì ôàéëå.
Àññåìáëåð, ñâåðÿÿñü ñ ýòèì ôàéëîì è ñ íàøèìè óêàçàíèÿìè, ïðåîáðàçóåò êàæäîå èñïîëüçîâàíèå òàêîãî ìàêðîñà âî ôðàãìåíòêîäà íà ÿçûêå àññåìáëåðà è ñàì æå ýòè ôðàãìåíòû çàòåì îòòðàíñëèðóåò.Ïîýòîìó â íàøåé ïðîãðàììå áóäåò î÷åíü ìàëî ìíåìîíèê, îáîçíà÷àþùèõñîáñòâåííî ìàøèííûå êîìàíäû; â îñíîâíîì òåêñò ïðîãðàììû áóäåò ñîñòîÿòü èç äèðåêòèâ. Èòàê, ïèøåì òåêñò ïðîãðàììû:%include "stud_io.inc"global _startsection .text_start: movagain: PRINTPUTCHARinccmpjlFINISHeax, 0"Hello"10eaxeax, 5againÏîïðîáóåì òåïåðü êîå-÷òî îáúÿñíèòü. Ïåðâàÿ ñòðî÷êà ïðîãðàììû ñîäåðæèò äèðåêòèâó %include; ýòà äèðåêòèâà ïðåäïèñûâàåò àññåìáëåðó âñòàâèòü íà ìåñòî ñàìîé äèðåêòèâû âñ¼ ñîäåðæèìîå íåêîòîðîãî ôàéëà, âäàííîì ñëó÷àå ôàéëà stud_io.inc.
Ýòîò ôàéë òàêæå íàïèñàí íà ÿçûêå àññåìáëåðà è ñîäåðæèò îïèñàíèÿ ìàêðîñîâ PRINT, PUTCHAR è FINISH,êîòîðûå ìû áóäåì èñïîëüçîâàòü äëÿ ïå÷àòè ñòðîêè, äëÿ ïåðåõîäà íà ñëåäóþùóþ ñòðîêó íà ýêðàíå, à òàêæå äëÿ çàâåðøåíèÿ ïðîãðàììû. Òàêèìîáðàçîì, óâèäåâ äèðåêòèâó %include, àññåìáëåð ïðî÷èòàåò ôàéë ñ îïèñàíèÿìè ìàêðîñîâ, â ðåçóëüòàòå ÷åãî ìû ñìîæåì èõ èñïîëüçîâàòü.Âàæíî îòìåòèòü, ÷òî äèðåêòèâà %include îáÿçàòåëüíî äîëæíà ñòîÿòü â òåêñòå ïðîãðàììû ðàíüøå, ÷åì òàì âñòðåòÿòñÿ èìåíà ìàêðîñîâ.Àññåìáëåð ïðîñìàòðèâàåò íàø òåêñò ñâåðõó âíèç. Èçíà÷àëüíî îí íè÷åãîíå çíàåò î ìàêðîñàõ è íå ñìîæåò èõ îáðàáîòàòü, åñëè åìó î íèõ íå ñîîáùèòü.
Ïðîñìîòðåâ ôàéë, ñîäåðæàùèé îïèñàíèÿ ìàêðîñîâ, àññåìáëåðçàïîìèíàåò ýòè îïèñàíèÿ è ïðîäîëæàåò èõ ïîìíèòü äî îêîí÷àíèÿ òðàíñëÿöèè, òàê ÷òî ìû ìîæåì èõ èñïîëüçîâàòü â ïðîãðàììå íî íå ðàíüøå,÷åì î íèõ óçíàåò àññåìáëåð. Èìåííî ïîýòîìó ìû ïîñòàâèëè äèðåêòèâó%include â ñàìîå íà÷àëî ïðîãðàììû: òåïåðü ìàêðîñû ìîæíî èñïîëüçîâàòü âî âñ¼ì å¼ òåêñòå.îïåðàöèîííîé ñèñòåìîé, îíà æå ïðåäîñòàâëÿåò íàøåé çàäà÷å àáñòðàêòíûå ¾ñòàíäàðòíûå ïîòîêè ââîäà-âûâîäà¿.25Ïîñëå äèðåêòèâû %include ìû âèäèì ñòðîêó ñî ñëîâîì global; ýòîòîæå äèðåêòèâà, íî ê íåé ìû âåðí¼ìñÿ ÷óòü ïîäçíåå.Ñëåäóþùàÿ ñòðîêà ïðîãðàììû ñîäåðæèò äèðåêòèâó section. Èñïîëíÿåìûé ôàéë â ÎÑ Unix óñòðîåí òàê, ÷òî â í¼ì ìàøèííûå êîìàíäû õðàíÿòñÿ â îäíîì ìåñòå, à èíèöèàëèçèðîâàííûå (ò.
å. òàêèå, êîòîðûì ïðÿìîâ ïðîãðàììå çàäà¼òñÿ íà÷àëüíîå çíà÷åíèå) äàííûå â äðóãîì, è, íàêîíåö, â òðåòüåì ìåñòå ñîäåðæèòñÿ èíôîðìàöèÿ î òîì, ñêîëüêî ïðîãðàììåïîòðåáóåòñÿ ïàìÿòè ïîä íåèíèöèàëèçèðîâàííûå äàííûå.  ñâÿçè ñ ýòèììû äîëæíû íàø èñïîëíÿåìûé êîä ïîìåñòèòü â îäíó ¾ñåêöèþ¿, îïèñàíèÿîáëàñòåé ïàìÿòè ñ çàäàííûì íà÷àëüíûì çíà÷åíèåì â äðóãóþ ¾ñåêöèþ¿, îïèñàíèÿ îáëàñòåé ïàìÿòè áåç çàäàíèÿ íà÷àëüíûõ çíà÷åíèé âòðåòüþ ¾ñåêöèþ¿.
Ñîîòâåòñòâóþùèå ñåêöèè íàçûâàþòñÿ .text, .data è.bss.  íàøåé ïðîñòîé ïðîãðàììå ìû îáõîäèìñÿ òîëüêî ñåêöèåé .text,è ðàññìàòðèâàåìàÿ äèðåêòèâà êàê ðàç è ïðèêàçûâàåò àññåìáëåðó ïðèñòóïèòü ê ôîðìèðîâàíèþ ýòîé ñåêöèè.  áóäóùåì ïðè ðàññìîòðåíèè áîëååñëîæíûõ ïðîãðàìì íàì ïðèä¼òñÿ âñòðåòèòüñÿ ñî âñåìè òðåìÿ ñåêöèÿìè.Äàëåå â ïðîãðàììå ìû âèäèì ñòðîêó_start: moveax, 0Êàê ìû óæå çíàåì, ñëîâîì mov îáîçíà÷àåòñÿ êîìàíäà, çàñòàâëÿþùàÿïðîöåññîð ïåðåñëàòü íåêîòîðûå äàííûå èç îäíîãî ìåñòà â äðóãîå; äëÿêîìàíäû mov ìû âñåãäà äîëæíû óêàçûâàòü äâà îïåðàíäà, ïðè÷¼ì ïåðâûé èç íèõ áóäåò çàäàâàòü òî ìåñòî, êóäà ñëåäóåò ñêîïèðîâàòü äàííûå,à âòîðîé îïåðàíä óêàçûâàåò, êàêèå äàííûå ñëåäóåò òóäà ñêîïèðîâàòü.
Âäàííîì êîíêðåòíîì ñëó÷àå êîìàíäà òðåáóåò çàíåñòè ÷èñëî 0 (íîëü) â ðåãèñòð EAX17 . Çíà÷åíèå, õðàíèìîå â ðåãèñòðå EAX, ìû áóäåì èñïîëüçîâàòüâ êà÷åñòâå ñ÷¼ò÷èêà öèêëà, òî åñòü îíî áóäåò îçíà÷àòü, ñêîëüêî ðàç ìûóæå íàïå÷àòàëè ñëîâî ¾Hello¿; ÿñíî, ÷òî â íà÷àëå ýòîò ñ÷¼ò÷èê äîëæåíáûòü ðàâåí íóëþ, ïîñêîëüêó ìû ïîêà íå íàïå÷àòàëè íè÷åãî.Èòàê, ðàññìàòðèâàåìàÿ ñòðîêà îçíà÷àåò ïðèêàç ïðîöåññîðó çàíåñòèíîëü â EAX; íî ÷òî çà çàãàäî÷íîå ¾_start:¿ â íà÷àëå ñòðîêè?Ñëîâî _start (çíàê ïîä÷¼ðêèâàíèÿ â äàííîì ñëó÷àå ÿâëÿåòñÿ ÷àñòüþñëîâà) ïðåäñòàâëÿåò ñîáîé ïðèìåð òàê íàçûâàåìûõ ìåòîê .