А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 34
Текст из файла (страница 34)
Íàñòîÿùàÿêîìàíäà cp, ïðåäíàçíà÷åííàÿ äëÿ êîïèðîâàíèÿ ôàéëîâ, óñòðîåíà ãîðàçäîñëîæíåå, íî äëÿ íàøåãî ó÷åáíîãî ïðèìåðà ëèøíÿÿ ñëîæíîñòü íå íóæíà.ßñíî, ÷òî íàøåé ïðîãðàììå ïðåäñòîèò àêòèâíî ïîëüçîâàòüñÿ ñèñòåìíûìè âûçîâàìè. Äåëî îñëîæíÿåòñÿ òåì, ÷òî íàì õîòåëîñü áû, êîíå÷íî,146íàïèñàòü ïðîãðàììó, êîòîðàÿ áóäåò óñïåøíî êîìïèëèðîâàòüñÿ è ðàáîòàòüêàê ïîä ÎÑ Linux, òàê è ïîä ÎÑ FreeBSD. Êàê ìû âèäåëè íà ïðèìåðå ïðîãðàììû èç ïðåäûäóùåãî ïàðàãðàôà, ýòî òðåáóåò äîâîëüíî ãðîìîçäêîãîîôîðìëåíèÿ êàæäîãî ñèñòåìíîãî âûçîâà äèðåêòèâàìè óñëîâíîé êîìïèëÿöèè. Ïðåäûäóùèé ïðèìåð, ñîäåðæàùèé âñåãî òðè ñèñòåìíûõ âûçîâà,ìîæíî áûëî íàïèñàòü, íå îñîáåííî çàäóìûâàÿñü íàä ýòîé ïðîáëåìîé, ÷òîìû è ñäåëàëè; èíîå äåëî ïðîãðàììà, â êîòîðîé ïðåäïîëàãàåòñÿ áîëüøåäåñÿòêà îáðàùåíèé ê îïåðàöèîííîé ñèñòåìå.
×òîáû íå äîïóñòèòü çàãðîìîæäåíèÿ íàøåãî èñõîäíîãî êîäà îäíîîáðàçíûìè, íî ïðè ýòîì îáú¼ìíûìè (è, çíà÷èò, îòâëåêàþùèìè âíèìàíèå) êîíñòðóêöèÿìè, ìû íàïèøåìîäèí ìíîãîñòðî÷íûé ìàêðîñ, êîòîðûé è áóäåò îñóùåñòâëÿòü ñèñòåìíûéâûçîâ (òî÷íåå, îí áóäåò ãåíåðèðîâàòü àññåìáëåðíûé êîä äëÿ îñóùåñòâëåíèÿ ñèñòåìíîãî âûçîâà).  òåêñòå ýòîãî ìàêðîñà è áóäóò çàêëþ÷åíûâñå ðàçëè÷èÿ â îðãàíèçàöèè ñèñòåìíûõ âûçîâîâ äëÿ Linux è FreeBSD.Ìàêðîñ áóäåò ïðèíèìàòü íà âõîä ïðîèçâîëüíîå êîëè÷åñòâî ïàðàìåòðîâ,íå ìåíüøåå îäíîãî; ïåðâûé ïàðàìåòð áóäåò çàäàâàòü íîìåð ñèñòåìíîãîâûçîâà, îñòàëüíûå çíà÷åíèÿ ïàðàìåòðîâ ñèñòåìíîãî âûçîâà.
Îòìåòèì,÷òî äëÿ ÎÑ Linux íàø ìàêðîñ îòêàæåòñÿ ðàáîòàòü ñ áîëåå ÷åì ïÿòüþïàðàìåòðàìè, ïîñêîëüêó îíè óæå íå óìåñòÿòñÿ â ðåãèñòðû; äëÿ FreeBSDòàêîãî îãðàíè÷åíèÿ íåò.Ïðè ïåðåäà÷å ïàðàìåòðîâ â ìàêðîñ è ðàñêëàäûâàíèè èõ ïî ñîîòâåòñòâóþùèì ðåãèñòðàì (â âàðèàíòå äëÿ Linux) ìû ïðèìåíèì ïðè¼ì, êîòîðûé óæå âñòðå÷àëè (ñì. êîììåíòàðèé íà ñòð.
118) çàíåñåíèå âñåõïàðàìåòðîâ â ñòåê ñ ïîñëåäóþùèì èõ èçâëå÷åíèåì â íóæíûå ðåãèñòðû. âàðèàíòå äëÿ FreeBSD íèêàêîãî ðàñêëàäûâàíèÿ ïî ðåãèñòðàì íàì íåòðåáóåòñÿ, çàòî òðåáóåòñÿ çàíåñòè ïàðàìåòðû â ñòåê óæå äëÿ èñïîëüçîâàíèÿ èõ ñàìèì ñèñòåìíûì âûçîâîì. Òàêèì îáðàçîì, â îáîèõ ñëó÷àÿõ òåëîìàêðîñà ìîæíî íà÷àòü ñ çàíåñåíèÿ â ñòåê âñåõ åãî ïàðàìåòðîâ (â îáðàòíîì ïîðÿäêå, ÷òîáû íå ïðèøëîñü èõ êàê-ëèáî ïåðåóïîðÿäî÷èâàòü â âàðèàíòå äëÿ FreeBSD). Äëÿ ýòîãî ìû âîñïîëüçóåìñÿ äèðåêòèâîé %rotateòî÷íî òàê æå, êàê ìû ýòî óæå äåëàëè ïðè íàïèñàíèè ìàêðîñà pcall(ñì. ñòð.
120).Ïîñëå ýòîãî â âàðèàíòå äëÿ FreeBSD äîñòàòî÷íî çàíåñòè íîìåð âûçîâà â EAX, è ìîæíî èíèöèèðîâàòü ïðåðûâàíèå; â âàðèàíòå äëÿ Linux âñ¼íå òàê ïðîñòî, íóæíî åù¼ èçâëå÷ü èç ñòåêà ïàðàìåòðû è ðàñïîëîæèòüèõ â ðåãèñòðàõ, ïðè÷¼ì äëÿ ðàçëè÷íîãî êîëè÷åñòâà ïàðàìåòðîâ áóäóòçàäåéñòâîâàòüñÿ ðàçëè÷íûå íàáîðû ðåãèñòðîâ; ÷òîáû êîððåêòíî îáðàáîòàòü âñ¼ ýòî, íàì ïðèä¼òñÿ íàïèñàòü öåëûé ðÿä âëîæåííûõ äðóã â äðóãàäèðåêòèâ óñëîâíîé êîìïèëÿöèè, ñðàáàòûâàþùèõ â çàâèñèìîñòè îò êîëè÷åñòâà ïåðåäàííûõ ìàêðîñó ïàðàìåòðîâ.Ïîñëå âîçâðàòà èç ñèñòåìíîãî âûçîâà íàøè äåéñòâèÿ òàêæå ðàçëè÷àþòñÿ â çàâèñèìîñòè îò èñïîëüçóåìîé îïåðàöèîííîé ñèñòåìû.
 ñëó÷àåÎÑ Linux ðåçóëüòàò âûçîâà íàõîäèòñÿ â ðåãèñòðå EAX, îòðèöàòåëüíîå çíà147÷åíèå óêàçûâàåò íà âîçíèêøóþ îøèáêó, â ñòåêå íè÷åãî ëèøíåãî íåò. Âñëó÷àå ÎÑ FreeBSD íà îøèáêó óêàçûâàåò âçâåä¼ííûé ôëàã CF, â ðåãèñòðå EAX ìîæåò íàõîäèòüñÿ êàê ðåçóëüòàò, òàê è êîä îøèáêè, à â ñòåêåâñ¼ åù¼ ëåæàò ïàðàìåòðû âûçîâà, òàê ÷òî ñòåê íóæäàåòñÿ â î÷èñòêå. Ìûïîñòóïèì ñëåäóþùèì îáðàçîì: â ñëó÷àå ÎÑ Linux îñòàâèì âñ¼ êàê åñòü,â ñëó÷àå æå ÎÑ FreeBSD ïðîâåðèì ôëàã CF, è åñëè îí âçâåä¼í, èçìåíèìçíàê ðåãèñòðà EAX íà ïðîòèâîïîëîæíûé ñ ïîìîùüþ êîìàíäû neg.
Òàêèìîáðàçîì, íà âûõîäå ìû, êàê è äëÿ ÎÑ Linux, áóäåì èìåòü â EAX íåîòðèöàòåëüíîå çíà÷åíèå â ñëó÷àå óñïåõà è îòðèöàòåëüíîå â ñëó÷àå îøèáêè;ïîñëå ýòîãî ìû ñîâåðøåííî ñïîêîéíî ìîæåì èñïîðòèòü ñîäåðæèìîå ðåãèñòðà ôëàãîâ, ÷òî, êñòàòè, è ïðîèçîéä¼ò íà ñëåäóþùåé êîìàíäå ìûî÷èñòèì ñòåê îò íåíóæíûõ óæå ïàðàìåòðîâ îáû÷íîé êîìàíäîé add, êîòîðàÿ, êàê èçâåñòíî, âûñòàâëÿåò ôëàãè (âêëþ÷àÿ CF) óæå â ñîîòâåòñòâèèñî ñâîèì ðåçóëüòàòîì.Îêîí÷àòåëüíî íàø ìàêðîñ áóäåò âûãëÿäåòü òàê:%macrosyscall 1-*%rep %0%rotate -1push dword %1%endrep%ifdef OS_FREEBSDmov eax, [esp]int 80hjnc %%sc_okneg eax%%sc_ok:add esp, (%0-1)*4%elifdef OS_LINUXpop eax%if %0 > 1pop ebx%if %0 > 2pop ecx%if %0 > 3pop edx%if %0 > 4pop esi%if %0 > 5pop edi%if %0 > 6%error "Too many params for Linux syscall"%endif%endif%endif%endif148%endif%endifint 80h%else%error Please define either OS_LINUX or OS_FREEBSD%endif%endmacroÒåêñò ìàêðîñà, êîíå÷íî, ïîëó÷èëñÿ äîñòàòî÷íî äëèííûì, íî ýòî êîìïåíñèðóåòñÿ ñîêðàùåíèåì îáú¼ìà îñíîâíîãî êîäà.
Òàê, ðàññêàçûâàÿ î êîíâåíöèÿõ ñèñòåìíûõ âûçîâîâ, ìû ïðèâåëè êîä ïðîãðàììû, ïå÷àòàþùåé îäíó ñòðîêó, â âàðèàíòåäëÿ Linux (ñòð. 137) è FreeBSD (ñòð. 139). Ñ èñïîëüçîâàíèåì âûøåïðèâåä¼ííîãîìàêðîñà ìû ìîæåì íàïèñàòü òàê:sectionmsgmsg_lensectionglobal_start:.datadb "Hello world", 10equ $-msg.text_startsyscall 4, 1, msg, msg_lensyscall 1, 0è âñ¼, ïðè÷¼ì ýòà ïðîãðàììà áóäåò êîìïèëèðîâàòüñÿ è ïðàâèëüíî ðàáîòàòüïîä îáåèìè ñèñòåìàìè, íóæíî òîëüêî íå çàáûâàòü óêàçûâàòü NASM'ó ôëàã-dOS_LINUX èëè -dOS_FREEBSD.Âåðí¼ìñÿ ê íàøåé çàäà÷å êîïèðîâàíèÿ.  ïðîãðàììå íàì ïîòðåáóåòñÿ áóôåð äëÿ âðåìåííîãî õðàíåíèÿ äàííûõ, â êîòîðûé ìû áóäåì ñ÷èòûâàòü î÷åðåäíóþ ïîðöèþ äàííûõ èç ïåðâîãî ôàéëà, ÷òîáû çàòåì çàïèñàòü å¼ âî âòîðîé ôàéë.
Êðîìå òîãî, íàì áóäóò íóæíû ïåðåìåííûå äëÿõðàíåíèÿ äåñêðèïòîðîâ ôàéëîâ (õðàíèòü èõ â ðåãèñòðàõ áóäåò ñëîæíî,âåäü êàæäûé ñèñòåìíûé âûçîâ ìîæåò èñïîðòèòü çíà÷åíèÿ ðåãèñòðîâ);ñîîòâåòñòâóþùèå ïåðåìåííûå ìû íàçîâ¼ì fdsrc è fddest. Hàêîíåö, ìûäëÿ óäîáñòâà çàâåä¼ì ïåðåìåííûå äëÿ õðàíåíèÿ êîëè÷åñòâà ïàðàìåòðîâêîìàíäíîé ñòðîêè è àäðåñà íà÷àëà ìàññèâà óêàçàòåëåé íà ïàðàìåòðûêîìàíäíîé ñòðîêè, íàçâàâ ýòè ïåðåìåííûå argc è argvp. Âñå ýòè ïåðåìåííûå íå òðåáóþò íà÷àëüíûõ çíà÷åíèé è ìîãóò, òàêèì îáðàçîì, áûòüðàñïîëîæåíû â ñåêöèè .bss:sectionbufferbufsizefdsrcfddestargcargvp.bssresbequresdresdresdresd4096$-buffer1111Íàøà ïðîãðàììà ìîæåò îáíàðóæèòü îäíó èç òð¼õ îøèáîê: ïîëüçîâàòåëüìîæåò óêàçàòü íåïðàâèëüíîå êîëè÷åñòâî ïàðàìåòðîâ êîìàíäíîé ñòðîêè,149ìîæåò óêàçàòü íåñóùåñòâóþùèé èëè íåäîñòóïíûé ôàéë â êà÷åñòâå èñòî÷íèêà äàííûõ, ëèáî ìîæåò óêàçàòü â êà÷åñòâå öåëåâîãî òàêîé ôàéë,êîòîðûé ìû ïî êàêèì-òî ïðè÷èíàì íå ñìîæåì îòêðûòü íà çàïèñü.
Âïåðâîì ñëó÷àå ïîëüçîâàòåëþ ñëåäóåò îáúÿñíèòü, ñ êàêèìè ïàðàìåòðàìèñëåäóåò çàïóñêàòü íàøó ïðîãðàììó, â îñòàëüíûõ äâóõ ïðîñòî ñîîáùèòüî ïðîèñøåäøåé îøèáêå. Âñå òðè ñîîáùåíèÿ îá îøèáêàõ ìû ðàñïîëîæèìâ ñåêöèè .data â âèäå èíèöèàëèçèðîâàííûõ ïåðåìåííûõ:sectionhelpmsghelplenerr1msgerr1lenerr2msgerr2len.datadb 'Usage: copy <src> <dest>', 10equ $-helpmsgdb "Couldn't open source file for reading", 10equ $-err1msgdb "Couldn't open destination file for writing", 10equ $-err1msgÒåïåðü ìû ìîæåì ïðèñòóïèòü ê íàïèñàíèþ ñåêöèè .text, òî åñòü ñàìîéïðîãðàììû, è â ñàìîì íà÷àëå ìû ïðîâåðèì, ÷òî íàì ïåðåäàíî ðîâíî äâàïàðàìåòðà. Äëÿ ýòîãî ìû èçâëå÷¼ì èç ñòåêà ëåæàùåå íà åãî âåðøèíå÷èñëî, îáîçíà÷àþùåå êîëè÷åñòâî ýëåìåíòîâ êîìàíäíîé ñòðîêè, çàíåñ¼ìåãî â ïåðåìåííóþ argc.
Çàîäíî íà âñÿêèé ñëó÷àé ñîõðàíèì àäðåñ òåêóùåé âåðøèíû ñòåêà â ïåðåìåííîé argvp, íî èçâëåêàòü èç ñòåêà áîëüøåíè÷åãî íå áóäåì, òàê ÷òî â îáëàñòè ñòåêà ó íàñ îêàæåòñÿ ìàññèâ àäðåñîâñòðîêýëåìåíòîâ êîìàíäíîé ñòðîêè. Ïðîâåðèì, ÷òî â ïåðåìåííîé argcîêàçàëîñü ÷èñëî 3; ïðàâèëüíàÿ êîìàíäíàÿ ñòðîêà äîëæíà â íàøåì ñëó÷àåñîñòîÿòü èç òð¼õ ýëåìåíòîâ: èìåíè ñàìîé ïðîãðàììû è äâóõ ïàðàìåòðîâ. ñëó÷àå, åñëè êîëè÷åñòâî ïàðàìåòðîâ îêàæåòñÿ íåâåðíûì, íàïå÷àòàåìïîëüçîâàòåëþ ñîîáùåíèå îá îøèáêå è âûéäåì:section .textglobal _start_start:pop dword [argc]mov [argvp], espcmp dword [argc], 3je .args_count_oksyscall 4, 2, helpmsg, helplensyscall 1, 1.args_count_ok:Ñëåäóþùèì íàøèì äåéñòâèåì äîëæíî ñòàòü îòêðûòèå ôàéëà, èìÿ êîòîðîãî çàäàíî ïåðâûì ïàðàìåòðîì êîìàíäíîé ñòðîêè, íà ÷òåíèå.
Ìûïîìíèì, ÷òî â ïåðåìåííîé argvp íàõîäèòñÿ àäðåñ â ïàìÿòè (ñòåêîâîé),íà÷èíàÿ ñ êîòîðîãî ðàñïîëàãàþòñÿ àäðåñà ýëåìåíòîâ êîìàíäíîé ñòðîêè.Èçâëå÷¼ì àäðåñ èç argvp â ðåãèñòð ESI, çàòåì âîçüì¼ì ÷åòûð¼õáàéòíîå150çíà÷åíèå ïî àäðåñó [esi+4] ýòî è áóäåò àäðåñ ïåðâîãî ïàðàìåòðà êîìàíäíîé ñòðîêè, òî åñòü ñòðîêè, çàäàþùåé èìÿ ôàéëà, êîòîðûé íàäî ÷èòàòü è êîïèðîâàòü. Äëÿ õðàíåíèÿ àäðåñà âîñïîëüçóåìñÿ ðåãèñòðîì EDI,ïîñëå ÷åãî ñäåëàåì âûçîâ open. Íàì ïðèä¼òñÿ èñïîëüçîâàòü äâà ïàðàìåòðà ñîáñòâåííî àäðåñ èìåíè ôàéëà è ðåæèì åãî èñïîëüçîâàíèÿ, êîòîðûéáóäåò â äàííîì ñëó÷àå ðàâåí 0 (O_RDONLY).
Ðåçóëüòàò ðàáîòû ñèñòåìíîãî âûçîâà íàì îáÿçàòåëüíî íàäî áóäåò ïðîâåðèòü; íàïîìíèì, ÷òî íàøìàêðîñ syscall óñòðîåí òàê, ÷òîáû îòðèöàòåëüíîå çíà÷åíèå EAX óêàçûâàëî íà îøèáêó, à íåîòðèöàòåëüíîå íà óñïåøíîå âûïîëíåíèå âûçîâà; âïðèìåíåíèè ê âûçîâó open ðåçóëüòàòîì óñïåøíîãî åãî âûïîëíåíèÿ ÿâëÿåòñÿ äåñêðèïòîð íîâîãî ïîòîêà ââîäà-âûâîäà, â äàííîì ñëó÷àå ýòî ïîòîêââîäà, ñâÿçàííûé ñ êîïèðóåìûì ôàéëîì.  ñëó÷àå óñïåõà ñîõðàíèì ïîëó÷åííûé äåñêðèïòîð â ïåðåìåííîé fdsrc, â ñëó÷àå íåóäà÷è âûäàäèìñîîáùåíèå îá îøèáêå è âûéäåì.mov esi, [argvp]mov edi, [esi+4]syscall 5, edi, 0 ; O_RDONLYcmp eax, 0jge .source_open_oksyscall 4, 2, err1msg, err1lensyscall 1, 2.source_open_ok:mov [fdsrc], eaxÍàñòàëî âðåìÿ îòêðûòü âòîðîé ôàéë íà çàïèñü.
Äëÿ èçâëå÷åíèÿ åãî èìåíè èç ïàìÿòè âîñïîëüçóåìñÿ òî÷íî òàê æå ðåãèñòðàìè ESI è EDI, ïîñëå÷åãî âûïîëíèì ñèñòåìíûé âûçîâ open, â ñëó÷àå îøèáêè âûäàäèì ñîîáùåíèå è âûéäåì, â ñëó÷àå óñïåõà ñîõðàíèì äåñêðèïòîð â ïåðåìåííîé fddest.Âûçîâ open â ýòîò ðàç áóäåò íåñêîëüêî ñëîæíåå. Âî-ïåðâûõ, ðåæèì îòêðûòèÿ íà ýòîò ðàç çàäà¼òñÿ ôëàæêàìè O_WRONLY, O_CREAT è O_TRUNC,äâà èç êîòîðûõ, êàê ýòî îáñóæäàëîñü íà ñòð.
141, èìåþò ðàçëè÷íûå ÷èñëîâûå çíà÷åíèÿ â ÎÑ Linux è ÎÑ FreeBSD. Âî-âòîðûõ, ïîñêîëüêó â ýòîòðàç âîçìîæíî ñîçäàíèå íîâîãî ôàéëà, íàø ñèñòåìíûé âûçîâ äîëæåí ïîëó÷èòü åù¼ è òðåòèé ïàðàìåòð, êîòîðûé, êàê ìû ðàíåå îòìå÷àëè, îáû÷íîðàâåí 666o. Ñ ó÷¼òîì âñåãî ýòîãî ïîëó÷èòñÿ òàêîé êîä:mov esi, [argvp]mov edi, [esi+8]%ifdef OS_LINUXsyscall 5, edi, 241h, 0666o%else; assume it's FreeBSDsyscall 5, edi, 601h, 0666o%endifcmp eax, 0151jge .dest_open_oksyscall 4, 2, err2msg, err2lensyscall 1, 3.dest_open_ok:mov [fddest], eaxÍàêîíåö, íàïèøåì îñíîâíîé öèêë.  í¼ì ìû áóäåì âûïîëíÿòü ÷òåíèåèç ïåðâîãî ôàéëà, àíàëèçèðîâàòü åãî ðåçóëüòàò, è åñëè äîñòèãíóò êîíåöôàéëà (â EAX çíà÷åíèå 0) èëè ïðîèçîøëà îøèáêà (îòðèöàòåëüíîå çíà÷åíèå), òî áóäåì âûõîäèòü èç öèêëà, íó à åñëè ÷òåíèå ïðîøëî óñïåøíî, òîíóæíî áóäåò çàïèñàòü âñ¼ ïðî÷èòàííîå (òî åñòü ñòîëüêî áàéòîâ èç îáëàñòè ïàìÿòü buffer, êàêîå ÷èñëî ñîäåðæèòñÿ â EAX) âî âòîðîé ôàéë..again: syscall 3, [fdsrc], buffer, bufsizecmp eax, 0jle .end_of_filesyscall 4, [fddest], buffer, eaxjmp .againÂûõîä èç öèêëà ìû ïðîèçâîäèëè ïåðåõîäîì íà ìåòêó end_of_file; ðàíîèëè ïîçäíî íàøà ïðîãðàììà, äîñòèãíóâ êîíöà ïåðâîãî ôàéëà, ïåðåéä¼òíà ýòó ìåòêó, ïîñëå ÷åãî íàì îñòàíåòñÿ òîëüêî çàêðûòü îáà ôàéëà âûçîâîì close è çàâåðøèòü ïðîãðàììó:.end_of_file:syscall 6, [fdsrc]syscall 6, [fddest]syscall 1, 0Îòìåòèì, ÷òî âñå ìåòêè â îñíîâíîé ïðîãðàììå, êðîìå ìåòêè _start, ìûñäåëàëè ëîêàëüíûìè (èõ èìåíà íà÷èíàþòñÿ ñ òî÷êè).
Òàê äåëàòü íå îáÿçàòåëüíî, íî òàêîé ïîäõîä ê ìåòêàì (âñå ìåòêè, ê êîòîðûì íå ïðåäïîëàãàåòñÿ îáðàùàòüñÿ îòêóäà-òî èçäàëåêà, äåëàòü ëîêàëüíûìè) ïîçâîëÿåò âáîëåå êðóïíûõ ïðîãðàììàõ èçáåæàòü ïðîáëåì ñ êîíôëèêòàìè èì¼í.152Ãëàâà 5. Ðàçäåëüíàÿòðàíñëÿöèÿ 5.1. ×òî òàêîå ìîäóëè è çà÷åì îíè íóæíûÄî ñèõ ïîð âñå ïðîãðàììû, êîòîðûå ìû ïèñàëè íà ÿçûêå àññåìáëåðà,óìåùàëèñü â îäíîì ôàéëå. Èíîãäà ìû èñïîëüçîâàëè íåñêîëüêî ôàéëîâ,íî ñîåäèíåíèå èõ âîåäèíî ïðîèçâîäèëîñü íà ýòàïå ìàêðîïðîöåññèðîâàíèÿ, òî åñòü åù¼ äî íà÷àëà ïåðåâîäà ïðîãðàììû â ìàøèííûé êîä.Ïîêà èñõîäíûé òåêñò ïðîãðàììû ñîñòîèò èç íåñêîëüêèõ äåñÿòêîâñòðîê, åãî äåéñòâèòåëüíî óäîáíåå âñåãî õðàíèòü â îäíîì ôàéëå.