А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 18
Текст из файла (страница 18)
Ñòåê, ïîäïðîãðàììû, ðåêóðñèÿ 2.6.1. Ïîíÿòèå ñòåêà è åãî ïðåäíàçíà÷åíèåнаправление роста стеканаправление увеличения адресовÊàê èçâåñòíî, ïîä ñòåêîì â ïðîãðàììèðîâàíèè ïîäðàçóìåâàþò ñòðóêòóðó äàííûõ, ïîñòðîåííóþ ïî ïðèíöèïó¾ïîñëåäíèé âîøåë ïåðâûé âûøåë¿свободнаяуказатель(àíãë. last in rst out, LIFO), ò. å. òàêîéпамятьстекаîáúåêò, íàä êîòîðûì îïðåäåëåíû îïåðàöèè ¾äîáàâèòü ýëåìåíò¿ è ¾èçâëå÷ü ýëåвершинаìåíò¿, ïðè÷¼ì ýëåìåíòû, êîòîðûå áûëèзанятаяäîáàâëåíû, èçâëåêàþòñÿ â îáðàòíîì ïîпамятьðÿäêå. ïðèìåíåíèè ê íèçêîóðîâíåâîìóïðîãðàììèðîâàíèþ ïîíÿòèå ñòåêà ñóùåñòâåííî óæå: çäåñü ïîä ñòåêîì ïîíèìàåòмаксимальный адресñÿ íåïðåðûâíàÿ îáëàñòü ïàìÿòè, äëÿ êîòîðîé â ñïåöèàëüíîì ðåãèñòðå õðàíèòñÿÐèñ.
2.4. Ñòåêàäðåñ âåðøèíû ñòåêà , ïðè÷¼ì ïàìÿòüâ ðàññìàòðèâàåìîé îáëàñòè âûøå âåðøèíû (ò. å. ñ àäðåñàìè, ìåíüøèìè àäðåñà âåðøèíû) ñ÷èòàåòñÿ ñâîáîäíîé, à ïàìÿòü îò âåðøèíû äî êîíöà îáëàñòè (äî ñòàðøèõ àäðåñîâ), âêëþ÷àÿ è ñàìó âåðøèíó, ñ÷èòàåòñÿçàíÿòîé ; ðåãèñòð, õðàíÿùèé àäðåñ âåðøèíû, íàçûâàåòñÿ óêàçàòåëåìñòåêà (ñì. ðèñ. 2.4). Îïåðàöèÿ äîáàâëåíèÿ â ñòåê íåêîòîðîãî çíà÷åíèÿóìåíüøàåò àäðåñ âåðøèíû, ñäâèãàÿ òåì ñàìûì âåðøèíó ââåðõ (òî åñòü âíàïðàâëåíèè ìåíüøèõ àäðåñîâ) è â íîâóþ âåðøèíó çàïèñûâàåò äîáàâëÿåìîå çíà÷åíèå; îïåðàöèÿ èçâëå÷åíèÿ ñ÷èòûâàåò çíà÷åíèå ñ âåðøèíû ñòåêàè ñäâèãàåò âåðøèíó âíèç, óâåëè÷èâàÿ å¼ àäðåñ.Ñòåê ìîæíî èñïîëüçîâàòü, íàïðèìåð, äëÿ âðåìåííîãî õðàíåíèÿ çíà÷åíèé ðåãèñòðîâ; åñëè íåêîòîðûé ðåãèñòð õðàíèò âàæíîå äëÿ íàñ çíà÷åíèå,à íàì ïðè ýòîì íóæíî âðåìåííî çàäåéñòâîâàòü ýòîò ðåãèñòð äëÿ õðàíåíèÿ äðóãîãî çíà÷åíèÿ, òî ñàìûé ïðîñòîé ñïîñîá âûéòè èç ïîëîæåíèÿ ýòî ñîõðàíèòü çíà÷åíèå ðåãèñòðà â ñòåêå, çàòåì èñïîëüçîâàòü ðåãèñòð ïîä72äðóãèå íóæäû, è, íàêîíåö, âîññòàíîâèòü èñõîäíîå çíà÷åíèå ðåãèñòðà ïóò¼ì èçâëå÷åíèÿ ýòîãî çíà÷åíèÿ èç ñòåêà îáðàòíî â ðåãèñòð.
Íî ãîðàçäîáîëåå âàæíî äðóãîå: ñòåê èñïîëüçóåòñÿ ïðè âûçîâàõ ïîäïðîãðàììäëÿ õðàíåíèÿ àäðåñîâ âîçâðàòà, äëÿ ïåðåäà÷è ôàêòè÷åñêèõ ïàðàìåòðîâ â ïîäïðîãðàììû è äëÿ õðàíåíèÿ ëîêàëüíûõ ïåðåìåííûõ. Èìåííî èñïîëüçîâàíèå ñòåêà ïîçâîëÿåò ðåàëèçîâàòü ìåõàíèçì ðå-êóðñèè, ïðè êîòîðîì ïîäïðîãðàììà ìîæåò ïðÿìî èëè êîñâåííî âûçâàòüñàìà ñåáÿ. 2.6.2. Îðãàíèçàöèÿ ñòåêà â ïðîöåññîðå i386Áîëüøèíñòâî ñóùåñòâóþùèõ ïðîöåññîðîâ ïîääåðæèâàþò ðàáîòó ñîñòåêîì íà óðîâíå ìàøèííûõ êîìàíä, è i386 â ýòîì ïëàíå íå èñêëþ÷åíèå. Êîìàíäû ðàáîòû ñî ñòåêîì ïîçâîëÿþò çàíîñèòü â ñòåê è èçâëåêàòüèç íåãî äâóõáàéòíûå ¾ñëîâà¿ è ÷åòûð¼õáàéòíûå ¾äâîéíûå ñëîâà¿; îòäåëüíûå áàéòû çàïèñûâàòü â ñòåê íåëüçÿ, òàê ÷òî àäðåñ âåðøèíû ñòåêàâñåãäà îñòà¼òñÿ ÷¼òíûì.Êàê óæå ãîâîðèëîñü (ñì.
ñòð. 35), ðåãèñòð ESP, ôîðìàëüíî îòíîñÿùèéñÿ ê ãðóïïå ðåãèñòðîâ îáùåãî íàçíà÷åíèÿ, òåì íå ìåíåå ïðàêòè÷åñêèíèêîãäà íå èñïîëüçóåòñÿ íè â êàêîé èíîé ðîëè, êðîìå ðîëè óêàçàòåëÿ ñòåêà ; íàçâàíèå ýòîãî ðåãèñòðà êàê ðàç è îçíà÷àåò ¾stack pointer¿.Ñ÷èòàåòñÿ, ÷òî àäðåñ, ñîäåðæàùèéñÿ â ESP, óêàçûâàåò íà âåðøèíó ñòåêà, òî åñòü íà òó îáëàñòü ïàìÿòè, ãäå õðàíèòñÿ ïîñëåäíåå çàíåñ¼ííîå âñòåê çíà÷åíèå. Ñòåê ¾ðàñò¼ò¿ â ñòîðîíó óìåíüøåíèÿ àäðåñîâ, òî åñòü ïðèçàíåñåíèè â ñòåê íîâîãî çíà÷åíèÿ ESP óìåíüøàåòñÿ, ïðè èçâëå÷åíèè çíà÷åíèÿ óâåëè÷èâàåòñÿ.Çàíåñåíèå çíà÷åíèÿ â ñòåê ïðîèçâîäèòñÿ êîìàíäîé push, èìåþùåéîäèí îïåðàíä.
Ýòîò îïåðàíä ìîæåò áûòü íåïîñðåäñòâåííûì, ðåãèñòðîâûì èëè òèïà ¾ïàìÿòü¿ è èìåòü ðàçìåð word èëè dword (åñëè îïåðàíä íåðåãèñòðîâûé, òî ðàçìåð íåîáõîäèìî óêàçàòü ÿâíî). Äëÿ èçâëå÷åíèÿ çíà÷åíèÿ èç ñòåêà èñïîëüçóåòñÿ êîìàíäà pop, îïåðàíä êîòîðîé ìîæåò áûòüðåãèñòðîâûì èëè òèïà ¾ïàìÿòü¿; åñòåñòâåííî, îïåðàíä äîëæåí èìåòü ðàçìåð ¾ñëîâî¿ èëè ¾äâîéíîå ñëîâî¿.Êîìàíäû push è pop ñîâìåùàþò êîïèðîâàíèå äàííûõ (íà âåðøèíóñòåêà èëè ñ íå¼) ñî ñäâèãîì ñàìîé âåðøèíû, òî åñòü èçìåíåíèåì çíà÷åíèÿ ðåãèñòðà ESP. Ïîíÿòíî, ÷òî ìîæíî, âîîáùå ãîâîðÿ, îáðàòèòüñÿ êçíà÷åíèþ íà âåðøèíå ñòåêà, íå èçâëåêàÿ åãî èç ñòåêà ïðèìåíèâ (âëþáîé êîìàíäå, äîïóñêàþùåé îïåðàíä òèïà ¾ïàìÿòü¿) îïåðàíä [esp].Íàïðèìåð, êîìàíäàmov eax, [esp]ñêîïèðóåò ÷åòûð¼õáàéòíîå çíà÷åíèå ñ âåðøèíû ñòåêà â ðåãèñòð EAX.73Êàê ãîâîðèëîñü âûøå, ñòåê î÷åíü óäîáíî èñïîëüçîâàòü äëÿ âðåìåííîãî õðàíåíèÿ çíà÷åíèé èç ðåãèñòðîâ:push eax; çàïîìèíàåì eax; ...
èñïîëüçóåì eax ïîä ïîñòîðîííèå íóæäû ...pop eax; âîññòàíàâëèâàåì eaxÐàññìîòðèì áîëåå ñëîæíûé ïðèìåð. Ïóñòü ðåãèñòð ESI ñîäåðæèò àäðåñ íåêîòîðîé ñòðîêè ñèìâîëîâ â ïàìÿòè, ïðè÷¼ì èçâåñòíî, ÷òî ñòðîêàçàêàí÷èâàåòñÿ áàéòîì ñî çíà÷åíèåì 0 (íî íåèçâåñòíî, êàêîâà äëèíà ñòðîêè) è íàì íåîáõîäèìî ¾îáðàòèòü¿ ýòó ñòðîêó, òî åñòü çàïèñàòü ñîñòàâëÿþùèå å¼ ñèìâîëû â îáðàòíîì ïîðÿäêå â òîì æå ìåñòå ïàìÿòè; íóëåâîéáàéò, èãðàþùèé ðîëü îãðàíè÷èòåëÿ, åñòåñòâåííî, îñòà¼òñÿ ïðè ýòîì íàìåñòå è íèêóäà íå êîïèðóåòñÿ.
Îäèí èç ñïîñîáîâ ñäåëàòü ýòî ïîñëåäîâàòåëüíî çàïèñàòü êîäû ñèìâîëîâ â ñòåê, à çàòåì ñíîâà ïðîéòè ñòðîêóñ íà÷àëà â êîíåö, èçâëåêàÿ èç ñòåêà ñèìâîëû è çàïèñûâàÿ èõ â ÿ÷åéêè,ñîñòàâëÿþùèå ñòðîêó.Ïîñêîëüêó çàïèñûâàòü â ñòåê îäíîáàéòîâûå çíà÷åíèÿ íåëüçÿ, ìû áóäåì çàïèñûâàòü çíà÷åíèÿ äâóõáàéòîâûå, ïðè÷¼ì ñòàðøèé áàéò ïðîñòîíå áóäåì èñïîëüçîâàòü. Êîíå÷íî, ìîæíî ñäåëàòü âñ¼ áîëåå ðàöèîíàëüíî,íî íàì â äàííîì ñëó÷àå âàæíåå íàãëÿäíîñòü íàøåé èëëþñòðàöèè. Äëÿïðîìåæóòî÷íîãî õðàíåíèÿ áóäåì èñïîëüçîâàòü ðåãèñòð BX, ïðè÷¼ì òîëüêî åãî ìëàäøèé áàéò (BL) áóäåò ñîäåðæàòü ïîëåçíóþ èíôîðìàöèþ, íîçàïèñûâàòü â ñòåê è èçâëåêàòü èç ñòåêà ìû áóäåì âåñü BX öåëèêîì. Çàäà÷à áóäåò ðåøåíà â äâà öèêëà. Ïåðåä ïåðâûì öèêëîì ìû çàíåñ¼ì íîëüâ ðåãèñòð ECX, ïîòîì íà êàæäîì øàãå áóäåì èçâëåêàòü áàéò ïî àäðåñó[esi+ecx] è ïîìåùàòü ýòîò áàéò (â ñîñòàâå ñëîâà) â ñòåê, à ECX óâåëè÷èâàòü íà åäèíèöó, è òàê äî òåõ ïîð, ïîêà î÷åðåäíîé èçâëå÷¼ííûé áàéòíå îêàæåòñÿ íóëåâûì, ÷òî ïî óñëîâèÿì çàäà÷è îçíà÷àåò êîíåö ñòðîêè.
Âèòîãå âñå íåíóëåâûå ýëåìåíòû ñòðîêè îêàæóòñÿ â ñòåêå, à â ðåãèñòðå ECXáóäåò äëèíà ñòðîêè.Ïîñêîëüêó äëÿ âòîðîãî öèêëà çàðàíåå èçâåñòíî êîëè÷åñòâî åãî èòåðàöèé (äëèíà ñòðîêè) è îíî óæå ñîäåðæèòñÿ â ECX, ìû îðãàíèçóåì ýòîòöèêë ñ ïîìîùüþ êîìàíäû loop. Ïåðåä âõîäîì â öèêë ìû ïðîâåðèì, íåïóñòà ëè ñòðîêà (òî åñòü íå ðàâåí ëè ECX íóëþ), è åñëè ñòðîêà áûëà ïóñòà, ñðàçó æå ïåðåéä¼ì â êîíåö íàøåãî ôðàãìåíòà.
Ïîñêîëüêó çíà÷åíèå âECX áóäåò óìåíüøàòüñÿ, à ñòðîêó íàì íóæíî ïðîéòè â ïðÿìîì íàïðàâëåíèè íàðÿäó ñ ECX ìû âîñïîëüçóåìñÿ ðåãèñòðîì EDI, êîòîðûé â íà÷àëåóñòàíîâèì ðàâíûì ESI (òî åñòü óêàçûâàþùèì íà íà÷àëî ñòðîêè), à íàêàæäîé èòåðàöèè áóäåì åãî ñäâèãàòü. Èòàê, ïèøåì:lp:xor ebx, ebx; îáíóëÿåì ebxxor ecx, ecx; îáíóëÿåì ecxmov bl, [esi+ecx] ; î÷åðåäíîé áàéò èç ñòðîêè74cmp bl, 0je lpquitpush bxinc ecxjmp lplpquit: jecxz donemov edi, esilp2:pop bxmov [edi], blinc ediloop lp2done:;;;;;;;;;;;êîíåö ñòðîêè?åñëè äà - êîíåö öèêëàbl íåëüçÿ, ïðèõîäèòñÿ bxñëåäóþùèé èíäåêñïîâòîðèòü öèêëåñëè ñòðîêà ïóñòàÿ - êîíåöîïÿòü ñ íà÷àëà áóôåðàèçâëåêàåìçàïèñûâàåìñëåäóþùèé àäðåñïîâòîðÿòü ecx ðàç 2.6.3. Äîïîëíèòåëüíûå êîìàíäû ðàáîòû ñî ñòåêîìÏðè íåîáõîäèìîñòè ìîæíî çàíåñòè â ñòåê çíà÷åíèå âñåõ ðåãèñòðîâ îáùåãî íàçíà÷åíèÿ îäíîé êîìàíäîé; ýòà êîìàíäà íàçûâàåòñÿ pushad (pushall doublewords).
Óòî÷íèì, ÷òî ýòà êîìàíäà çàíîñèò â ñòåê ñîäåðæèìîåðåãèñòðîâ EAX, ECX, EDX, EBX, ESP, EBP, ESI è EDI (â óêàçàííîì ïîðÿäêå), ïðè÷¼ì çíà÷åíèå ESP çàíîñèòñÿ â òîì âèäå, â êîòîðîì îíî áûëî äîâûïîëíåíèÿ êîìàíäû. Ñîîòâåòñòâóþùàÿ êîìàíäà èçâëå÷åíèÿ èç ñòåêàíàçûâàåòñÿ popad (pop all doublewords). Îíà èçâëåêàåò èç ñòåêà âîñåìü÷åòûð¼õáàéòíûõ çíà÷åíèé è çàíîñèò ýòè çíà÷åíèÿ â ðåãèñòðû â ïîðÿäêå,îáðàòíîì ïðèâåä¼ííîìó äëÿ êîìàíäû pushad, ïðè ýòîì çíà÷åíèå, ñîîòâåòñòâóþùåå ðåãèñòðó ESP, èãíîðèðóåòñÿ (òî åñòü èç ñòåêà èçâëåêàåòñÿ,íî â ðåãèñòð íå çàíîñèòñÿ).Ðåãèñòð ôëàãîâ (EFLAGS) ìîæåò áûòü çàïèñàí â ñòåê êîìàíäîépushfd è ñ÷èòàí îáðàòíî êîìàíäîé popfd, îäíàêî ïðè ýòîì, åñëè ìû ðàáîòàåì â îãðàíè÷åííîì ðåæèìå, òîëüêî íåêîòîðûå ôëàãè (à èìåííî ôëàãè, äîñòóïíûå ê èçìåíåíèþ â îãðàíè÷åííîì ðåæèìå) ìîãóò áûòü èçìåíåíû, íà îñòàëüíûå êîìàíäà popfd íèêàê íå ïîâëèÿåò.Ñóùåñòâóþò àíàëîãè÷íûå êîìàíäû äëÿ 16-áèòíûõ ðåãèñòðîâ, ïîääåðæèâàåìûåäëÿ ñîâìåñòèìîñòè ñî ñòàðûìè ïðîöåññîðàìè; îíè íàçûâàþòñÿ pushaw, popaw,pushfw è popfw, è ðàáîòàþò ïîëíîñòüþ àíàëîãè÷íî, íî âìåñòî 32-áèòíûõ ðåãèñòðîâ èñïîëüçóþò ñîîòâåòñòâóþùèå 16-áèòíûå.
Êîìàíäû pushaw è popaw ïðàêòè÷åñêè íèêîãäà íå èñïîëüçóþòñÿ, ÷òî êàñàåòñÿ êîìàíä pushfw è popfw, òî èõ èñïîëüçîâàíèå, â ïðèíöèïå, èìååò ñìûñë, åñëè ó÷åñòü, ÷òî â ¾ðàñøèðåííîé¿ ÷àñòèðåãèñòðà EFLAGS íåò íè îäíîãî ôëàãà, çíà÷åíèå êîòîðîãî ìû ìîãëè áû ïîìåíÿòüâ îãðàíè÷åííîì ðåæèìå ðàáîòû. 2.6.4. Ïîäïðîãðàììû: îáùèå ïðèíöèïûÏîäïðîãðàììîé íàçûâàåòñÿ íåêîòîðàÿ îáîñîáëåííàÿ ÷àñòü ïðîãðàììíîãî êîäà, êîòîðàÿ ìîæåò áûòü âûçâàíà èç ãëàâíîé ïðîãðàììû75(èëè èç äðóãîé ïîäïðîãðàììû); ïîä âûçîâîì â äàííîì ñëó÷àå ïîíèìàåòñÿ âðåìåííàÿ ïåðåäà÷à óïðàâëåíèÿ ïîäïðîãðàììå ñ òåì, ÷òîáû, êîãäà ïîäïðîãðàììà ñäåëàåò ñâîþ ðàáîòó, îíà âåðíóëà óïðàâëåíèå â òî÷êó,îòêóäà å¼ âûçâàëè. ×èòàòåëü, âíå âñÿêîãî ñîìíåíèÿ, óæå âñòðå÷àëñÿ ñïîäïðîãðàììàìè. Ýòî, íàïðèìåð, ïðîöåäóðû è ôóíêöèè ÿçûêà Ïàñêàëü,ôóíêöèè â ÿçûêå Ñè è ò. ï.Ïðè âûçîâå ïîäïðîãðàììû íåîáõîäèìî çàïîìíèòü àäðåñ âîçâðàòà ,òî åñòü àäðåñ ìàøèííîé êîìàíäû, ñëåäóþùåé çà êîìàíäîé âûçîâà ïîäïðîãðàììû, ïðè÷¼ì ñäåëàòü ýòî òàê, ÷òîáû ñàìà âûçûâàåìàÿ ïîäïðîãðàììà ìîãëà, êîãäà çàêîí÷èò ñâîþ ðàáîòó, âîñïîëüçîâàòüñÿ ýòèì ñîõðàí¼ííûì àäðåñîì äëÿ âîçâðàòà óïðàâëåíèÿ.
Êðîìå òîãî, ïîäïðîãðàììû÷àñòî ïîëó÷àþò ïàðàìåòðû , âëèÿþùèå íà èõ ðàáîòó, è èñïîëüçóþò âðàáîòå ëîêàëüíûå ïåðåìåííûå . Ïîäî âñ¼ ýòî íåîáõîäèìî ïðåäóñìîòðåòü âûäåëåíèå îïåðàòèâíîé ïàìÿòè (èëè ðåãèñòðîâ). Ñàìûé ïðîñòîéñïîñîá ðåøåíèÿ ýòîãî âîïðîñà âûäåëèòü êàæäîé ïîäïðîãðàììå ñâîþñîáñòâåííóþ îáëàñòü ïàìÿòè ïîä õðàíåíèå âñåé ëîêàëüíîé èíôîðìàöèè,âêëþ÷àÿ è àäðåñ âîçâðàòà, è ïàðàìåòðû, è ëîêàëüíûå ïåðåìåííûå. Òîãäàâûçîâ ïîäïðîãðàììû ïîòðåáóåò ïðåæäå âñåãî çàïèñàòü â ïðèíàäëåæàùóþ ïîäïðîãðàììå îáëàñòü ïàìÿòè (â çàðàíåå îãîâîð¼ííûå ìåñòà) çíà÷åíèÿ ïàðàìåòðîâ è àäðåñ âîçâðàòà, à çàòåì ïåðåäàòü óïðàâëåíèå â íà÷àëîïîäïðîãðàììû.Èíòåðåñíî, ÷òî êîãäà-òî äàâíî èìåííî òàê ñ ïîäïðîãðàììàìè è ïîñòóïàëè.
Îäíàêî ñ ðàçâèòèåì ìåòîäîâ è ïðè¼ìîâ ïðîãðàììèðîâàíèÿ âîçíèêëà ïîòðåáíîñòü â ðåêóðñèè òàêîì ïîñòðîåíèè ïðîãðàììû, ïðèêîòîðîì íåêîòîðûå ïîäïðîãðàììû ìîãóò ïðÿìî èëè êîñâåííî âûçûâàòüñàìè ñåáÿ, ïðèòîì ïîòåíöèàëüíî íåîãðàíè÷åííîå11 ÷èñëî ðàç. ßñíî, ÷òîïðè êàæäîì ðåêóðñèâíîì âûçîâå òðåáóåòñÿ íîâûé ýêçåìïëÿð îáëàñòèïàìÿòè äëÿ õðàíåíèÿ àäðåñà âîçâðàòà, ïàðàìåòðîâ è ëîêàëüíûõ ïåðåìåííûõ, ïðè÷¼ì ÷åì ïîçæå òàêîé ýêçåìïëÿð áóäåò ñîçäàí, òåì ðàíüøåñîîòâåòñòâóþùèé âûçîâ çàêîí÷èò ðàáîòó, òî åñòü ðåêóðñèâíûå âûçîâûïîäïðîãðàìì â îïðåäåë¼ííîì ñìûñëå ïîä÷èíÿþòñÿ ïðàâèëó ¾ïîñëåäíèéïðèøåë ïåðâûé óøåë¿.