А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 35
Текст из файла (страница 35)
Ñ óâåëè÷åíèåì îáúåìà ïðîãðàììû, îäíàêî, ðàáîòàòü ñ îäíèì ôàéëîì ñòàíîâèòñÿ âñ¼ òðóäíåå è òðóäíåå, è òîìó ìîæíî íàçâàòü íåñêîëüêî ïðè÷èí. Âîïåðâûõ, äëèííûé ôàéë ýëåìåíòàðíî òÿæåëî ïåðåëèñòûâàòü. Âî-âòîðûõ,êàê ïðàâèëî, ïðîãðàììèñò â êàæäûé ìîìåíò âðåìåíè ðàáîòàåò òîëüêî ñíåáîëüøèì ôðàãìåíòîì èñõîäíîãî êîäà, ñòàðàòåëüíî âûêèäûâàÿ èç ãîëîâû îñòàëüíûå ÷àñòè ïðîãðàììû, ÷òîáû íå îòâëåêàòüñÿ, è â ýòîì ïëàíåáûëî áû ëó÷øå, ÷òîáû ôðàãìåíòû, íå íàõîäÿùèåñÿ â ðàáîòå â íàñòîÿùèé ìîìåíò, ðàñïîëàãàëèñü áû ãäå-íèáóäü ïîäàëüøå, òî åñòü òàê, ÷òîáûíå ïîïàäàòüñÿ íà ãëàçà ïðîãðàììèñòó äàæå ñëó÷àéíî. Â-òðåòüèõ, åñëèïðîãðàììà ðàçáèòà íà îòäåëüíûå ôàéëû, â íåé îêàçûâàåòñÿ ãîðàçäî ïðîùå íàéòè íóæíîå ìåñòî, ïîäîáíî òîìó, êàê ïðîùå íàéòè íóæíóþ áóìàãóâ øêàôó ñ îôèñíûìè ïàïêàìè, íåæåëè â áîëüøîì ÿùèêå áåçî âñÿêèõïàïîê. Íàêîíåö, ÷àñòî áûâàåò òàê, ÷òî îäèí è òîò æå ôðàãìåíò êîäàèñïîëüçóåòñÿ â ðàçíûõ ïðîãðàììàõ à âåäü åãî, ñêîðåå âñåãî, òàê èëèèíà÷å ïðèõîäèòñÿ âðåìÿ îò âðåìåíè ðåäàêòèðîâàòü, ÷òîáû, íàïðèìåð,èñïðàâèòü îøèáêè, è òóò óæå ñîâåðøåííî î÷åâèäíî, ÷òî ãîðàçäî ïðîùå èñïðàâèòü ôàéë â îäíîì ìåñòå è ñêîïèðîâàòü (ôàéë öåëèêîì) âî âñåîñòàëüíûå ïðîåêòû, ÷åì èñïðàâëÿòü îäèí è òîò æå ôðàãìåíò, êîòîðûéâñòàâëåí â ðàçíûå ôàéëû.Ðàçáèâêà òåêñòà ïðîãðàììû íà ôàéëû, ñîåäèíÿåìûå äèðåêòèâàìè%include èëè èõ àíàëîãàìè, ñíèìàåò ÷àñòü ïðîáëåì, íî, ê ñîæàëåíèþ,153íå âñå, ïîñêîëüêó òàêîé íàáîð ôàéëîâ îñòà¼òñÿ, êàê ãîâîðÿò ïðîãðàììèñòû, îäíîé åäèíèöåé òðàíñëÿöèè èíà÷å ãîâîðÿ, ìû ìîæåì èõ òðàíñëèðîâàòü ñ ïîìîùüþ àññåìáëåðà (èëè ñ ïîìîùüþ êîìïèëÿòîðà, åñëè ìûïèøåì íà ÿçûêå âûñîêîãî óðîâíÿ) òîëüêî âñå âìåñòå, çà îäèí ïðè¼ì.Ïðåæäå âñåãî òóò âîçíèêàåò ïðîáëåìà ñî ñêîðîñòüþ òðàíñëÿöèè.
Ñîâðåìåííûå êîìïèëÿòîðû è àññåìáëåðû ðàáîòàþò äîâîëüíî áûñòðî, íî îáúåìû íàèáîëåå ñåðü¼çíûõ ïðîãðàìì òàêîâû, ÷òî èõ ïîëíàÿ ïåðåêîìïèëÿöèÿìîæåò çàíÿòü íåñêîëüêî ÷àñîâ, à èíîãäà è íåñêîëüêî ñóòîê. Åñëè ïîñëåâíåñåíèÿ ëþáîãî, äàæå ñàìîãî íåçíà÷èòåëüíîãî èçìåíåíèÿ â ïðîãðàììóíàì, ÷òîáû ïîñìîòðåòü, ÷òî ïîëó÷èëîñü, ïðèä¼òñÿ æäàòü ñóòêè (äà è ïàðó ÷àñîâ ýòîãî óæå áóäåò äîñòàòî÷íî) ðàáîòàòü ñòàíåò ñîâåðøåííîíåâîçìîæíî.
Áîëåå òîãî, ïðîãðàììèñòû ïðàêòè÷åñêè âñåãäà èñïîëüçóþòòàê íàçûâàåìûå áèáëèîòåêè êîìïëåêòû ãîòîâûõ ïîäïðîãðàìì, êîòîðûå ïî÷òè íèêîãäà íå èçìåíÿþòñÿ è, ñîîòâåòñòâåííî, ïîñòîÿííî òðàòèòüâðåìÿ íà èõ ïåðåêîìïèëÿöèþ áûëî áû íåñêîëüêî ãëóïî. Íàêîíåö, ïðîáëåìû ñîçäàþò è ïîñòîÿííî âîçíèêàþùèå êîíôëèêòû èì¼í: ÷åì áîëüøåîáú¼ì êîäà, òåì áîëüøå â í¼ì òðåáóåòñÿ ìåòîê è äðóãèõ èäåíòèôèêàòîðîâ, ðàñò¼ò âåðîÿòíîñòü ñëó÷àéíûõ ñîâïàäåíèé, à ñäåëàòü ñ ýòèì ïðèòðàíñëÿöèè â îäèí ïðè¼ì ïî÷òè íè÷åãî íåëüçÿ âåäü äàæå ëîêàëüíûåìåòêè, êàê ìû óæå ãîâîðèëè, íà ñàìîì äåëå ïðåäñòàâëÿþò ñîáîé íå áîëåå÷åì óêîðî÷åííóþ çàïèñü áîëåå äëèííûõ ãëîáàëüíûõ ìåòîê.Âñå ýòè ïðîáëåìû ïîçâîëÿåò ðåøèòü òåõíèêà ðàçäåëüíîé êîìïèëÿöèè .
Ñóòü å¼ â òîì, ÷òî ïðîãðàììà ñîçäà¼òñÿ â âèäå ìíîæåñòâà îáîñîáëåííûõ ÷àñòåé, êàæäàÿ èç êîòîðûõ òðàíñëèðóåòñÿ îòäåëüíî. Òàêèå ÷àñòèíàçûâàþòñÿ åäèíèöàìè òðàíñëÿöèè èëè ìîäóëÿìè . ×àùå âñåãî âðîëè ìîäóëåé âûñòóïàþò îòäåëüíûå ôàéëû. Îáû÷íî â âèäå îáîñîáëåííîé åäèíèöû òðàíñëÿöèè îôîðìëÿþò íàáîð ëîãè÷åñêè ñâÿçàííûõ ìåæäóñîáîé ïîäïðîãðàìì; â ìîäóëü òàêæå ïîìåùàþò è âñ¼ íåîáõîäèìîå äëÿèõ ðàáîòû íàïðèìåð, ãëîáàëüíûå ïåðåìåííûå, åñëè òàêèå åñòü, à òàêæå âñåâîçìîæíûå êîíñòàíòû è ïðî÷åå. Êàæäûé ìîäóëü òðàíñëèðóåòñÿîòäåëüíî; â ðåçóëüòàòå òðàíñëÿöèè êàæäîãî èç íèõ ïîëó÷àåòñÿ îáúåêòíûé ôàéë , îáû÷íî èìåþùèé ñóôôèêñ ¾.o¿. Çàòåì ñ ïîìîùüþ ðåäàêòîðàñâÿçåé èç íàáîðà îáúåêòíûõ ôàéëîâ ïîëó÷àþò èñïîëíÿåìûé ôàéë.Î÷åíü âàæíûì ñâîéñòâîì ìîäóëÿ ÿâëÿåòñÿ íàëè÷èå ó íåãî ñîáñòâåííîãî ïðîñòðàíñòâà èì¼í .
Ìåòêè, ââåä¼ííûå â ìîäóëå, áóäóò âèäíûòîëüêî èç äðóãèõ ìåñò òîãî æå ìîäóëÿ, åñëè òîëüêî ìû ñïåöèàëüíî íåîáúÿâèì èõ ¾ãëîáàëüíûìè¿ (íàïîìíèì, ÷òî â ÿçûêå àññåìáëåðà NASMýòî äåëàåòñÿ äèðåêòèâîé global). ×àñòî áûâàåò òàê, ÷òî ìîäóëü ââîäèòíåñêîëüêî äåñÿòêîâ, à èíîãäà è ñîòåí ìåòîê, íî âñå îíè îêàçûâàþòñÿíóæíû òîëüêî â í¼ì ñàìîì, à èç âñåé îñòàëüíîé ïðîãðàììû òðåáóþòñÿîáðàùåíèÿ ëèøü ê îäíîé-äâóì ïðîöåäóðàì. Ýòî ïðàêòè÷åñêè ñíèìàåòïðîáëåìó êîíôëèêòîâ èì¼í: â ðàçíûõ ìîäóëÿõ ìîãóò ïîÿâëÿòüñÿ ìåòêèñ îäèíàêîâûìè èìåíàìè, è ýòî íèêàê íàì íå ìåøàåò, åñëè òîëüêî îíè íå154ãëîáàëüíûå.
Òåõíè÷åñêè ýòî îçíà÷àåò, ÷òî ïðè òðàíñëÿöèè èñõîäíîãî òåêñòà ìîäóëÿ â îáúåêòíûé êîä âñå ìåòêè, êðîìå îáúÿâëåííûõ ãëîáàëüíûìè,èñ÷åçàþò, òàê ÷òî â îáúåêòíîì ôàéëå ñîäåðæèòñÿ óæå òîëüêî èíôîðìàöèÿ îá èìåíàõ ãëîáàëüíûõ ìåòîê.Èíòåðåñíî, ÷òî ñîáñòâåííûå ïðîñòðàíñòâà èì¼í ìîäóëåé ïîçâîëÿþò ðåøèòü íåòîëüêî ïðîáëåìó êîíôëèêòà èì¼í, íî è ïðîáëåìó ïðîñòåéøåé çàùèòû îò äóðàêà , îñîáåííî àêòóàëüíîé â êðóïíûõ ïðîãðàììíûõ ðàçðàáîòêàõ, â êîòîðûõ ïðèíèìàåò ó÷àñòèå íåñêîëüêî ÷åëîâåê. Åñëè àâòîð ìîäóëÿ íå ïðåäïîëàãàåò, ÷òî òà èëèèíàÿ ïðîöåäóðà áóäåò âûçûâàòüñÿ èç äðóãèõ ìîäóëåé, ëèáî ÷òî ïåðåìåííàÿ íåäîëæíà èçìåíÿòüñÿ íèêàê èíà÷å, ÷åì ïðîöåäóðàìè òîãî æå ìîäóëÿ, òî åìó äîñòàòî÷íî íå îáúÿâëÿòü ñîîòâåòñòâóþùèå ìåòêè ãëîáàëüíûìè, è ìîæíî íè î ÷¼ì íåáåñïîêîèòüñÿ îáðàòèòüñÿ ê íèì äðóãèå ïðîãðàììèñòû íå ñìîãóò ÷èñòî òåõíè÷åñêè.
Òàêîå ñîêðûòèå äåòàëåé ðåàëèçàöèè òîé èëè èíîé ïîäñèñòåìû â ïðîãðàììåíàçûâàåòñÿ èíêàïñóëÿöèåé è ïîçâîëÿåò, íàïðèìåð, áîëåå ñìåëî èñïðàâëÿòü êîäìîäóëåé, íå áîÿñü, ÷òî äðóãèå ìîäóëè ïðè ýòîì ïåðåñòàíóò ðàáîòàòü: äîñòàòî÷íîñîõðàíÿòü íåèçìåííûìè è ðàáîòàþùèìè ãëîáàëüíûå ìåòêè.¾¿ 5.2. Ïîääåðæêà ìîäóëåé â NASMÀññåìáëåð NASM ïîääåðæèâàåò ìîäóëüíîå ïðîãðàììèðîâàíèå, ââîäÿ äëÿ ýòîãî äâà îñíîâíûõ ïîíÿòèÿ: ãëîáàëüíûå ìåòêè è âíåøíèåìåòêè . Ñ ïåðâûìè èç íèõ ìû óæå çíàêîìû: òàêèå ìåòêè îáúÿâëÿþòñÿäèðåêòèâîé global è, êàê ìû óæå çíàåì, îòëè÷àþòñÿ îò îáû÷íûõ òåì,÷òî èíôîðìàöèÿ î íèõ âêëþ÷àåòñÿ â îáúåêòíûé ôàéë ìîäóëÿ è ñòàíîâèòñÿ, òàêèì îáðàçîì, âèäíà ñèñòåìíîìó ðåäàêòîðó ñâÿçåé.
×òî êàñàåòñÿâíåøíèõ ìåòîê, òî ýòî, íàïðîòèâ, ìåòêè, ââåäåíèÿ êîòîðûõ ìû îæèäàåì îò äðóãèõ ìîäóëåé . ×àùå âñåãî ýòî ïðîñòî èìÿ ïîäïðîãðàììû(ðåæå ãëîáàëüíîé ïåðåìåííîé), êîòîðàÿ îïèñàíà ãäå-òî â äðóãîì ìîäóëå, íî ê êîòîðîé íàì íåîáõîäèìî îáðàòèòüñÿ. ×òîáû ýòî ñòàëî âîçìîæíûì, íåîáõîäèìî ñîîáùèòü àññåìáëåðó î ñóùåñòâîâàíèè ýòîé ìåòêè.Äåéñòâèòåëüíî, àññåìáëåð âî âðåìÿ òðàíñëÿöèè âèäèò òîëüêî òåêñò îäíîãî ìîäóëÿ è íè÷åãî íå çíàåò î òîì, ÷òî â äðóãèõ ìîäóëÿõ îáúÿâëåíûòå èëè èíûå ìåòêè, òàê ÷òî, åñëè ìû ïîïûòàåìñÿ îáðàòèòüñÿ ê ìåòêå èçäðóãîãî ìîäóëÿ, íèêàê íå ñîîáùèâ àññåìáëåðó î ôàêòå å¼ ñóùåñòâîâàíèÿ,ìû ïîïðîñòó ïîëó÷èì ñîîáùåíèå îá îøèáêå.
Äëÿ ýòîãî àññåìáëåð NASMââîäèò äèðåêòèâó extern. Íàïðèìåð, åñëè ìû ïèøåì ìîäóëü, â êîòîðîìõîòèì îáðàòèòüñÿ ê ïðîöåäóðå myproc, à ñàìà ýòà ïðîöåäóðà îïèñàíà ãäåòî â äðóãîì ìåñòå, òî, ÷òîáû ñîîáùèòü îá ýòîì, ñëåäóåò íàïèñàòü:extern myprocÒàêàÿ ñòðîêà ïðèêàçûâàåò àññåìáëåðó áóêâàëüíî ñëåäóþùåå: ¾ìåòêàmyproc ñóùåñòâóåò, õîòÿ å¼ è íåò â òåêóùåì ìîäóëå, òàê ÷òî, âñòðåòèâòàêóþ ìåòêó, ïðîñòî ñãåíåðèðóé ñîîòâåòñòâóþùèé îáúåêòíûé êîä, à êîíêðåòíûé àäðåñ âìåñòî ýòîé ìåòêè ïîòîì ïîäñòàâèò ðåäàêòîð ñâÿçåé¿.155 5.3. Ïðèìåð êà÷åñòâå ïðèìåðà ìíîãîìîäóëüíîé ïðîãðàììû ìû íàïèøåì ïðîñòóþ ïðîãðàììó, êîòîðàÿ ñïðàøèâàåò ó ïîëüçîâàòåëÿ åãî èìÿ, à çàòåìçäîðîâàåòñÿ ñ íèì ïî èìåíè.
Ðàáîòó ñî ñòðîêàìè ìû íà ýòîò ðàç îðãàíèçóåì òàê, êàê ýòî îáû÷íî äåëàåòñÿ â ïðîãðàììàõ íà ÿçûêå Ñè: áóäåìèñïîëüçîâàòü íóëåâîé áàéò â êà÷åñòâå ïðèçíàêà êîíöà ñòðîêè. Ãîëîâíàÿ ïðîãðàììà áóäåò çàâèñåòü îò äâóõ îñíîâíûõ ïîäïðîãðàìì, putstrè getstr, êàæäóþ èç êîòîðûõ ìû âûíåñåì â îòäåëüíûé ìîäóëü. Ïîäïðîãðàììå putstr ïîòðåáóåòñÿ ïîñ÷èòàòü äëèíó ñòðîêè, ÷òîáû íàïå÷àòàòüâñþ ñòðîêó çà îäíî îáðàùåíèå ê îïåðàöèîííîé ñèñòåìå; äëÿ òàêîãî ïîäñ÷¼òà ìû èñïîëüçóåì ôóíêöèþ strlen, óæå çíàêîìóþ íàì ïî ïðîãðàììåèç 4.4.
ż ìû òîæå âûíåñåì â îòäåëüíûé ìîäóëü. Íàêîíåö, îðãàíèçàöèþ âûçîâà _exit ìû òîæå âûíåñåì â ïîäïðîãðàììó (íàçîâ¼ì å¼ quit)è â îòäåëüíûé ìîäóëü. Âñå ìîäóëè íàçîâ¼ì òàê æå, êàê è âûíåñåííûå âíèõ ïîäïðîãðàììû: putstr.asm, getstr.asm, strlen.asm è quit.asm.Äëÿ îðãàíèçàöèè ñèñòåìíûõ âûçîâîâ ìû èñïîëüçóåì ìàêðîñ syscall,êîòîðûé ìû îïèñàëè íà ñòð. 148. Åãî ìû òàêæå âûíåñåì â îòäåëüíûéôàéë, íî ïîëíîöåííûì ìîäóëåì ýòîò ôàéë áûòü íå ñìîæåò.
Äåéñòâèòåëüíî, ìîäóëü ýòî åäèíèöà òðàíñëÿöèè, òîãäà êàê ìàêðîñ, âîîáùåãîâîðÿ, íå ìîæåò áûòü íè âî ÷òî îòòðàíñëèðîâàí: êàê ìû îòìå÷àëè ðàíåå, â õîäå òðàíñëÿöèè ìàêðîñû ïîëíîñòüþ èñ÷åçàþò è â îáúåêòíîì êîäåîò íèõ íè÷åãî íå îñòà¼òñÿ. Ýòî è ïîíÿòíî, âåäü ìàêðîñû ïðåäñòàâëÿþò ñîáîé íàáîð óêàçàíèé íå äëÿ ïðîöåññîðà, à äëÿ ñàìîãî àññåìáëåðà, è÷òîáû îò ìàêðîñà áûëà êàêàÿ-òî ïîëüçà, àññåìáëåð äîëæåí, ðàçóìååòñÿ,âèäåòü îïðåäåëåíèå ìàêðîñà â òîì ìåñòå, ãäå îí âñòðåòèò îáðàùåíèå êýòîìó ìàêðîñó. Ïîýòîìó ôàéë, ñîäåðæàùèé íàø ìàêðîñ syscall, ìû áóäåì ïîäñîåäèíÿòü ê äðóãèì ôàéëàì ñ ïîìîùüþ äèðåêòèâû %include íàñòàäèè ïðåïðîöåññèðîâàíèÿ (â îòëè÷èå îò ìîäóëåé, êîòîðûå ñîáèðàþòñÿâ åäèíîå öåëîå ñóùåñòâåííî ïîçæå ïîñëå çàâåðøåíèÿ òðàíñëÿöèè, ñïîìîùüþ ðåäàêòîðà ñâÿçåé).
Ýòîò ôàéë ìû íàçîâ¼ì syscall.inc; ñ íåãîìû âïîëíå ìîæåì íà÷àòü, îòêðûâ åãî äëÿ ðåäàêòèðîâàíèÿ è íàáðàâ âí¼ì ðîâíî òàêîå îïðåäåëåíèå ìàêðîñà, êàêîå áûëî äàíî íà ñòð. 148; íè÷åãî äðóãîãî â ýòîì ôàéëå íàáèðàòü íå òðåáóåòñÿ.Ñëåäóþùèì ìû íàïèøåì ôàéë strlen.asm. Îí áóäåò âûãëÿäåòü òàê:globalstrlensection .text; procedure strlen; [ebp+8] == address of the stringstrlen: push ebpmov ebp, espxor eax, eax156mov esi, [ebp+8]cmp byte [esi], 0jz .quitinc esiinc eaxjmp short .lp.quit: pop ebpret.lp:Ïåðâàÿ ñòðî÷êà ôàéëà óêàçûâàåò, ÷òî â ýòîì ìîäóëå áóäåò îïðåäåëåíàìåòêà strlen è ýòó ìåòêó íåîáõîäèìî ñäåëàòü âèäèìîé èç äðóãèõ ìîäóëåé.
Âîîáùå ãîâîðÿ, ìû ìîãëè áû ïîñòàâèòü ýòó äèðåêòèâó ãäå óãîäíî,íî ëó÷øå âûíåñòè å¼ â íà÷àëî, ÷òîáû ïðè ïåðâîì æå âçãëÿäå íà òåêñòìîäóëÿ ìîæíî áûëî äîãàäàòüñÿ, äëÿ ÷åãî îí íóæåí. Ïîäðîáíî êîììåíòèðîâàòü òåêñò ïðîöåäóðû ìû íå áóäåì, ïîñêîëüêó îí íàì óæå çíàêîì.Èìåÿ â ñâî¼ì ðàñïîðÿæåíèè ïðîöåäóðó strlen, íàïèøåì ìîäóëüputstr.asm. Ïðîöåäóðà putstr áóäåò âûçûâàòü strlen äëÿ ïîäñ÷¼òà äëèíû ñòðîêè, à çàòåì îáðàùàòüñÿ ê ñèñòåìíîìó âûçîâó write:%include "syscall.inc"global putstrextern strlen; íóæåí ìàêðîñ syscall; ìîäóëü îïèñûâàåò putstr; à ñàì èñïîëüçóåò strlensection.text; procedire putstr; [ebp+8] = address of the stringputstr: push ebp; ñòàíäàðòíîå íà÷àëîmov ebp, esp; ïîäïðîãðàììûpush dword [ebp+8] ; âûçûâàåì strlen äëÿcall strlen; ïîäñ÷¼òà äëèíû ñòðîêèadd esp, 4; ðåçóëüòàò òåïåðü â EAXsyscall 4, 1, [ebp+8], eax ; âûçûâàåì writemov esp, ebp; ñòàíäàðòíîå çàâåðøåíèåpop ebp;ïîäïðîãðàììûretÒåïåðü íàñòàë ÷åð¼ä ñàìîãî ñëîæíîãî èç ìîäóëåé íàøåé ïðîãðàììû ìîäóëÿ getstr.
Ïðîöåäóðà getstr áóäåò ïîëó÷àòü íà âõîä àäðåñ áóôåðà,â êîòîðîì ñëåäóåò ðàçìåñòèòü ïðî÷èòàííóþ ñòðîêó, è (íà âñÿêèé ñëó÷àé) äëèíó ýòîãî áóôåðà, ÷òîáû íå äîïóñòèòü åãî ïåðåïîëíåíèÿ, åñëèïîëüçîâàòåëþ ïðèä¼ò â ãîëîâó íàáðàòü ñòðîêó, êîòîðàÿ â íàø áóôåð íåïîìåñòèòñÿ. Äëÿ óïðîùåíèÿ ðåàëèçàöèè ìû áóäåì ñ÷èòûâàòü ñòðîêó ïîîäíîìó ñèìâîëó; êîíå÷íî, â íàñòîÿùèõ ïðîãðàììàõ òàê íå äåëàþò, íîíàøà çàäà÷à ñåé÷àñ íå â òîì, ÷òîáû ïîëó÷èòü ýôôåêòèâíóþ ïðîãðàììó,òàê ÷òî ìû âïîëíå ìîæåì íåìíîãî îáëåã÷èòü ñåáå æèçíü. Ïîäïðîãðàììà157getstr áóäåò èñïîëüçîâàòü ëîêàëüíóþ ïåðåìåííóþ, êîòîðóþ â êîììåíòàðèÿõ ìû íàçîâ¼ì I è êîòîðàÿ, êàê è âñå ëîêàëüíûå ïåðåìåííûå, áóäåòðàñïîëàãàòüñÿ â ñòåêîâîì ôðåéìå, äëÿ ÷åãî ìû â íà÷àëå ïðîöåäóðû ñîîòâåòñòâóþùèì îáðàçîì èçìåíèì óêàçàòåëü ñòåêà.
 ïåðåìåííîé I áóäåòñîäåðæàòüñÿ òåêóùåå êîëè÷åñòâî ïðî÷èòàííûõ ñèìâîëîâ, èçíà÷àëüíîðàâíîå íóëþ. Äàëåå ïðîöåäóðà áóäåò â öèêëå ÷èòàòü ïî îäíîìó ñèìâîëó ñ ïîìîùüþ ñèñòåìíîãî âûçîâà read. ×òåíèå áóäåò ïðåêðàùåíî ïðèíàñòóïëåíèè îäíîãî èç ñëåäóþùèõ óñëîâèé: ëèáî read âåðí¼ò ÷òî-ëèáîîòëè÷íîå îò 1, ÷òî â äàííîì ñëó÷àå áóäåò îçíà÷àòü íàñòóïëåíèå ñèòóàöèè¾êîíåö ôàéëà¿ èëè îøèáêó; ëèáî êîä ïðî÷èòàííîãî ñèìâîëà áóäåò ðàâåí10, òî åñòü ýòî îêàæåòñÿ ñèìâîë ïåðåâîäà ñòðîêè (ýòîò êîä ãåíåðèðóåòêëàâèøà Enter); ëèáî, íàêîíåö, â áóôåðå îñòàíåòñÿ ìåñòî òîëüêî ïîä çàâåðøàþùèé íóëåâîé áàéò, ÷òî ïðîâåðÿåòñÿ óñëîâèåì I+1>buflen.