А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 9
Текст из файла (страница 9)
Ïîñëå îêîí÷àíèÿ öèêëà íàøà èñõîäíàÿ çàäà÷à îêàçûâàåòñÿ ðåøåíà, è, ñòàëî áûòü, ïðîãðàììó òîæå ïîðà çàâåðøàòü. Äëÿ ýòîãîè ïðåäíàçíà÷åíà ñëåäóþùàÿ ñòðîêà ïðîãðàììû:FINISHÑëîâî FINISH òîæå îáîçíà÷àåò ìàêðîñ; ýòîò ìàêðîñ ðàçâîðà÷èâàåòñÿ â ïîñëåäîâàòåëüíîñòü êîìàíä, îñóùåñòâëÿþùèõ îáðàùåíèå ê îïåðàöèîííîéñèñòåìå ñ ïðîñüáîé çàâåðøèòü âûïîëíåíèå íàøåé ïðîãðàììû.Íàì îñòàëîñü âåðíóòüñÿ ê íà÷àëó ïðîãðàììû è ðàññìîòðåòü ñòðîêóglobal_startÑëîâî global ýòî äèðåêòèâà, êîòîðàÿ òðåáóåò îò àññåìáëåðà ñ÷èòàòüíåêîòîðóþ ìåòêó ¾ãëîáàëüíîé¿, òî åñòü êàê áû âèäèìîé èçâíå (åñëè ãîâîðèòü ñòðîãî, âèäèìîé èçâíå îáúåêòíîãî ìîäóëÿ; ýòî ïîíÿòèå ìû áóäåì ðàññìàòðèâàòü ïîçäíåå).
 äàííîì ñëó÷àå ¾ãëîáàëüíîé¿ îáúÿâëÿåòñÿìåòêà _start. Êàê ìû óæå çíàåì, ýòî ñïåöèàëüíàÿ ìåòêà, êîòîðîé ïîìå÷àåòñÿ òî÷êà âõîäà â ïðîãðàììó , òî åñòü òî ìåñòî â ïðîãðàììå, êóäàîïåðàöèîííàÿ ñèñòåìà äîëæíà ïåðåäàòü óïðàâëåíèå ïîñëå çàãðóçêè ïðîãðàììû â îïåðàòèâíóþ ïàìÿòü. ßñíî, ÷òî ýòà ìåòêà äîëæíà áûòü âèäíàèçâíå, ÷òî è äîñòèãàåòñÿ äèðåêòèâîé global.Èòàê, íàøà ïðîãðàììà ñîñòîèò èç òð¼õ ÷àñòåé: ïîäãîòîâêè, öèêëà, íà÷àëî êîòîðîãî îòìå÷åíî ìåòêîé again, è çàâåðøàþùåé ÷àñòè, ñîñòîÿùåéèç îäíîé ñòðî÷êè FINISH. Ïåðåä íà÷àëîì öèêëà ìû çàíîñèì â ðåãèñòðEAX ÷èñëî 0, çàòåì íà êàæäîé èòåðàöèè öèêëà ïå÷àòàåì ñëîâî ¾Hello¿,äåëàåì ïåðåâîä ñòðîêè, óâåëè÷èâàåì íà åäèíèöó ñîäåðæèìîå ðåãèñòðàEAX, ñðàâíèâàåì åãî ñ ÷èñëîì 5; åñëè â ðåãèñòðå EAX âñ¼ åù¼ ñîäåðæèòñÿ÷èñëî, ìåíüøåå ïÿòè, ïåðåõîäèì ñíîâà ê íà÷àëó öèêëà (òî åñòü íà ìåòêóagain), â ïðîòèâíîì ñëó÷àå âûõîäèì èç öèêëà è çàâåðøàåì âûïîëíåíèåïðîãðàììû.×òîáû ïîïðîáîâàòü ïðèâåä¼ííóþ ïðîãðàììó, êàê ãîâîðèòñÿ, â äåëå,íåîáõîäèìî âîéòè â ñèñòåìó Unix, âîîðóæèòüñÿ êàêèì-íèáóäü ðåäàêòîðîì òåêñòîâ, íàáðàòü âûøåïðèâåä¼ííóþ ïðîãðàììó è ñîõðàíèòü å¼ â ôàé30ëå ñ èìåíåì, çàêàí÷èâàþùèìñÿ20 íà .asm èìåííî òàê îáû÷íî íàçûâàþòôàéëû, ñîäåðæàùèå èñõîäíûé òåêñò íà ÿçûêå àññåìáëåðà.Äîïóñòèì, ìû ñîõðàíèëè òåêñò ïðîãðàììû â ôàéëå hello5.asm.
Äëÿïîëó÷åíèÿ èñïîëíÿåìîãî ôàéëà íàì íåîáõîäèìî âûïîëíèòü äâà äåéñòâèÿ. Ïåðâîå ýòî âûçîâ àññåìáëåðà NASM, êîòîðûé, èñïîëüçóÿ çàäàííûé íàìè èñõîäíûé òåêñò, ïîñòðîèò îáúåêòíûé ìîäóëü. Îáúåêòíûéìîäóëü ýòî åù¼ íå èñïîëíÿåìûé ôàéë; äåëî â òîì, ÷òî áîëüøèå ïðîãðàììû îáû÷íî ñîñòîÿò èç öåëîãî íàáîðà èñõîäíûõ ôàéëîâ, íàçûâàåìûõìîäóëÿìè , ïëþñ ê òîìó ìû ìîæåì çàõîòåòü âîñïîëüçîâàòüñÿ ÷üèìèòî ñòîðîííèìè ïîäïðîãðàììàìè, îáúåäèí¼ííûìè â áèáëèîòåêè .
Òàêèìîáðàçîì, íàì íóæíî áóäåò ñîåäèíèòü íåñêîëüêî ìîäóëåé âîåäèíî è ïîäêëþ÷èòü ê íèì áèáëèîòåêè; ýòèì çàíèìàåòñÿ ñèñòåìíûé êîìïîíîâùèê , òàêæå íàçûâàåìûé èíîãäà ðåäàêòîðîì ñâÿçåé èëè ëèíêåðîì .Íàøà ïðèìåðíàÿ ïðîãðàììà ñîñòîèò âñåãî èç îäíîãî ìîäóëÿ è íå íóæäàåòñÿ íè â êàêèõ áèáëèîòåêàõ, íî ñòàäèè ñáîðêè (êîìïîíîâêè) ýòî íåèñêëþ÷àåò. Ýòî è åñòü âòîðîå äåéñòâèå, íåîáõîäèìîå äëÿ ïîñòðîåíèÿ èñïîëíÿåìîãî ôàéëà: íåáõîäèìî âûçâàòü êîìïîíîâùèê, ÷òîáû îí íàì èçîáúåêòíîãî ôàéëà ïîñòðîèë ôàéë èñïîëíÿåìûé. Êàê ðàç íà ýòîé ñòàäèèáóäåò èñïîëüçîâàíà ìåòêà _start; ìû ìîæåì óòî÷íèòü, ÷òî äèðåêòèâàglobal íå ïðîñòî äåëàåò ìåòêó ¾âèäèìîé èçâíå¿, à çàñòàâëÿåò àññåìáëåðâñòàâèòü â îáúåêòíûé ôàéë èíôîðìàöèþ îá ýòîé ìåòêå, âèäèìóþ äëÿêîìïîíîâùèêà.Èòàê, äëÿ íà÷àëà âûçûâàåì àññåìáëåð NASM:nasm -f elf hello5.asmÔëàæîê ¾-f elf¿ óêàçûâàåò àññåìáëåðó, ÷òî íà âûõîäå ìû îæèäàåì îáúåêòíûé ôàéë â ôîðìàòå ELF èìåííî ýòîò ôîðìàò èñïîëüçóåòñÿ â íàøåé ñèñòåìå äëÿ èñïîëíÿåìûõ ôàéëîâ21 .
Ðåçóëüòàòîì çàïóñêà àññåìáëåðà ñòàíåò ôàéë hello5.o, ñîäåðæàùèé îáúåêòíûé ìîäóëü. Òåïåðü ìûìîæåì çàïóñòèòü êîìïîíîâùèê, êîòîðûé íàçûâàåòñÿ ld:ld hello5.o -o hello5Åñëè âû ðàáîòàåòå ïîä óïðàâëåíèåì 64-áèòíîé îïåðàöèîííîé ñèñòåìû, ïðèä¼òñÿ äîáàâèòü åù¼ îäèí êëþ÷ äëÿ êîìïîíîâùèêà, ÷òîáû òîò ïðîèçâ¼ë ñáîðêó 32áèòíîãî èñïîëíÿåìîãî ôàéëà; â ÷àñòíîñòè, äëÿ GNU ld ïîä Linux ýòî áóäåò âûãëÿäåòü òàê:20 Ðàáîòàÿ â ñèñòåìå ñåìåéñòâà Windows, ìû, âîçìîæíî, ñêàçàëè áû, ÷òî .asm ýòî ¾ðàñøèðåíèå¿ ôàéëà.  ÎÑ Unix ïîíÿòèå ¾ðàñøèðåíèÿ¿ îáû÷íî íå èñïîëüçóåòñÿ,âìåñòî íåãî ìû ãîâîðèì, ÷òî èìÿ çàêàí÷èâàåòñÿ íà .asm èëè ÷òî èìÿ èìååò ñóôôèêñ.asm.21 Ýòî âåðíî ïî êðàéíåé ìåðå äëÿ ñîâðåìåííûõ âåðñèé îïåðàöèîííûõ ñèñòåì Linuxè FreeBSD.
 äðóãèõ ñèñòåìàõ âàì ìîæåò ïîòðåáîâàòüñÿ äðóãîé ôîðìàò îáúåêòíûõ èèñïîëíÿåìûõ ôàéëîâ; ñâåäåíèÿ îá ýòîì îáû÷íî åñòü â òåõíè÷åñêîé äîêóìåíòàöèè.31ld -m elf_i386 hello5.o -o hello5Ôëàæêîì -o ìû çàäàëè èìÿ èñïîëíÿåìîãî ôàéëà (hello5, íà ýòîò ðàçáåç ñóôôèêñà). Çàïóñòèì åãî íà èñïîëíåíèå, äàâ êîìàíäó ¾./hello5¿.Åñëè ìû íèãäå íå îøèáëèñü, ìû óâèäèì ïÿòü ñòðî÷åê Hello. 1.6. Ìàêðîñû èç ôàéëàstud_io.incÌàêðîñû, îïèñàííûå â ôàéëå stud_io.inc, íàì íåîäíîêðàòíî ïîòðåáóþòñÿ â äàëüíåéøåì, ïîýòîìó, ÷òîáû íå âîçâðàùàòüñÿ ê íèì, åù¼ ðàçïðèâåä¼ì îïèñàíèå èõ âîçìîæíîñòåé.
Òåêñò ôàéëà stud_io.inc (âåðñèèäëÿ Linux è FreeBSD) ïðèâåä¼í â ïðèëîæåíèè A, òàê ÷òî ïðè æåëàíèèâû ëåãêî ïîéì¼òå, êàê óñòðîåíû ýòè ìàêðîñû.  ïðîãðàììå, êîòîðóþ ìûðàçîáðàëè â ïðåäûäóùåì ïàðàãðàôå, ìû èñïîëüçîâàëè ìàêðîñû PRINT,PUTCHAR è FINISH. Êðîìå ýòèõ òð¼õ ìàêðîñîâ íàø ôàéë stud_io.incïîääåðæèâàåò åù¼ ìàêðîñ GETCHAR, òàê ÷òî âñåãî ýòèõ ìàêðîñîâ ÷åòûðå.Ìàêðîñ PRINT ïðåäíàçíà÷åí äëÿ ïå÷àòè ñòðîêè; åãî àðãóìåíòîì äîëæíà áûòü ñòðîêà â àïîñòðîôàõ èëè äâîéíûõ êàâû÷êàõ, íè÷åãî äðóãîãî îíïå÷àòàòü íå óìååò.Ìàêðîñ PUTCHAR ïðåäíàçíà÷åí äëÿ âûâîäà íà ïå÷àòü îäíîãî ñèìâîëà. êà÷åñòâå àðãóìåíòà îí ïðèíèìàåò êîä ñèìâîëà, çàïèñàííûé â âèäå ÷èñëà èëè â âèäå ñàìîãî ñèìâîëà, âçÿòîãî â êàâû÷êè èëè àïîñòðîôû; òàêæåìîæíî â êà÷åñòâå àðãóìåíòà ýòîãî ìàêðîñà èñïîëüçîâàòü îäíîáàéòîâûéðåãèñòð AL, AH, BL, BH, CL, CH, DL èëè DH.
Èñïîëüçîâàòü äðóãèå ðåãèñòðû â êà÷åñòâå àðãóìåíòà PUTCHAR íåëüçÿ! Íàêîíåö, àðãóìåíòîìýòîãî ìàêðîñà ìîæåò âûñòóïàòü èñïîëíèòåëüíûé àäðåñ, çàêëþ÷¼ííûé âêâàäðàòíûå ñêîáêè â ýòîì ñëó÷àå êîä ñèìâîëà áóäåò âçÿò èç ÿ÷åéêèïàìÿòè ïî ýòîìó àäðåñó.Ìàêðîñ GETCHAR ñ÷èòûâàåò ñèìâîë èç ïîòîêà ñòàíäàðòíîãî ââîäà (ñêëàâèàòóðû). Ïîñëå ñ÷èòûâàíèÿ êîä ñèìâîëà çàïèñûâàåòñÿ â ðåãèñòðEAX; ïîñêîëüêó êîä ñèìâîëà âñåãäà óìåùàåòñÿ â îäèí áàéò, åãî ìîæíîèçâëå÷ü èç ðåãèñòðà AL, îñòàëüíûå ðàçðÿäû EAX áóäóò ðàâíû íóëþ. Åñëè ñèìâîëîâ áîëüøå íåò (äîñòèãíóòà òàê íàçûâàåìàÿ ñèòóàöèÿ êîíöàôàéëà , êîòîðàÿ â ÎÑ Unix îáû÷íî èìèòèðóåòñÿ íàæàòèåì Ctrl-D), â EAXáóäåò çàíåñåíî çíà÷åíèå -1 (øåñòíàäöàòåðè÷íîå FFFFFFFF, òî åñòü âñå 32ðàçðÿäà ðåãèñòðà ðàâíû åäèíèöàì).
Íèêàêèõ ïàðàìåòðîâ ýòîò ìàêðîñ íåïðèíèìàåò.Ìàêðîñ FINISH çàâåðøàåò âûïîëíåíèå ïðîãðàììû. Ýòîò ìàêðîñ ìîæíî âûçâàòü áåç ïàðàìåòðîâ, à ìîæíî âûçâàòü ñ îäíèì ÷èñëîâûì ïàðàìåòðîì, çàäàþùèì òàê íàçûâàåìûé êîä çàâåðøåíèÿ ïðîöåññà ; îáû÷íîèñïîëüçóþò êîä 0, åñëè íàøà ïðîãðàììà îòðàáîòàëà óñïåøíî, è êîä 1,åñëè â ïðîöåññå ðàáîòû âîçíèêëè îøèáêè.32Ãëàâà 2. Ïðîöåññîð i386 2.1. Ñèñòåìà ðåãèñòðîâ i386Ðåãèñòðîì íàçûâàþò ýëåêòðîííîå óñòðîéñòâî â ñîñòàâå öåíòðàëüíîãî ïðîöåññîðà, ñïîñîáíîå ñîäåðæàòü â ñåáå îïðåäåë¼ííîå êîëè÷åñòâîäàííûõ â âèäå äâîè÷íûõ ðàçðÿäîâ.  áîëüøèíñòâå ñëó÷àåâ (íî íå âñåãäà)ñîäåðæèìîå ðåãèñòðà òðàêòóåòñÿ êàê öåëîå ÷èñëî, çàïèñàííîå â äâîè÷íîéñèñòåìå ñ÷èñëåíèÿ.
Ðåãèñòðû ïðîöåññîðà i386 ìîæíî óñëîâíî ðàçäåëèòüíà ðåãèñòðû îáùåãî íàçíà÷åíèÿ , ñåãìåíòíûå ðåãèñòðû è ñïå1öèàëüíûå ðåãèñòðû . Êàæäûé ðåãèñòð èìååò ñâî¼ íàçâàíèå , ñîñòîÿùåå èç äâóõ-òð¼õ ëàòèíñêèõ áóêâ.Ñåãìåíòíûå ðåãèñòðû (CS, DS, SS, ES, GS è FS) â ¾ïëîñêîé¿ ìîäåëèïàìÿòè íå èñïîëüçóþòñÿ. Òî÷íåå ãîâîðÿ, ïåðåä ïåðåäà÷åé óïðàâëåíèÿïîëüçîâàòåëüñêîé çàäà÷å îïåðàöèîííàÿ ñèñòåìà çàíîñèò â ýòè ðåãèñòðûíåêîòîðûå çíà÷åíèÿ, êîòîðûå çàäà÷à òåîðåòè÷åñêè ìîæåò èçìåíèòü, íîíè÷åãî õîðîøåãî èç ýòîãî âñ¼ ðàâíî íå âûéäåò ñêîðåå âñåãî, ïðîèçîéä¼ò àâàðèéíîå çàâåðøåíèå. Òàêèì îáðàçîì, ìû ïðèíèìàåì âî âíèìàíèåñóùåñòâîâàíèå ýòèõ ðåãèñòðîâ, íî áîëåå ê íèì âîçâðàùàòüñÿ íå áóäåì.Ðåãñòðû îáùåãî íàçíà÷åíèÿ ïðîöåññîðà i386 ýòî 32-áèòíûå ðåãèñòðû EAX, EBX, ECX, EDX, ESI, EDI, EBP è ESP. Êàê óæå îòìå÷àëîñü íàñòð.
24, áóêâà E â íàçâàíèè ýòèõ ðåãèñòðîâ îçíà÷àåò ñëîâî ¾extended¿,ïîä÷¼ðêèâàÿ òîò ôàêò, ÷òî â èõ ñîâðåìåííîì âèäå ýòè ðåãèñòðû ïîÿâèëèñü òîëüêî â ïðîöåññîðå i386. Äëÿ ñîâìåñòèìîñòè ñ ïðåäûäóùèìè ïðîöåññîðàìè ñåìåéñòâà x86 êàæäûé 32-áèòíûé ðåãèñòð èìååò îáîñîáëåííóþìëàäøóþ ïîëîâèíó (ìëàäøèå 16 áèò), èìåþùóþ îòäåëüíîå íàçâàíèå, ïîëó÷àåìîå îòáðàñûâàíèåì áóêâû E, òî åñòü, èíà÷å ãîâîðÿ, ìû ìîæåì ðàáîòàòü òàêæå ñ 16-áèòíûìè ðåãèñòðàìè AX, BX, CX, DX, SI, DI, BP è SP,êîòîðûå ïðåäñòàâëÿþò ñîáîé ìëàäøèå ïîëîâèíû ñîîòâåòñòâóþùèõ 32áèòíûõ ðåãèñòðîâ.1 Ýòèì ïðîöåññîðû ñåìåéñòâà x86 îòëè÷àþòñÿ îò ìíîãèõ äðóãèõ ïðîöåññîðîâ, â êîòîðûõ ðåãèñòðû èìåþò íîìåðà.333116 15EAX8 7AH0150150150150150150CSALAX3116 15EBX8 7BH0SSBLBXDS3116 15ECX8 7CH0CLESCX3116 15EDX8 7DH0FSDLDX3116 15ESIGS0SI3116 15EDI0EFLAGS31DI16 150FLAGS3116 15EBP31ESP0BP16 15031EIPSP16 150IPÐèñ. 2.1.
Ñèñòåìà ðåãèñòðîâ i386Êðîìå òîãî, ðåãèñòðû AX, BX, CX è DX òàêæå äåëÿòñÿ íà ìëàäøèå èñòàðøèå ÷àñòè, òåïåðü óæå âîñüìèáèòíûå. Òàê, äëÿ ðåãèñòðà AX åãî ìëàäøèé áàéò èìååò òàêæå íàçâàíèå AL, à ñòàðøèé áàéò AH (îò ñëîâ ¾low¿ è¾high¿). Àíàëîãè÷íî ìû ìîæåì ðàáîòàòü ñ ðåãèñòðàìè BL, BH, CL, CH, DLè DH, êîòîðûå ïðåäñòàâëÿþò ñîáîé ìëàäøèå è ñòàðøèå áàéòû ðåãèñòðîâBX, CX è DX. Îñòàëüíûå ðåãèñòðû îáùåãî íàçíà÷åíèÿ òàêèõ îáîñîáëåííûõîäíîáàéòîâûõ ïîäðåãèñòðîâ íå èìåþò.Êàæäûé èç ðåãèñòðîâ îáùåãî íàçíà÷åíèÿ, íåñìîòðÿ íà òàêîå íàçâàíèå, â íåêîòîðûõ ñëó÷àÿõ èãðàåò ñïåöèôè÷åñêóþ, òîëüêî åìó ïðèñóùóþ ðîëü, ÷àñòè÷íî çàêîäèðîâàííóþ â èìåíè ðåãèñòðà. Òàê, â èìåíè ðåãèñòðà AX áóêâà A îáîçíà÷àåòñëîâî ¾accumulator¿; íà ìíîãèõ àðõèòåêòóðàõ, âêëþ÷àÿ çíàìåíèòûé IAS Äæîíàôîí Íåéìàíà, àêêóìóëÿòîðîì íàçûâàëè ðåãèñòð, ó÷àñòâóþùèé (ïî îïðåäåëåíèþ)âî âñåõ àðèôìåòè÷åñêèõ îïåðàöèÿõ, âî-ïåðâûõ, â êà÷åñòâå îäíîãî èç îïåðàíäîâ,è, âî-âòîðûõ, â êà÷åñòâå ìåñòà, êóäà ñëåäóåò ïîìåñòèòü ðåçóëüòàò.
Ñâÿçàííàÿ ñýòèì îñîáàÿ ðîëü ðåãèñòðîâ AX è EAX ïðîÿâëÿåòñÿ â êîìàíäàõ öåëî÷èñëåííîãîóìíîæåíèÿ è äåëåíèÿ (ñì. 2.3.4). èìåíè ðåãèñòðà BX áóêâà B îáîçíà÷àåò ñëîâî ¾base¿, íî íèêàêîé îñîáîé ðîëèâ 32-áèòíûõ ïðîöåññîðàõ ýòîìó ðåãèñòðó íå îòâåäåíî (õîòÿ â 16-áèòíûõ ïðîöåññîðàõ òàêàÿ ðîëü ñóùåñòâîâàëà). èìåíè CX áóêâà C îáîçíà÷àåò ñëîâî ¾counter¿ (ñ÷¼ò÷èê). Ðåãèñòðû ECX, CX,à â íåêîòîðûõ ñëó÷àÿõ äàæå CL èñïîëüçóþòñÿ âî ìíîãèõ ìàøèííûõ êîìàíäàõ,ïðåäïîëàãàþùèõ (â òîì èëè èíîì ñìûñëå) îïðåäåë¼ííîå êîëè÷åñòâî èòåðàöèé.Èìÿ ðåãèñòðà DX ñèìâîëèçèðóåò ñëîâî ¾data¿ (äàííûå).  îñîáîé ðîëè ðåãèñòðEDX (èëè DX, åñëè âûïîëíÿåòñÿ øåñòíàäöàòèðàçðÿäíàÿ îïåðàöèÿ) âûñòóïàåò ïðèâûïîëíåíèè îïåðàöèé öåëî÷èñëåííîãî óìíîæåíèÿ (äëÿ õðàíåíèÿ ÷àñòè ðåçóëüòà-34òà, íå ïîìåñòèâøåéñÿ â àêêóìóëÿòîð) è öåëî÷èñëåííîãî äåëåíèÿ (äëÿ õðàíåíèÿñòàðøåé ÷àñòè äåëèìîãî, à ïîñëå âûïîëíåíèÿ îïåðàöèè äëÿ õðàíåíèÿ îñòàòêàîò äåëåíèÿ).Èìåíà ðåãèñòðîâ SI è DI îçíà÷àþò, ñîîòâåòñòâåííî, ¾source index¿ è¾destination index¿ (èíäåêñ èñòî÷íèêà è èíäåêñ íàçíà÷åíèÿ).