А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 36
Текст из файла (страница 36)
Ïîñëåâûõîäà èç öèêëà à êîíåö áóôåðà çàïèñûâàåòñÿ îãðàíè÷èòåëüíûé íóëåâîé áàéò.  ñëó÷àå, åñëè ïðè÷èíîé âûõîäà èç öèêëà áûë ïðî÷èòàííûéêîä ñèìâîëà ïåðåâîäà ñòðîêè, íóëåâîé áàéò çàïèñûâàåòñÿ íà åãî ìåñòî,÷òîáû â áóôåðå íèêàêèõ ïåðåâîäîâ ñòðîêè íå ñîäåðæàëîñü; ýòî äîñòèãàåòñÿ óìåíüøåíèåì ïåðåìåííîé I ïåðåä âûõîäîì èç öèêëà.Ïîëíîñòüþ òåêñò ìîäóëÿ getstr.asm áóäåò âûãëÿäåòü òàê:%include "syscall.inc"global getstr; íóæåí ìàêðîñ syscall; ìîäóëü îïèñûâàåò getstrsection .text; procedure getstr; [ebp+8] = address of buffer; [ebp+12] = length of buffergetstr: push ebp;mov ebp, esp;sub esp, 4;xor eax, eax;mov [ebp-4], eax;.again:;mov eax, [ebp+8];add eax, [ebp-4];syscall 3, 0, eax, 1 ;cmp eax, 1;jne .eol;mov eax, [ebp+8];add eax, [ebp-4];mov bl, [eax];cmp bl, 10;jne .noeol;dec dword [ebp-4];jmp .eol;.noeol: mov eax, [ebp-4];ñòàíäàðòíîå íà÷àëîïîäïðîãðàììûìåñòî ïîä ïåðåìåííóþ Ieax:=0I:=0íà÷àëî ãëàâíîãî öèêëàçàíîñèì àäðåñ â EAXïðèáàâëÿåì ê íåìó Iâûçûâàåì readâåðíóë ëè îí 1?íåò - âûéòè èç öèêëàçàíîñèì àäðåñ â EAXïðèáàâëÿåì ê íåìó Iñ÷èòàííûé áàéò (â BL)ðàâåí 10?íåò - ïåðåïðûãèâàåìäà - óìåíüøàåì Iè âûõîäèì èç öèêëàçàãðóæàåì I158.eol:inccmpjaeincjmpmovaddincxormovmovpopreteaxeax, [ebp+12].eoldword [ebp-4].againeax, [ebp+8]eax, [ebp-4]eaxbl, bl[eax], blesp, ebpebp;;;;;;;;;;;;òåïåðü â EAX çí.
I+1íå ïðåâûøàåò ëè arg2?äà - âûõîäèì èç öèêëàóâåëè÷èâàåì Iïðîäîëæàåì öèêëçàãðóæàåì àäðåñ â EAXïðèáàâëÿåì Iïðèáàâëÿåì 1îáíóëÿåì BLçàíîñèì 0 â êîíåö ñòðîêèñòàíäàðòíûé âûõîäèç ïîäïðîãðàììûÍàïèøåì òåïåðü ñàìûé ïðîñòîé èç íàøèõ ìîäóëåé quit.asm:%include "syscall.inc"global quitsection .textquit:syscall 1, 0Âñå ïîäïðîãðàììû ãîòîâû, è ìû ìîæåì ïðèñòóïàòü ê íàïèñàíèþ ãîëîâíîãî ìîäóëÿ, êîòîðûé ìû íàçîâ¼ì greet.asm. Ïîñêîëüêó âñå îáðàùåíèÿ ê ñèñòåìíûì âûçîâàì ìû âûíåñëè â ïîäïðîãðàììû, â ãîëîâíîì ìîäóëå ìàêðîñ syscall (à, çíà÷èò, è âêëþ÷åíèå ôàéëà syscall.inc) íàì íåïîíàäîáèòñÿ.
Òåêñò âûäàâàåìûõ ïðîãðàììîé ñîîáùåíèé ìû îïèøåì, êàêîáû÷íî, â âèäå èíèöèàëèçèðîâàííûõ ñòðîê â ñåêöèè .data; íàäî òîëüêîíå çàáûâàòü, ÷òî â ýòîé ïðîãðàììå âñå ñòðîêè äîëæíû èìåòü îãðàíè÷èâàþùèé èõ íóëåâîé áàéò. Áóôåð äëÿ ÷òåíèÿ ñòðîêè ìû ðàçìåñòèì âñåêöèè .bss. ×òî êàñàåòñÿ ñåêöèè .text, òî îíà áóäåò ñîñòîÿòü èç ñïëîøíûõ âûçîâîâ ïîäïðîãðàìì.globalexternexternextern_startputstrgetstrquitsectionnmqpmyexc.datadbdbdbsection .bssbufresbbuflen equ; ýòî ãîëîâíîé ìîäóëü; îí èñïîëüçóåò ïîäïðîãðàììû; putstr, getstr è quit; îïèñûâàåì òåêñò ñîîáùåíèé'Hi, what is your name?', 10, 0'Pleased to meet you, dear ', 0'!', 10, 0512$-buf; âûäåëÿåì ïàìÿòü ïîä áóôåðsection .text159_start: push dword nmqcall putstradd esp, 4push dword buflenpush dword bufcall getstradd esp, 8push dword pmycall putstradd esp, 4push dword bufcall putstradd esp, 4push dword exccall putstradd esp, 4call quit; íà÷àëî ãîëîâíîé ïðîãðàììû; âûçûâàåì putstr äëÿ nmq; âûçûâàåì getstr; ñ ïàðàìåòðàìè buf è;buflen; âûçûâàåì putstr äëÿ pmy; âûçûâàåì putstr äëÿ;ñòðîêè, ââåä¼ííîé;ïîëüçîâàòåëåì; âûçûâàåì putstr äëÿ exc; âûçûâàåì quitÈòàê, â íàøåé ðàáî÷åé äèðåêòîðèè òåïåðü íàõîäÿòñÿ ôàéëû syscall.inc, strlen.asm, putstr.asm, getstr.asm, quit.asm ègreet.asm.
×òîáû ïîëó÷èòü ðàáî÷óþ ïðîãðàììó, íàì ïîíàäîáèòñÿîòäåëüíî âûçâàòü NASM äëÿ êàæäîãî èç ìîäóëåé (íàïîìíèì, ÷òîsyscall.inc ìîäóëåì íå ÿâëÿåòñÿ):nasmnasmnasmnasmnasm-f-f-f-f-felfelfelfelfelf-dOS_LINUX-dOS_LINUX-dOS_LINUX-dOS_LINUX-dOS_LINUXstrlen.asmputstr.asmgetstr.asmquit.asmgreet.asmÎòìåòèì, ÷òî ôëàæîê -dOS_LINUX íåîáõîäèì òîëüêî äëÿ òåõ ìîäóëåé, êîòîðûåèñïîëüçóþò syscall.inc, òàê ÷òî ìû ìîãëè áû ïðè êîìïèëÿöèè strlen.asm ègreet.asm åãî íå óêàçûâàòü.
Îäíàêî ïðàêòèêà ïîêàçûâàåò, ÷òî ïðîùå óêàçûâàòüòàêèå ôëàæêè âñåãäà, íåæåëè ÷åì ïîìíèòü, äëÿ êàêèõ ìîäóëåé îíè íóæíû, à äëÿêàêèõ íåò.Ðåçóëüòàòîì ðàáîòû NASM ñòàíóò ïÿòü ôàéëîâ ñ ñóôôèêñîì ¾.o¿,ïðåäñòàâëÿþùèå ñîáîé îáúåêòíûå ìîäóëè íàøåé ïðîãðàììû. ×òîáû îáúåäèíèòü èõ â èñïîëíÿåìûé ôàéë, ìû âûçîâåì ðåäàêòîð ñâÿçåé ld:ld greet.o strlen.o getstr.o putstr.o quit.o -o greetÐåçóëüòàòîì íà ñåé ðàç ñòàíåò èñïîëíÿåìûé ôàéë greet, êîòîðûé ìû,êàê îáû÷íî, çàïóñòèì íà èñïîëíåíèå êîìàíäîé ./greet.160 5.4. Îáúåêòíûé êîä è ìàøèííûé êîäÈç ïðèâåä¼ííûõ âûøå ïðèìåðîâ âèäíî, ÷òî êàæäûé îáúåêòíûé ìîäóëü, êðîìå âñåãî ïðî÷åãî, õàðàêòåðèçóåòñÿ ñïèñêîì ñèìâîëîâ (â òåðìèíàõ àññåìáëåðà ìåòîê), êîòîðûå îí ïðåäîñòàâëÿåò äðóãèì ìîäóëÿì,à òàêæå ñïèñêîì ñèìâîëîâ, êîòîðûå åìó ñàìîìó äîëæíû áûòü ïðåäîñòàâëåíû äðóãèìè ìîäóëÿìè.
Áóêâàëüíî ïåðåâåäÿ ñ àíãëèéñêîãî ÿçûêàíàçâàíèÿ ñîîòâåòñòâóþùèõ äèðåêòèâ (global è extern), ìû ìîæåì íàçâàòü òàêèå ñèìâîëû ¾ãëîáàëüíûìè¿ è ¾âíåøíèìè¿; ÷àùå, îäíàêî, èõíàçûâàþò ¾ýêñïîðòèðóåìûìè¿ è ¾èìïîðòèðóåìûìè¿.ßñíî, ÷òî ïðè òðàíñëÿöèè èñõîäíîãî òåêñòà àññåìáëåð, âèäÿ îáðàùåíèå ê âíåøíåé ìåòêå, íå ìîæåò çàìåíèòü ýòó ìåòêó êîíêðåòíûì àäðåñîì, ïîñêîëüêó ýòîò àäðåñ åìó íå èçâåñòåí âåäü ìåòêà îïðåäåëåíà âäðóãîì ìîäóëå, êîòîðîãî àññåìáëåð íå âèäèò.
Òàêèì îáðàçîì, âñ¼, ÷òîìîæåò ñäåëàòü àññåìáëåð ýòî îñòàâèòü ïîä òàêîé àäðåñ ñâîáîäíîå ìåñòî â èòîãîâîì êîäå è çàïèñàòü â îáúåêòíûé ôàéë èíôîðìàöèþ, êîòîðàÿïîçâîëèò ðåäàêòîðó ñâÿçåé ðàññòàâèòü âñå òàêèå ¾ïðîïóùåííûå¿ àäðåñà,êîãäà èõ çíà÷åíèÿ óæå áóäóò èçâåñòíû. Ïðè áëèæàéøåì ðàññìîòðåíèèîêàçûâàåòñÿ, ÷òî çàìåíèòü ìåòêè êîíêðåòíûìè àäðåñàìè àññåìáëåð íåìîæåò íå òîëüêî â ñëó÷àå îáðàùåíèé ê âíåøíèì ìåòêàì, íî âîîáùå íèêîãäà. Äåëî â òîì, ÷òî, êîëü ñêîðî ïðîãðàììà ñîñòîèò èç íåñêîëüêèõ(ñêîëüêè óãîäíî) ìîäóëåé, àññåìáëåð ïðè òðàíñëÿöèè îäíîãî èç íèõ íèêàê íå ìîæåò ïðåäóãàäàòü, êàêèì ïî ñ÷¼òó ýòîò ìîäóëü áóäåò ñòîÿòü âèòîãîâîé ïðîãðàììå, êàêîãî ðàçìåðà áóäóò âñå ïðåäøåñòâóþùèå ìîäóëèè, òàêèì îáðàçîì, íå ìîæåò çíàòü, â êàêîé îáëàñòè ïàìÿòè (äàæå âèðòóàëüíîé) áóäåò ðàñïîëàãàòüñÿ òîò êîä, êîòîðûé àññåìáëåð â íàñòîÿùååâðåìÿ ãåíåðèðóåò.Ñ äðóãîé ñòîðîíû, èçâåñòíî, ÷òî ðåäàêòîð ñâÿçåé íå âèäèò èñõîäíûõòåêñòîâ ìîäóëåé, äà è íå ìîæåò èõ âèäåòü, ïîñêîëüêó ïðåäíàçíà÷åí äëÿñâÿçè ìîäóëåé, ïîëó÷åííûõ ðàçëè÷íûìè êîìïèëÿòîðàìè èç èñõîäíûõòåêñòîâ íà, âïîëíå âîçìîæíî, ðàçíûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ.
Ñëåäîâàòåëüíî, âñÿ èíôîðìàöèÿ, íåîáõîäèìàÿ äëÿ îêîí÷àòåëüíîãî ïðåâðàùåíèÿ îáúåêòíîãî êîäà â èñïîëíÿåìûé ìàøèííûé, äîëæíà áûòü çàïèñàíà âîáúåêòíûé ôàéë. Òàêèì îáðàçîì, îáúåêòíûé êîä, êîòîðûé ïîëó÷àåòñÿ âêà÷åñòâå ðåçóëüòàòà àññåìáëèðîâàíèÿ, ïðåäñòàâëÿåò ñîáîé íåêèé ¾ïîëóôàáðèêàò¿ ìàøèííîãî êîäà, â êîòîðîì âìåñòî àáñîëþòíûõ (÷èñëîâûõ)àäðåñîâ íàõîäèòñÿ íåêàÿ èíôîðìàöèÿ î òîì, êàê ýòè àäðåñà âû÷èñëèòüè â êàêèå ìåñòà êîäà èõ ñëåäóåò ðàññòàâèòü.Îòìåòèì, ÷òî èíôîðìàöèþ î ñèìâîëàõ, ñîäåðæàùèõñÿ â îáúåêòíîìôàéëå, ìîæíî óçíàòü ñ ïîìîùüþ ïðîãðàììû nm.  êà÷åñòâå óïðàæíåíèÿïîïðîáóéòå ïðèìåíèòü ýòó ïðîãðàììó ê îáúåêòíûì ôàéëàì íàïèñàííûõâàìè ìîäóëåé (ëèáî ìîäóëåé èç ïðèâåä¼ííûõ âûøå ïðèìåðîâ) è ïîïûòàòüñÿ ïðîèíòåðïðåòèðîâàòü ðåçóëüòàòû.161 5.5. Áèáëèîòåêè×àùå âñåãî ïðîãðàììû ïèøóòñÿ íå ¾ñ àáñîëþòíîãî íóëÿ¿, êàê ýòî âáîëüøèíñòâå ïðèìåðîâ äåëàëè ìû, à èñïîëüçóþò êîìïëåêòû óæå ãîòîâûõ ïîäïðîãðàìì, îôîðìëåííûå â âèäå áèáëèîòåê.
Åñòåñòâåííî, òàêèåïîäïðîãðàììû âõîäÿò â ñîñòàâ ìîäóëåé, à ñàìè ìîäóëè óäîáíåå èìåòü âçàðàíåå îòêîìïèëèðîâàííîì âèäå, ÷òîáû íå òðàòèòü âðåìÿ íà èõ êîìïèëÿöèþ; ðàçóìååòñÿ, ïîëåçíî èìåòü â äîñòóïíîñòè è èñõîäíûå òåêñòûýòèõ ìîäóëåé, íî â çàðàíåå îòêîìïèëèðîâàííîé ôîðìå áèáëèîòåêè èñïîëüçóþòñÿ ÷àùå. Âîîáùå ãîâîðÿ, ðàçëè÷àþò ïðîãðàììíûå áèáëèîòåêèðàçíûõ âèäîâ; íàïðèìåð, áûâàþò áèáëèîòåêè ìàêðîñîâ, êîòîðûå, åñòåñòâåííî, íå ìîãóò áûòü çàðàíåå îòêîìïèëèðîâàíû è ñóùåñòâóþò òîëüêîâ âèäå èñõîäíûõ òåêñòîâ. Çäåñü ìû, îäíàêî, ðàññìîòðèì áîëåå óçêîå ïîíÿòèå, à èìåííî òî, ÷òî ïîä òåðìèíîì ¾áèáëèîòåêà¿ ïîíèìàåòñÿ íà óðîâíåðåäàêòîðà ñâÿçåé.Ñ òåõíè÷åñêîé òî÷êè çðåíèÿ áèáëèîòåêà ïîäïðîãðàìì ýòî ôàéë,îáúåäèíÿþùèé â ñåáå íåêîòîðîå êîëè÷åñòâî îáúåêòíûõ ìîäóëåé è, êàêïðàâèëî, ñîäåðæàùèé òàáëèöû äëÿ óñêîðåííîãî ïîèñêà èì¼í ñèìâîëîâ âýòèõ ìîäóëÿõ.Íåîáõîäèìî îòìåòèòü îäíî âàæíåéøåå ñâîéñòâî îáúåêòíûõ ôàéëîâ:êàæäûé èç íèõ ìîæåò áûòü âêëþ÷¼í â èòîãîâóþ ïðîãðàììó òîëüêî öåëèêîì ëèáî íå âêëþ÷¼í âîîáùå.
Ýòî îçíà÷àåò, íàïðèìåð, ÷òî åñëè âûîáúåäèíèëè â îäíîì ìîäóëå íåñêîëüêî ïîäïðîãðàìì, à êîìó-òî ïîòðåáîâàëàñü ëèøü îäíà èç íèõ, â èñïîëíÿåìûé ôàéë âñ¼ ðàâíî âîéä¼ò êîä âñåãîâàøåãî ìîäóëÿ (òî åñòü âñåõ ïîäïðîãðàìì). Ýòî íåîáõîäèìî ó÷èòûâàòüïðè ðàçáèåíèè áèáëèîòåêè íà ìîäóëè; òàê, ñèñòåìíûå áèáëèîòåêè, ïîñòàâëÿåìûå âìåñòå ñ îïåðàöèîííûìè ñèñòåìàìè, êîìïèëÿòîðàìè è ò. ï.,îáû÷íî ñòðîÿòñÿ ïî ïðèíöèïó ¾îäíà ôóíêöèÿ îäèí ìîäóëü¿.Äëÿ ïîñòðîåíèÿ áèáëèîòåêè èç îòäåëüíûõ îáúåêòíûõ ìîäóëåé íåîáõîäèìî èñïîëüçîâàòü ñïåöèàëüíî ïðåäíàçíà÷åííûå äëÿ ýòîãî ïðîãðàììû. ÎÑ Unix ñîîòâåòñòâóþùàÿ ïðîãðàììà íàçûâàåòñÿ ar.
Èçíà÷àëüíî å¼ïðåäíàçíà÷åíèå íå îãðàíè÷èâàëîñü ñîçäàíèåì áèáëèîòåê (ñàìî íàçâàíèåar îçíà÷àåò ¾àðõèâàòîð¿), òàê ÷òî ïðè âûçîâå ïðîãðàììû íåîáõîäèìîóêàçàòü ñ ïîìîùüþ ïàðàìåòðà êîìàíäíîé ñòðîêè, ÷åãî ìû îò íå¼ äîáèâàåìñÿ. Òàê, åñëè áû ìû çàõîòåëè îáúåäèíèòü â áèáëèîòåêó âñå ìîäóëèïðîãðàììû greet (êðîìå, ðàçóìååòñÿ, ãëàâíîãî ìîäóëÿ, êîòîðûé íå ìîæåò áûòü èñïîëüçîâàí â äðóãèõ ïðîãðàììàõ), ýòî ìîæíî áûëî áû ñäåëàòüñëåäóþùåé êîìàíäîé:ar crs libgreet.a strlen.o getstr.o putstr.o quit.oÐåçóëüòàòîì ñòàíåò ôàéë libgreet.a; ýòî è åñòü áèáëèîòåêà. Ïîñëå ýòîãî ñêîìïîíîâàòü ïðîãðàììó greet ñ ïîìîùüþ ðåäàêòîðà ñâÿçåé ìîæíî,íàïðèìåð, òàê:162ld greet.o libgreet.aèëè òàê:ld greet.o -l greet -L . îòëè÷èå îò ìîíîëèòíîãî îáúåêòíîãî ôàéëà, áèáëèîòåêà, áóäó÷è óïàêîâàííîé â îäèí ôàéë, ïðîäîëæàåò, òåì íå ìåíåå, áûòü èìåííî íàáîðîìîáúåêòíûõ ìîäóëåé, èç êîòîðûõ ðåäàêòîð ñâÿçåé âûáèðàåò òîëüêî òå, êîòîðûå åìó íóæíû äëÿ óäîâëåòâîðåíèÿ íåðàçðåø¼ííûõ ññûëîê.
Ïîäðîáíåå îá ýòîì ìû ðàññêàæåì â ñëåäóþùåì ïàðàãðàôå. 5.6. Àëãîðèòì ðàáîòû ðåäàêòîðà ñâÿçåéÐåäàêòîðó ñâÿçåé â êîìàíäíîé ñòðîêå óêàçûâàåòñÿ ñïèñîê îáúåêòîâ,êàæäûé èç êîòîðûõ ìîæåò áûòü ëèáî îáúåêòíûì ôàéëîì, ëèáî áèáëèîòåêîé, ïðè ýòîì îáúåêòíûå ôàéëû ìîãóò áûòü çàäàíû òîëüêî ïî èìåíèôàéëà, òîãäà êàê áèáëèîòåêè ìîãóò çàäàâàòüñÿ äâóìÿ ñïîñîáàìè: ëèáîÿâíûì óêàçàíèåì èìåíè ôàéëà, ëèáî ñ ïîìîùüþ ôëàãà -l óêàçàíèåì èìåíè áèáëèîòåêè , êîòîðîå ìîæåò óïðîù¼ííî ïîíèìàòüñÿ êàê èìÿôàéëà áèáëèîòåêè, îò êîòîðîãî îòáðîøåíû ïðåôèêñ lib è ñóôôèêñ .a1 .Òàê, â ïðèìåðå èç ïðåäûäóùåãî ïàðàãðàôà ôàéë áèáëèîòåêè íàçûâàëñÿlibgreet.a, à ñîîòâåòñòâóþùåå èìÿ áèáëèîòåêè ïðåäñòàâëÿëî ñîáîé ñëîâî greet.