А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 19
Текст из файла (страница 19)
Ñîâåðøåííî ëîãè÷íî èç ýòîãî âûòåêàåò èäåÿèñïîëüçîâàíèÿ ïðè âûçîâàõ ïîäïðîãðàìì óæå çíàêîìîãî íàì ñòåêà. ñîâðåìåííûõ âû÷èñëèòåëüíûõ ñèñòåìàõ ïåðåä âûçîâîì ïîäïðîãðàììû â ñòåê ïîìåùàþòñÿ çíà÷åíèÿ ïàðàìåòðîâ âûçîâà, çàòåì ïðîèçâîäèòñÿ ñîáñòâåííî âûçîâ, òî åñòü ïåðåäà÷à óïðàâëåíèÿ, êîòîðàÿ ñîâìåùåíà ñ ñîõðàíåíèåì â òîì æå ñòåêå àäðåñà âîçâðàòà. Íàêîíåö, êîãäà ïîäïðîãðàììà ïîëó÷àåò óïðàâëåíèå, îíà ðåçåðâèðóåò â ñòåêå îïðåäåë¼ííîåêîëè÷åñòâî ïàìÿòè äëÿ õðàíåíèÿ ëîêàëüíûõ ïåðåìåííûõ, îáû÷íî ïðîñòî ñäâèãàÿ àäðåñ âåðøèíû âíèç íà ñîîòâåòñòâóþùåå êîëè÷åñòâî ÿ÷ååê.Îáëàñòü ñòåêîâîé ïàìÿòè, ñîäåðæàùóþ ñâÿçàííûå ñ îäíèì âûçîâîì çíà11 Òî÷íåå ãîâîðÿ, îãðàíè÷åííîå òîëüêî îáúåìîì ïàìÿòè.76÷åíèÿ ïàðàìåòðîâ, àäðåñ âîçâðàòà è ëîêàëüíûå ïåðåìåííûå, íàçûâàþòñòåêîâûì ôðåéìîì . 2.6.5.
Âûçîâ ïîäïðîãðàìì è âîçâðàò èç íèõÂûçîâ ïîäïðîãðàììû, êàê óæå ñòàëî ÿñíî èç âûøåñêàçàííîãî, ýòîïåðåäà÷à óïðàâëåíèÿ ïî àäðåñó íà÷àëà ïîäïðîãðàììû ñ îäíîâðåìåííûìçàïîìèíàíèåì â ñòåêå àäðåñà âîçâðàòà (òî åñòü àäðåñà ìàøèííîé êîìàíäû, íåïîñðåäñòâåííî ñëåäóþùåé çà êîìàíäîé âûçîâà). Ïðîöåññîð i386ïðåäóñìàòðèâàåò äëÿ ýòîé öåëè êîìàíäó call; àíàëîãè÷íî êîìàíäå jmp,àðãóìåíò êîìàíäû call ìîæåò áûòü íåïîñðåäñòâåííûì (àäðåñ ïåðåõîäà çàäàí íåïîñðåäñòâåííî â êîìàíäå, íàïðèìåð, ìåòêîé), ðåãèñòðîâûì(àäðåñ ïåðåäà÷è óïðàâëåíèÿ íàõîäèòñÿ â ðåãèñòðå) è òèïà ¾ïàìÿòü¿ (ïåðåõîä íóæíî îñóùåñòâèòü ïî àäðåñó, ïðî÷èòàííîìó èç çàäàííîãî ìåñòàïàìÿòè).
Êîìàíäà call íå èìååò ¾êîðîòêîé¿ ôîðìû; ïîñêîëüêó ¾äàëüíÿÿ¿ ôîðìà íàì, êàê îáû÷íî, íå òðåáóåòñÿ â ñèëó îòñóòñòâèÿ ñåãìåíòîâ,îñòà¼òñÿ òîëüêî îäíà ôîðìà áëèçêàÿ (near), êîòîðóþ ìû âñåãäà è èñïîëüçóåì.Âîçâðàò èç ïîäïðîãðàììû ïðîèçâîäèòñÿ êîìàíäîé ret (îò ñëîâàreturn).  ñâîåé ïðîñòåéøåé ôîðìå ýòà êîìàíäà íå èìååò àðãóìåíòîâ.Âûïîëíÿÿ ýòó êîìàíäó, ïðîöåññîð èçâëåêàåò 4 áàéòà ñ âåðøèíû ñòåêà èçàïèñûâàåò èõ â ðåãèñòð EIP, â ðåçóëüòàòå ÷åãî óïðàâëåíèå ïåðåäà¼òñÿïî àäðåñó, êîòîðûé íàõîäèëñÿ â ïàìÿòè íà âåðøèíå ñòåêà.Ðàññìîòðèì ïðîñòîé ïðèìåð.
Äîïóñòèì, â íàøåé ïðîãðàììå ÷àñòîïðèõîäèòñÿ çàïîëíÿòü êàêèì-òî îäíîáàéòîâûì çíà÷åíèåì îáëàñòè ïàìÿòè ðàçíîé äëèíû. Òàêîå äåéñòâèå âïîëíå ìîæíî îôîðìèòü â âèäå ïîäïðîãðàììû. Äëÿ ïðîñòîòû êàðòèíû ïðèìåì ñîãëàøåíèå, ÷òî àäðåñ íóæíîéîáëàñòè ïàìÿòè ïåðåäà¼òñÿ ÷åðåç ðåãèñòð EDI, êîëè÷åñòâî îäíîáàéòîâûõÿ÷ååê, êîòîðûå íóæíî çàïîëíèòü ÷åðåç ðåãèñòð ECX, íó à ñàìî çíà÷åíèå, êîòîðîå íàäî çàïèñàòü âî âñå ýòè ÿ÷åéêè ÷åðåç ðåãèñòð AL. Êîäñîîòâåòñòâóþùåé ïîäïðîãðàììû ìîæåò âûãëÿäåòü, íàïðèìåð, òàê:; fill memory (edi=address, ecx=length, al=value)fill_memory:jecxzfm_qfm_lp: mov[edi], alinc ediloop fm_lpfm_q:retÎáðàòèòüñÿ ê òàêîé ïîäïðîãðàììå ìîæíî, íàïðèìåð, òàê:mov edi, my_arraymov ecx, 25677mov al, '@'call fill_memory ðåçóëüòàòå òàêîãî âûçîâà 256 áàéò ïàìÿòè, íà÷èíàÿ ñ àäðåñà, çàäàííîãîìåòêîé my_array, îêàæóòñÿ çàïîëíåíû êîäîì ñèìâîëà '@' (÷èñëî 64). 2.6.6.
Îðãàíèçàöèÿ ñòåêîâûõ ôðåéìîâÏîäïðîãðàììà, ïðèâåä¼ííàÿ â êà÷åñòâå ïðèìåðà â ïðåäûäóùåì ïàðàãðàôå, ôàêòè÷åñêè íå èñïîëüçîâàëà ìåõàíèçì ñòåêîâûõ ôðåéìîâ, ñîõðàíÿÿ â ñòåêå òîëüêî àäðåñ âîçâðàòà. Ýòîãî îêàçàëîñü äîñòàòî÷íî, ïîñêîëüêó ïîäïðîãðàììå íå òðåáîâàëèñü ëîêàëüíûå ïåðåìåííûå, à ïàðàìåòðûìû ïåðåäàëè ÷åðåç ðåãèñòðû. Êàê ïîêàçûâàåò ïðàêòèêà, ïîäïðîãðàììûðåäêî áûâàþò òàêèìè ïðîñòûìè.  áîëåå ñëîæíûõ ñëó÷àÿõ íàì íàâåðíÿêà ïîòðåáóþòñÿ ëîêàëüíûå ïåðåìåííûå, ïîñêîëüêó ðåãèñòðîâ íà âñ¼íå õâàòèò.
Êðîìå òîãî, ïåðåäà÷à ïàðàìåòðîâ ÷åðåç ðåãèñòðû òîæå ìîæåò îêàçàòüñÿ íåóäîáíà: âî-ïåðâûõ, ðåãèñòðîâ ìîæåò è íå õâàòèòü, à âîâòîðûõ, ïîäïðîãðàììå ìîãóò áûòü äîëãî íóæíû çíà÷åíèÿ, ïåðåäàííûå÷åðåç ðåãèñòðû, è ýòî ôàêòè÷åñêè ëèøèò å¼ âîçìîæíîñòè èñïîëüçîâàòüïîä ñâîè âíóòðåííèå íóæäû òå èç ðåãèñòðîâ, êîòîðûå áûëè çàäåéñòâîâàíû ïðè ïåðåäà÷å ïàðàìåòðîâ. Íàêîíåö, ïåðåäà÷à ïàðàìåòðîâ ÷åðåç ðåãèñòðû (à ðàâíî è ÷åðåç êàêóþ-ëèáî ôèêñèðîâàííóþ îáëàñòü ïàìÿòè)ëèøàåò íàñ âîçìîæíîñòè èñïîëüçîâàòü ðåêóðñèþ, ÷òî òîæå, ðàçóìååòñÿ,ïëîõî.Ïîýòîìó îáû÷íî (â îñîáåííîñòè ïðè òðàíñëÿöèè ïðîãðàììû ñ êàêîãîëèáî ÿçûêà âûñîêîãî óðîâíÿ, ñ òîãî æå Ïàñêàëÿ èëè Ñè) ïàðàìåòðû âôóíêöèè ïåðåäàþòñÿ ÷åðåç ñòåê, è â ñòåêå æå ðàçìåùàþòñÿ ëîêàëüíûåïåðåìåííûå.
Êàê áûëî ñêàçàíî âûøå, ïàðàìåòðû â ñòåêå ðàçìåùàåò âûçûâàþùàÿ ïðîãðàììà, çàòåì ïðè âûçîâå ïîäïðîãðàììû â ñòåê çàíîñèòñÿàäðåñ âîçâðàòà, è, íàêîíåö, óæå ñàìà âûçâàííàÿ ïîäïðîãðàììà ðåçåðâèðóåò ìåñòî â ñòåêå ïîä ëîêàëüíûå ïåðåìåííûå. Âñ¼ ýòî âìåñòå è îáðàçóåòñòåêîâûé ôðåéì. Ê ñîäåðæèìîìó ñòåêîâîãî ôðåéìà ìîæíî îáðàùàòüñÿ, èñïîëüçóÿ àäðåñà, ¾ïðèâÿçàííûå¿ ê àäðåñó, ïî êîòîðîìó ñîäåðæèòñÿàäðåñ âîçâðàòà, òî åñòü, èíà÷å ãîâîðÿ, òó ÿ÷åéêó ïàìÿòè, íà÷èíàÿ ñ êîòîðîé â ñòåê áûë çàíåñ¼í àäðåñ âîçâðàòà, èñïîëüçóþò â êà÷åñòâå ñâîåãîðîäà ðåïåðíîé òî÷êè.
Òàê, åñëè â ñòåê çàíåñòè òðè ÷åòûð¼õáàéòíûõ ïàðàìåòðà, à ïîòîì âûçâàòü ïðîöåäóðó, òî àäðåñ âîçâðàòà áóäåò ëåæàòü âïàìÿòè ïî àäðåñó [esp], íó à ïàðàìåòðû, î÷åâèäíî, îêàæóòñÿ äîñòóïíûïî àäðåñàì [esp+4], [esp+8] è [esp+12]. Åñëè æå ðàçìåñòèòü â ñòåêåëîêàëüíûå ÷åòûð¼õáàéòíûå ïåðåìåííûå, òî îíè îêàæóòñÿ äîñòóïíû ïîàäðåñàì [esp-4], [esp-8] è ò. ä.Çàìåòèì, ÷òî èñïîëüçîâàòü äëÿ äîñòóïà ê ïàðàìåòðàì ðåãèñòð ESPîêàçûâàåòñÿ íå ñëèøêîì óäîáíî, âåäü â ñàìîé ïðîöåäóðå íàì òîæå ìîæåò ïîòðåáîâàòüñÿ ñòåê (êàê äëÿ âðåìåííîãî õðàíåíèÿ äàííûõ, òàê è78[EBP-12]к[EBP-8]ло[EBP-4]пе[EBP][EBP+8]ьалренынменыесохр. EBPадрес возврата[EBP+12][EBP+16]еаргеумнтынаправление роста стеканаправление увеличения адресов[EBP-16]Ðèñ.
2.5. Ñòðóêòóðà ñòåêîâîãî ôðåéìàäëÿ âûçîâà äðóãèõ ïîäïðîãðàìì). Ïîýòîìó ïåðâûì æå ñâîèì äåéñòâèåì ïîäïðîãðàììà îáû÷íî ñîõðàíÿåò çíà÷åíèå ðåãèñòðà ESP â êàêîì-òîäðóãîì ðåãèñòðå (÷àùå âñåãî EBP) è èìåííî åãî èñïîëüçóåò äëÿ äîñòóïàê ïàðàìåòðàì è ëîêàëüíûì ïåðåìåííûì, íó à ðåãèñòð ESP ïðîäîëæàåòèãðàòü ñâîþ ðîëü óêàçàòåëÿ ñòåêà, èçìåíÿÿñü ïî ìåðå íåîáõîäèìîñòè; ïåðåä âîçâðàòîì èç ïîäïðîãðàììû åãî îáû÷íî âîññòàíàâëèâàþò â èñõîäíîìçíà÷åíèè (ïîïðîñòó ïåðåñûëàÿ â íåãî çíà÷åíèå èç EBP), ÷òîáû îí ñíîâàóêàçûâàë íà àäðåñ âîçâðàòà.Íàêîíåö, âîçíèêàåò åù¼ îäèí âîïðîñ: à ÷òî åñëè äðóãèå ïîäïðîãðàììû òîæå èñïîëüçóþò ðåãèñòð EBP äëÿ òåõ æå öåëåé? Âåäü â ýòîì ñëó÷àåïåðâûé æå âûçîâ äðóãîé ïîäïðîãðàììû èñïîðòèò íàì âñþ ðàáîòó.
Ìîæíî, êîíå÷íî, ñîõðàíÿòü EBP â ñòåêå ïåðåä âûçîâîì êàæäîé ïîäïðîãðàììû,íî ïîñêîëüêó â ïðîãðàììå îáû÷íî ãîðàçäî áîëüøå âûçîâîâ ïîäïðîãðàìì,÷åì ñîáñòâåííî ñàìèõ ïîäïðîãðàìì, ýêîíîìíåå îêàçûâàåòñÿ ñëåäîâàòüïðîñòîìó ïðàâèëó: êàæäàÿ ïîäïðîãðàììà äîëæíà ñàìà ñîõðàíèòü ñòàðîå çíà÷åíèå EBP è âîññòàíîâèòü åãî ïåðåä âîçâðàòîì óïðàâëåíèÿ.
Åñòåñòâåííî, äëÿ ñîõðàíåíèÿ çíà÷åíèÿ EBP òîæå èñïîëüçóåòñÿ ñòåê, ïðè÷¼ì79ñîõðàíåíèå âûïîëíÿåòñÿ ïðîñòîé êîìàíäîé push ebp ñðàçó ïîñëå ïîëó÷åíèÿ óïðàâëåíèÿ. Òàêèì îáðàçîì, ñòàðîå çíà÷åíèå EBP ïîìåùàåòñÿ â ñòåêíåïîñðåäñòâåííî ïîñëå àäðåñà âîçâðàòà èç ïîäïðîãðàììû, è â êà÷åñòâå¾òî÷êè ïðèâÿçêè¿ èñïîëüçóåòñÿ â äàëüíåéøåì èìåííî ýòîò àäðåñ âåðøèíû ñòåêà. Äëÿ ýòîãî ñëåäóþùåé êîìàíäîé âûïîëíÿåòñÿ mov ebp,esp. ðåçóëüòàòå ðåãèñòð EBP óêàçûâàåò íà òî ìåñòî â ñòåêå, ãäå íàõîäèòñÿ åãî æå, EBP, ñîõðàí¼ííîå çíà÷åíèå; åñëè òåïåðü îáðàòèòüñÿ ê ïàìÿòèïî àäðåñó [ebp+4], ìû îáíàðóæèì òàì àäðåñ âîçâðàòà èç ïîäïðîãðàììû, íó à ïàðàìåòðû, çàíåñ¼ííûå â ñòåê ïåðåä âûçîâîì ïîäïðîãðàììû,îêàçûâàþòñÿ äîñòóïíû ïî àäðåñàì [esp+8], [esp+12], [esp+16] è ò.
ä.Ïàìÿòü ïîä ëîêàëüíûå ïåðåìåííûå âûäåëÿåòñÿ ïóò¼ì ïðîñòîãî âû÷èòàíèÿ íóæíîé äëèíû èç òåêóùåãî çíà÷åíèÿ ESP; òàê, åñëè ïîä ëîêàëüíûåïåðåìåííûå íàì íóæíî 16 áàéò, òî ñðàçó ïîñëå ñîõðàíåíèÿ EBP è êîïèðîâàíèÿ â íåãî ñîäåðæèìîãî ESP íóæíî âûïîëíèòü êîìàíäó sub esp, 16;åñëè (äëÿ ïðîñòîòû êàðòèíû) âñå íàøè ëîêàëüíûå ïåðåìåííûå òîæå çàíèìàþò ïî 4 áàéòà, îíè îêàæóòñÿ äîñòóïíû ïî àäðåñàì [ebp-4], [ebp-8]è ò. ä.
Ñòðóêòóðà ñòåêîâîãî ôðåéìà ñ òðåìÿ ÷åòûð¼õáàéòíûìè ïàðàìåòðàìè è ÷åòûðüìÿ ÷åòûð¼õáàéòíûìè ëîêàëüíûìè ïåðåìåííûìè ïîêàçàíàíà ðèñ. 2.5.Ïîâòîðèì, ÷òî â íà÷àëå ñâîåé ðàáîòû, ñîãëàñíî íàøèì äîãîâîð¼ííîñòÿì, êàæäàÿ ïîäïðîãðàììà äîëæíà âûïîëíèòüpush ebpmov ebp, espsub esp, 16; âìåñòî 16 ïîäñòàâüòå îáúåì; ïàìÿòè ïîä ëîêàëüíûå ïåðåìåííûåà çàâåðøåíèå ïîäïðîãðàììû òåïåðü äîëæíî âûãëÿäåòü òàê:mov esp, ebppop ebpretÈíòåðåñíî, ÷òî ïðîöåññîð i386 ïîääåðæèâàåò äàæå ñïåöèàëüíûå êîìàíäû äëÿîáñëóæèâàíèÿ ñòåêîâûõ ôðåéìîâ.
Òàê, â íà÷àëå ïîäïðîãðàììû âìåñòî òð¼õ êîìàíä, ïðèâåä¼ííûõ âûøå, ìîæíî áûëî áû äàòü îäíó êîìàíäóenter 16, 0à âìåñòî äâóõ êîìàíä ïåðåä ret ìîæíî áûëî áû íàïèñàòüleaveÏðîáëåìà, êàê íè ñòðàííî, â òîì, ÷òî êîìàíäû enter è leave ðàáîòàþò ìåäëåííåå, ÷åì ñîîòâåòñòâóþùèé íàáîð ïðîñòûõ êîìàíä, òàê ÷òî èõ ïðàêòè÷åñêè íèêîãäàíå èñïîëüçóþò; åñëè äèçàññåìáëèðîâàòü ìàøèííûé êîä, ñãåíåðèðîâàííûé êîìïèëÿòîðîì ÿçûêà Ñè èëè Ïàñêàëü, ìû, ñêîðåå âñåãî, îáíàðóæèì â íà÷àëå ëþáîé80ïðîöåäóðû èëè ôóíêöèè èìåííî òàêèå êîìàíäû, êàê ïîêàçàíî âûøå, è íè÷åãîïîõîæåãî íà enter. Åäèíñòâåííûì îïðàâäàíèåì ñóùåñòâîâàíèÿ êîìàíä enter èleave ìîæåò ñëóæèòü èõ êîðîòêàÿ çàïèñü (íàïðèìåð, ìàøèííàÿ êîìàíäà leaveçàíèìàåò â ïàìÿòè âñåãî 1 áàéò), íî â íàøå âðåìÿ îá ýêîíîìèè ïàìÿòè íà ìàøèííîì êîäå îáû÷íî íèêòî íå çàäóìûâàåòñÿ; áûñòðîäåéñòâèå ïðàêòè÷åñêè âñåãäàîêàçûâàåòñÿ âàæíåå.Ñäåëàåì åù¼ îäíî âàæíîå çàìå÷àíèå.
Ïðè ðàáîòå ïîä óïðàâëåíèåì ÎÑUnix ìû ìîæåì íå áåñïîêîèòüñÿ íè î íàëè÷èè ñòåêà, íè î çàäàíèè åãîðàçìåðà. Îïåðàöèîííàÿ ñèñòåìà ñîçäà¼ò ñòåê àâòîìàòè÷åñêè ïðè çàïóñêåëþáîé çàäà÷è è, áîëåå òîãî, óæå âî âðåìÿ å¼ èñïîëíåíèÿ ïðè íåîáõîäèìîñòè óâåëè÷èâàåò ðàçìåð äîñòóïíîé äëÿ ñòåêà ïàìÿòè: ïî ìåðå òîãî êàêâåðøèíà ñòåêà ïðîäâèãàåòñÿ ïî âèðòóàëüíîìó àäðåñíîìó ïðîñòðàíñòâó¾ââåðõ¿ (òî åñòü â ñòîðîíó óìåíüøåíèÿ àäðåñîâ), îïåðàöèîííàÿ ñèñòåìàñòàâèò â ñîîòâåòñòâèå âèðòóàëüíûì àäðåñàì âñ¼ íîâûå è íîâûå ñòðàíèöû ôèçè÷åñêîé ïàìÿòè.
Èìåííî ïîýòîìó íà ðèñ. 2.4 è 2.5 ìû èçîáðàçèëèâåðõíèé êðàé ñòåêà êàê íå÷òî íå÷¼òêîå. 2.6.7. Îñíîâíûå êîíâåíöèè âûçîâîâ ïîäïðîãðàììÍåñìîòðÿ íà ïîäðîáíîå îïèñàíèå ìåõàíèçìà ñòåêîâûõ ôðåéìîâ, äàííîå â ïðåäûäóùåì ïàðàãðàôå, â íåêîòîðûõ âîïðîñàõ îñòà¼òñÿ âîçìîæíîñòü äëÿ ìàí¼âðà. Òàê, íàïðèìåð, â êàêîì ïîðÿäêå ñëåäóåò çàíîñèòü âñòåê çíà÷åíèÿ ôàêòè÷åñêèõ ïàðàìåòðîâ? Åñëè ìû ïèøåì ïðîãðàììó íàÿçûêå àññåìáëåðà, ýòîò âîïðîñ, ñîáñòâåííî ãîâîðÿ, íå âñòà¼ò; îäíàêî îíîêàçûâàåòñÿ íåîæèäàííî ïðèíöèïèàëüíûì ïðè ñîçäàíèè êîìïèëÿòîðîâÿçûêîâ ïðîãðàììèðîâàíèÿ âûñîêîãî óðîâíÿ.Ñîçäàòåëè êîìïèëÿòîðîâ ÿçûêà Ïàñêàëü îáû÷íî èäóò ¾î÷åâèäíûì¿ïóò¼ì: âûçîâ ïðîöåäóðû èëè ôóíêöèè òðàíñëèðóåòñÿ ñ Ïàñêàëÿ â âèäå ñåðèè êîìàíä çàíåñåíèÿ â ñòåê çíà÷åíèé, ïðè÷¼ì çíà÷åíèÿ çàíîñÿòñÿ â åñòåñòâåííîì (äëÿ ÷åëîâåêà) ïîðÿäêå ñëåâà íàïðàâî; çàòåì â êîä âñòàâëÿåòñÿ êîìàíäà call. Êîãäà òàêàÿ ïðîöåäóðà ïîëó÷àåò óïðàâëåíèå, çíà÷åíèÿôàêòè÷åñêèõ ïàðàìåòðîâ ðàñïîëàãàþòñÿ â ñòåêå ñíèçó ââåðõ, òî åñòü ïîñëåäíèé ïàðàìåòð îêàçûâàåòñÿ ðàçìåù¼í áëèæå äðóãèõ ê ðåïåðíîé òî÷êåôðåéìà (äîñòóïåí ïî àäðåñó [ebp+8]).