А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 8
Текст из файла (страница 8)
Ïîïðîáóåìñíà÷àëà îáúÿñíèòü, ÷òî òàêîå ñîáîé ïðåäñòàâëÿþò ýòè ìåòêè ¾âîîáùå¿,à ïîòîì ðàññêàæåì, çà÷åì íóæíà ìåòêà â äàííîì êîíêðåòíîì ñëó÷àå.17 ×èòàòåëü, óæå èìåþùèé îïûò ïðîãðàììèðîâàíèÿ íà ÿçûêå àññåìáëåðà, ìîæåòçàìåòèòü, ÷òî ¾ïðàâèëüíåå¿ ýòî ñäåëàòü ñîâñåì äðóãîé êîìàíäîé: xor eax, eax, ïîñêîëüêó ýòî ïîçâîëÿåò äîñòè÷ü òîãî æå ýôôåêòà áûñòðåå è ñ ìåíüøèìè çàòðàòàìèïàìÿòè; îäíàêî äëÿ ïðîñòåéøåãî ó÷åáíîãî ïðèìåðà òàêîé òðþê ñëèøêîì ñëîæåí èòðåáóåò íåîïðàâäàííî äëèííûõ ïîÿñíåíèé. Âïðî÷åì, ïîçæå ìû ê ýòîìó âîïðîñó âåðí¼ìñÿ è îáÿçàòåëüíî ðàññìîòðèì ýòîò è äðóãèå ïîäîáíûå òðþêè.26Êîìàíäó mov eax,0 àññåìáëåð ïðåîáðàçóåò â íåêèé ìàøèííûé êîä18 ,êîòîðûé âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû áóäåò íàõîäèòüñÿ â êàêîé-òîîáëàñòè îïåðàòèâíîé ïàìÿòè (â äàííîì ñëó÷àå â ïÿòè ÿ÷åéêàõ, èäóùèõïîäðÿä).  íåêîòîðûõ ñëó÷àÿõ íàì íóæíî çíàòü, êàêîé àäðåñ áóäåò èìåòüòà èëè èíàÿ îáëàñòü ïàìÿòè; åñëè ãîâîðèòü î êîìàíäàõ, òî çíàòü àäðåñíàì ìîæåò ïîòðåáîâàòüñÿ, íàïðèìåð, ÷òîáû â êàêîé-òî ìîìåíò çàñòàâèòüïðîöåññîð ïðîèçâåñòè â ýòî ìåñòî ïðîãðàììû óñëîâíûé èëè áåçóñëîâíûéïåðåõîä (ïðî ïåðåõîäû ìû óæå ãîâîðèëè, ñì.
ñòð. 11).Êîíå÷íî, ìû ìîæåì èñïîëüçîâàòü îïåðàòèâíóþ ïàìÿòü è äëÿ õðàíåíèÿ äàííûõ, à íå òîëüêî êîìàíä. Îáëàñòè ïàìÿòè, ïðåäíàçíà÷åííûåäëÿ äàííûõ, ìû îáû÷íî íàçûâàåì ïåðåìåííûìè , è äà¼ì èì èìåíà ïî÷òè òàê æå, êàê è â ïðèâû÷íûõ íàì ÿçûêàõ ïðîãðàììèðîâàíèÿ âûñîêîãî óðîâíÿ. Åñòåñòâåííî, íàì òðåáóåòñÿ çíàòü, êàêîé àäðåñ èìååò íà÷àëîîáëàñòè ïàìÿòè, îòâåä¼ííîé ïîä ïåðåìåííóþ. Àäðåñ, êàê ìû óæå ãîâîðèëè, çàäà¼òñÿ19 ÷èñëîì èç âîñüìè øåñòíàäöàòåðè÷íûõ öèôð, íàïðèìåð,18b4a0f0. Çàïîìèíàòü òàêèå ÷èñëà íàì íåóäîáíî, ê òîìó æå íà ìîìåíòíàïèñàíèÿ ïðîãðàììû ìû åù¼ íå çíàåì, â êàêîì èìåííî ìåñòå ïàìÿòèâ èòîãå îêàæåòñÿ ðàçìåùåíà òà èëè èíàÿ êîìàíäà èëè ïåðåìåííàÿ. Èçäåñü íàì íà ïîìîùü êàê ðàç è ïðèõîäÿò ìåòêè. Ìåòêà ýòî ââîäè-ìîå ïðîãðàììèñòîì ñëîâî (èäåíòèôèêàòîð), ñ êîòîðûì àññåìáëåð àññîöèèðóåò íåêîòîðîå ÷èñëî, ÷àùå âñåãî àäðåñ â ïàìÿòè.
 äàííîì ñëó÷àå _start êàê ðàç è åñòü òàêàÿ ìåòêà. Åñëè àññåìáëåðâèäèò ìåòêó ïåðåä êîìàíäîé (èëè, êàê ìû óâèäèì ïîçæå, äèðåêòèâîé,âûäåëÿþùåé ïàìÿòü ïîä ïåðåìåííóþ), îí âîñïðèíèìàåò ýòî êàê óêàçàíèå çàâåñòè â ñâîèõ âíóòðåííèõ òàáëèöàõ íîâóþ ìåòêó è ñâÿçàòü ñ íåéñîîòâåòñòâóþùèé àäðåñ, åñëè æå ìåòêà âñòðå÷àåòñÿ â ïàðàìåòðàõ êîìàíäû, òî àññåìáëåð ¾âñïîìèíàåò¿, êàêîé èìåííî àäðåñ (èëè ïðîñòî ÷èñëî)ñâÿçàíî ñ äàííîé ìåòêîé è ïîäñòàâëÿåò ýòîò àäðåñ (÷èñëî) âìåñòî ìåòêèâ êîìàíäó.
Òàêèì îáðàçîì, ñ ìåòêîé _start â íàøåé ïðîãðàììå áóäåòñâÿçàíî ÷èñëî, ïðåäñòàâëÿþùåå ñîáîé àäðåñ ÿ÷åéêè, íà÷èíàÿ ñ êîòîðîéâ îïåðàòèâíîé ïàìÿòè áóäåò ðàçìåù¼í ìàøèííûé êîä, ñîîòâåòñòâóþùèéêîìàíäå mov eax,0 (êîä b8 00 00 00 00).Âàæíî ïîíèìàòü, ÷òî ìåòêè ñóùåñòâóþò òîëüêî â ïàìÿòè ñàìîãî àññåìáëåðà è òîëüêî âî âðåìÿ òðàíñëÿöèè ïðîãðàììû. Ãîòîâàÿ ê èñïîëíåíèþ ïðîãðàììà íà ìàøèííîì êîäå íå áóäåò ñîäåðæàòü íèêàêèõ ìåòîê, àòîëüêî ïîäñòàâëåííûå âìåñòî íèõ àäðåñà.18 Îòìåòèì äëÿ íàãëÿäíîñòè, ÷òî ìàøèííûé êîä ýòîé êîìàíäû ñîñòîèò èç ïÿòèáàéòîâ: b8 00 00 00 00, ïåðâûé èç êîòîðûõ çàäà¼ò ñîáñòâåííî äåéñòâèå ¾ïîìåñòèòüçàäàííîå ÷èñëî â ðåãèñòð¿, à òàêæå è íîìåð ðåãèñòðà EAX. Îñòàëüíûå ÷åòûðå áàéòàçàäàþò (âñå âìåñòå) òî ÷èñëî, êîòîðîå äîëæíî áûòü ïîìåùåíî â ðåãèñòð; â äàííîìñëó÷àå ýòî ÷èñëî 0.19 Âî âñÿêîì ñëó÷àå, äëÿ òîãî ïðîöåññîðà è òîé ñèñòåìû, êîòîðûå ìû ðàññìàòðèâàåì.27Ïîñëå ìåòêè ìû ïîñòàâèëè ñèìâîë äâîåòî÷èÿ.
Èíòåðåñíî, ÷òî ìû ìîãëè áû åãî è íå ñòàâèòü. Íåêîòîðûå àññåìáëåðû îòëè÷àþò ìåòêè, ñíàáæåííûå äâîåòî÷èÿìè, îò ìåòîê áåç äâîåòî÷èé; íî íàø NASM ê òàêèìíå îòíîñèòñÿ. Èíà÷å ãîâîðÿ, ìû ñàìè ðåøàåì, ñòàâèòü äâîåòî÷èå ïîñëåìåòêè èëè íåò. Îáû÷íî ïðîãðàììèñòû ñòàâÿò äâîåòî÷èÿ ïîñëå ìåòîê, êîòîðûìè ïîìå÷åíû ìàøèííûå êîìàíäû (òî åñòü ïîñëå òàêèõ ìåòîê, êóäàìîæíî ïåðåäàòü óïðàâëåíèå), íî íå ñòàâÿò äâîåòî÷èÿ ïîñëå ìåòîê, ïîìå÷àþùèõ äàííûå â ïàìÿòè (ïåðåìåííûå). Ïîñêîëüêó ìåòêà _start êàêðàç è ïîìå÷àåò êîìàíäó, ïîñëå íå¼ ìû äâîåòî÷èå ðåøèëè ïîñòàâèòü.Îäíàêî âíèìàòåëüíûé ÷èòàòåëü ìîæåò îáðàòèòü âíèìàíèå, ÷òî íèêàêèõ ïåðåõîäîâ íà ìåòêó _start â íàøåé ïðîãðàììå íå äåëàåòñÿ. Çà÷åì æåîíà òîãäà íóæíà? Äåëî â òîì, ÷òî ñëîâî ¾_start¿ ýòî ñïåöèàëüíàÿ ìåòêà, êîòîðîé ïîìå÷àåòñÿ òî÷êà âõîäà â ïðîãðàììó , òî åñòü òî ìåñòîâ ïðîãðàììå, êóäà îïåðàöèîííàÿ ñèñòåìà äîëæíà ïåðåäàòü óïðàâëåíèåïîñëå çàãðóçêè ïðîãðàììû â îïåðàòèâíóþ ïàìÿòü; èíà÷å ãîâîðÿ, ìåòêà_start îáîçíà÷àåò òî ìåñòî, ñ êîòîðîãî íà÷í¼òñÿ âûïîëíåíèå ïðîãðàììû.Âåðí¼ìñÿ ê òåêñòó ïðîãðàììû è ðàññìîòðèì ñëåäóþùóþ ñòðî÷êó:again:PRINT"Hello"Êàê íåñëîæíî äîãàäàòüñÿ, ñëîâî again â íà÷àëå ñòðîêè ýòî åù¼ îäíàìåòêà.
Ñëîâî ¾again¿ ïî-àíãëèéñêè îçíà÷àåò ¾ñíîâà¿. Äåëî â òîì, ÷òî ñþäà íàì ïðèä¼òñÿ âåðíóòüñÿ åù¼ ÷åòûðå ðàçà, ÷òîáû â èòîãå ñëîâî Helloîêàçàëîñü íàïå÷àòàíî ïÿòü ðàç; îòñþäà è íàçâàíèå ìåòêè. Ñòîÿùåå äàëååâ ñòðîêå ñëîâî PRINT ÿâëÿåòñÿ èìåíåì ìàêðîñà , à ñòðîêà "Hello" ïàðàìåòðîì ýòîãî ìàêðîñà. Ñàì ìàêðîñ îïèñàí, êàê óæå ãîâîðèëîñü,â ôàéëå stud_io.inc. ¾Óâèäåâ¿ èìÿ ìàêðîñà è ïàðàìåòð, íàø àññåìáëåð ïîäñòàâèò âìåñòî íåãî öåëûé ðÿä êîìàíä è äèðåêòèâ, èñïîëíåíèåêîòîðûõ ïðèâåä¼ò â êîíå÷íîì èòîãå ê âûäà÷å íà ýêðàí ñòðîêè ¾Hello¿.Î÷åíü âàæíî ïîíèìàòü, ÷òî PRINT íå èìååò íèêàêîãî îòíîøåíèÿ êâîçìîæíîñòÿì öåíòðàëüíîãî ïðîöåññîðà.
Ìû óæå íåñêîëüêî ðàç óïîìèíàëè ýòîò ôàêò, íî òåì íå ìåíåå ïîâòîðèì åù¼ ðàç: PRINT ýòî íå èìÿêàêîé-ëèáî êîìàíäû ïðîöåññîðà, ïðîöåññîð êàê òàêîâîé íå óìååò íè÷åãîïå÷àòàòü. Ðàññìàòðèâàåìàÿ íàìè ñòðî÷êà ïðîãðàììû ïðåäñòàâëÿåò ñîáîéíå êîìàíäó, à äèðåêòèâó, òàêæå íàçûâàåìóþ ìàêðîâûçîâîì . Ïîâèíóÿñü ýòîé äèðåêòèâå, àññåìáëåð ñôîðìèðóåò ôðàãìåíò òåêñòà íà ÿçûêåàññåìáëåðà (îòìåòèì äëÿ íàãëÿäíîñòè, ÷òî â äàííîì ñëó÷àå ýòîò ôðàãìåíò áóäåò ñîñòîÿòü èç 23 ñòðîê â ñëó÷àå ïðèìåíåíèÿ ÎÑ Linux è èç15 ñòðî÷åê äëÿ ÎÑ FreeBSD) è ñàì æå îòòðàíñëèðóåò ýòîò ôðàãìåíò,ïîëó÷èâ ïîñëåäîâàòåëüíîñòü ìàøèííûõ èíñòðóêöèé. Ýòè èíñòðóêöèè áóäóò ñîäåðæàòü, â ÷èñëå ïðî÷åãî, è îáðàùåíèå ê îïåðàöèîííîé ñèñòåìå çàóñëóãîé âûâîäà äàííûõ (ñèñòåìíûé âûçîâ write).
Íàáîð ìàêðîñîâ, âêëþ÷àþùèé â ñåáÿ è ìàêðîñ PRINT, ââåä¼í äëÿ óäîáñòâà ðàáîòû íà ïåðâûõïîðàõ, ïîêà ìû åù¼ íå çíàåì, êàê îáðàùàòüñÿ ê îïåðàöèîííîé ñèñòåìå.28Ïîçæå ìû óçíàåì ýòî, è òîãäà ìàêðîñû, îïèñàííûå â ôàéëå stud_io.inc,ñòàíóò íàì íå íóæíû; áîëåå òîãî, ìû è ñàìè íàó÷èìñÿ ñîçäàâàòü òàêèåìàêðîñû.Âåðí¼ìñÿ ê òåêñòó íàøåãî ïðèìåðà. Ñëåäóþùàÿ ñòðî÷êà èìååò âèäPUTCHAR 10Ýòî òîæå âûçîâ ìàêðîñà, íàçûâàåìîãî PUTCHAR è ïðåäíàçíà÷åííîãî äëÿâûâîäà íà ïå÷àòü îäíîãî ñèìâîëà.  äàííîì ñëó÷àå ìû èñïîëüçóåì åãîäëÿ âûâîäà ñèìâîëà ñ êîäîì 10; ýòî ñïåöèàëüíûé ñèìâîë, îáîçíà÷àþùèéïåðåâîä ñòðîêè , òî åñòü ïðè âûâîäå ýòîãî ñèìâîëà íà ïå÷àòü êóðñîð íàýêðàíå ïåðåéä¼ò íà ñëåäóþùóþ ñòðîêó. Îáðàòèòå âíèìàíèå, ÷òî â ýòîéè ïîñëåäóþùèõ ñòðîêàõ ïðèñóòñòâóþò òîëüêî êîìàíäû è ìàêðîâûçîâû,à ìåòîê íåò.
Îíè íàì íå íóæíû, ïîñêîëüêó íè íà îäíó èç ïîñëåäóþùèõêîìàíä ìû íå ñîáèðàåìñÿ äåëàòü ïåðåõîäû, è, çíà÷èò, íàì íå íóæíà èíôîðìàöèÿ îá àäðåñàõ â ïàìÿòè, ãäå áóäóò ðàñïîëàãàòüñÿ ýòè êîìàíäû.Ñëåäóþùàÿ ñòðîêà â ïðîãðàììå òàêàÿ:inceaxÇäåñü ìû âèäèì ìàøèííóþ êîìàíäó inc, îçíà÷àþùóþ ïðèêàç óâåëè÷èòüçàäàííûé ðåãèñòð íà 1.  äàííîì ñëó÷àå óâåëè÷èâàåòñÿ ðåãèñòð EAX. Íàïîìíèì, ÷òî â ðåãèñòðå EAX ìû óñëîâèëèñü õðàíèòü èíôîðìàöèþ î òîì,ñêîëüêî ðàç óæå íàïå÷àòàíî ñëîâî ¾Hello¿. Ïîñêîëüêó âûïîëíåíèå äâóõïðåäûäóùèõ ñòðî÷åê ïðîãðàììû, ñîäåðæàùèõ âûçîâû ìàêðîñîâ PRINTè PUTCHAR, ïðèâåëî â êîíå÷íîì ñ÷¼òå êàê ðàç ê ïå÷àòè ñëîâà ¾Hello¿,ñëåäóåò îòðàçèòü ýòîò ôàêò â ðåãèñòðå, ÷òî ìû è äåëàåì.
Îòìåòèì, ÷òîìàøèííûé êîä ýòîé êîìàíäû îêàçûâàåòñÿ î÷åíü êîðîòêèì âñåãî îäèíáàéò (øåñòíàäöàòåðè÷íîå 40, äåñÿòè÷íîå 64).Äàëåå â íàøåé ïðîãðàììå èä¼ò êîìàíäà ñðàâíåíèÿ:cmpeax, 5Ìàøèííàÿ êîìàíäà ñðàâíåíèÿ äâóõ öåëûõ ÷èñåë îáîçíà÷àåòñÿ ìíåìîíèêîé cmp îò àíãëèéñêîãî ¾to compare¿ ñðàâíèâàòü.  äàííîì ñëó÷àåñðàâíèâàþòñÿ ñîäåðæèìîå ðåãèñòðà EAX è ÷èñëî 5. Ðåçóëüòàòû ñðàâíåíèÿ çàïèñûâàþòñÿ â ñïåöèàëüíûé ðåãèñòð ïðîöåññîðà, íàçûâàåìûé ðåãèñòðîì ôëàãîâ .
Ýòî ïîçâîëÿåò, íàïðèìåð, ïðîèçâåñòè óñëîâíûé ïåðåõîä â çàâèñèìîñòè îò ðåçóëüòàòîâ ïðåäøåñòâóþùåãî ñðàâíåíèÿ, ÷òî ìûâ ñëåäóþùåé ñòðî÷êå ïðîãðàììû è äåëàåì:jlagainÇäåñü jl (îò ñëîâ ¾Jump if Lower¿) ýòî ìíåìîíèêà äëÿ ìàøèííîé êîìàíäû óñëîâíîãî ïåðåõîäà, êîòîðûé âûïîëíÿåòñÿ â ñëó÷àå, åñëè ïðåäøåñòâóþùåå ñðàâíåíèå äàëî ðåçóëüòàò ¾ïåðâûé îïåðàíä ìåíüøå âòîðîãî¿,29òî åñòü, â íàøåì ñëó÷àå, åñëè ÷èñëî â ðåãèñòðå EAX îêàçàëîñü ìåíüøå,÷åì 5.  òåðìèíàõ íàøåé çàäà÷è ýòî îçíà÷àåò, ÷òî ñëîâî ¾Hello¿ áûëîíàïå÷àòàíî ìåíüøå ïÿòè ðàç è, ñòàëî áûòü, íåîáõîäèìî ïðîäîëæàòü åãîïå÷àòàòü, ÷òî è äåëàåòñÿ ïåðåõîäîì (ïåðåäà÷åé óïðàâëåíèÿ ) íà êîìàíäó, ïîìå÷åííóþ ìåòêîé again.Åñëè ðåçóëüòàò ñðàâíåíèÿ áûë ëþáûì äðóãèì, êðîìå ¾ìåíüøå¿, êîìàíäà jl íå ïðîèçâåä¼ò íèêàêèõ äåéñòâèé, è ïðîöåññîð, òàêèì îáðàçîì,ïåðåéä¼ò ê âûïîëíåíèþ ñëåäóþùåé ïî ïîðÿäêó êîìàíäû. Ýòî ïðîèçîéä¼ò â ñëó÷àå, åñëè ñëîâî ¾Hello¿ óæå áûëî íàïå÷àòàíî 5 ðàç, òàê ÷òî öèêëïîðà çàêàí÷èâàòü.