А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 27
Текст из файла (страница 27)
Åñëè æå â íàøåé ïðîãðàììå âñòðåòÿòñÿ õîòÿ áû äâà âûçîâàìàêðîñà zeromem, òî ïðè ïîïûòêå îòòðàíñëèðîâàòü ïðîãðàììó ìû ïîëó÷èì ñîîáùåíèå îá îøèáêå NASM ïîæàëóåòñÿ íà òî, ÷òî ìû èñïîëüçóåìîäíó è òó æå ìåòêó (lp:) äâàæäû. Äåéñòâèòåëüíî, ïðè êàæäîì ìàêðîâûçîâå ìàêðîïðîöåññîð âñòàâèò âìåñòî âûçîâà âñ¼ òåëî íàøåãî ìàêðîîïðåäåëåíèÿ, òîëüêî çàìåíèâ %1 è %2 íà ñîîòâåòñòâóþùèå ïàðàìåòðû, à âñ¼îñòàëüíîå ñîõðàíèâ áåç èçìåíåíèÿ. Çíà÷èò, ñòðîêàlp:mov byte [esi], 0ñîäåðæàùàÿ ìåòêó lp, âñòðåòèòñÿ àññåìáëåðó (óæå ïîñëå ìàêðîïðîöåññèðîâàíèÿ) äâàæäû èëè, òî÷íåå, ðîâíî ñòîëüêî ðàç, ñêîëüêî ðàç áóäåòâûçâàí ìàêðîñ zeromem.ßñíî, ÷òî íåîáõîäèì íåêèé ìåõàíèçì, ïîçâîëÿþùèé ëîêàëèçîâàòüìåòêó, èñïîëüçóåìóþ âíóòðè ìíîãîñòðî÷íîãî ìàêðîñà, ñ òåì, ÷òîáû òàêèåìåòêè, ïîëó÷åííûå âûçîâîì îäíîãî è òîãî æå ìàêðîñà â ðàçíûõ ìåñòàõïðîãðàììû, íå êîíôëèêòîâàëè äðóã ñ äðóãîì.  NASM òàêîé ìåõàíèçìíàçûâàåòñÿ ¾ëîêàëüíûå ìåòêè â ìàêðîñàõ¿. ×òîáû çàäåéñòâîâàòü ýòîòìåõàíèçì, íåîáõîäèìî íà÷àòü èìÿ ìåòêè ñ äâóõ ñèìâîëîâ % òàê, â ïðèâåä¼ííîì âûøå ïðèìåðå îáà âõîæäåíèÿ ìåòêè lp íóæíî çàìåíèòü íà%%lp.
Òàêàÿ ìåòêà áóäåò â êàæäîì ñëåäóþùåì ìàêðîâûçîâå çàìåíÿòüñÿíåêîòîðûì íîâûì (íå ïîâòîðÿþùèìñÿ) èäåíòèôèêàòîðîì. Îòìåòèì äëÿíàãëÿäíîñòè, ÷òî ïðè ïåðâîì âûçîâå ìàêðîñà zeromem NASM çàìåíèò%%lp íà ..@1.lp, ïðè âòîðîì íà ..@2.lp è ò. ä.Îòìåòèì åù¼ îäèí íåäîñòàòîê âûøåïðèâåä¼ííîãî îïðåäåëåíèÿ zeromem.
Åñëè ïðè âûçîâå ýòîãî ìàêðîñà ïîëüçîâàòåëü (ïðîãðàììèñò, ïîëüçóþùèéñÿ íàøèììàêðîñîì, èëè, âîçìîæíî, ìû ñàìè) èñïîëüçóåò â êà÷åñòâå ïåðâîãî ïàðàìåòðà (àäðåñà íà÷àëà îáëàñòè ïàìÿòè) ðåãèñòð ECX èëè â êà÷åñòâå âòîðîãî (äëèíû îáëàñòèïàìÿòè) ðåãèñòð ESI, ìàêðîâûçîâ áóäåò óñïåøíî îòòðàíñëèðîâàí, íî ðàáîòàòüïðîãðàììà áóäåò ñîâñåì íå òàê, êàê îò íå¼ îæèäàåòñÿ. Äåéñòâèòåëüíî, åñëè íàïèñàòü ÷òî-òî âðîäåsection .bssarray resb 256arr_len equ $-arraysection .text; ...mov ecx, arraymov esi, arr_lenzeromem ecx, esi; ...òî íà÷àëî ìàêðîñà zeromem ðàçâåðí¼òñÿ â ñëåäóþùèé êîä:push ecx117push esimov ecx, esimov esi, ecx; ...â ðåçóëüòàòå ÷åãî, î÷åâèäíî, â îáîèõ ðåãèñòðàõ ECX è ESI îêàæåòñÿ äëèíà ìàññèâà,à àäðåñ åãî íà÷àëà áóäåò ïîòåðÿí. Ñêîðåå âñåãî, ïðîãðàììà â òàêîì âèäå àâàðèéíîçàâåðøèòñÿ, äîéäÿ äî ýòîãî ôðàãìåíòà êîäà.×òîáû èçáåæàòü ïîäîáíûõ ïðîáëåì, ìîæíî âîñïîëüçîâàòüñÿ äèðåêòèâàìèóñëîâíîé êîìïèëÿöèè, ïðîâåðÿÿ, íå ÿâëÿåòñÿ ëè ïåðâûé ïàðàìåòð ðåãèñòðîì ECXè íå ÿâëÿåòñÿ ëè âòîðîé ïàðàìåòð ðåãèñòðîì ESI, íî ìîæíî ïîñòóïèòü è ïðîùå çàãðóçèòü çíà÷åíèÿ ïàðàìåòðîâ â ðåãèñòðû ÷åðåç âðåìåííóþ çàïèñü èõ â ñòåê, òîåñòü âìåñòîmov ecx, %2mov esi, %1íàïèñàòüpush dword %2push dword %1pop esipop ecxÎêîí÷àòåëüíî íàøå ìàêðîîïðåäåëåíèå ïðèìåò ñëåäóþùèé âèä:%macro zeromem 2 ; (äâà ïàðàìåòðà - àäðåñ è äëèíà)push ecxpush esipush dword %2push dword %1pop esipop ecx%%lp: mov byte [esi], 0inc esiloop %%lppop esipop ecx%endmacro 3.5.7.
Ìàêðîñû ñ ïåðåìåííûì ÷èñëîì ïàðàìåòðîâÏðè îïèñàíèè ìíîãîñòðî÷íûõ ìàêðîñîâ ñ ïîìîùüþ äèðåêòèâû %macroàññåìáëåð NASM ïîçâîëÿåò çàäàòü ïåðåìåííîå ÷èñëî ïàðàìåòðîâ. Ýòîäåëàåòñÿ ñ ïîìîùüþ ñèìâîëà -, êîòîðûé â äàííîì ñëó÷àå ñèìâîëèçèðóåòòèðå. Íàïðèìåð, äèðåêòèâà%macro mymacro 1-3118çàäà¼ò ìàêðîñ, ïðèíèìàþùèé îò îäíîãî äî òð¼õ ïàðàìåòðîâ, à äèðåêòèâà%macro mysecondmacro 2-*çàäà¼ò ìàêðîñ, äîïóñêàþùèé ïðîèçâîëüíîå êîëè÷åñòâî ïàðàìåòðîâ, íåìåíüøåå äâóõ.
Ïðè ðàáîòå ñ òàêèìè ìàêðîñàìè ìîæåò îêàçàòüñÿ ïîëåçíûì îáîçíà÷åíèå %0, âìåñòî êîòîðîãî ìàêðîïðîöåññîð âî âðåìÿ ìàêðîïîäñòàíîâêè ïîäñòàâëÿåò ÷èñëî, ðàâíîå ôàêòè÷åñêîìó êîëè÷åñòâó ïàðàìåòðîâ.Íàïîìíèì, ÷òî ñàìè àðãóìåíòû ìíîãîñòðî÷íîãî ìàêðîñà â åãî òåëå îáîçíà÷àþòñÿ êàê %1, %2 è ò. ä., íî ñðåäñòâ èíäåêñèðîâàíèÿ (òî åñòüñïîñîáà èçâëå÷ü n-ûé ïàðàìåòð, ãäå n âû÷èñëÿåòñÿ óæå âî âðåìÿ ìàêðîïîäñòàíîâêè) NASM íå ïðåäóñìàòðèâàåò.
Êàê æå â òàêîì ñëó÷àå èñïîëüçîâàòü ïàðàìåòðû, åñëè äàæå èõ êîëè÷åñòâî çàðàíåå íå èçâåñòíî?Ïðîáëåìó ðåøàåò äèðåêòèâà %rotate, ïîçâîëÿþùàÿ ïåðåîáîçíà÷èòü ïàðàìåòðû. Ðàññìîòðèì ñàìûé ïðîñòîé âàðèàíò äèðåêòèâû:%rotate 1×èñëîâîé ïàðàìåòð îáîçíà÷àåò, íà ñêîëüêî ïîçèöèé ñëåäóåò ñäâèíóòü íîìåðà ïàðàìåòðîâ.  äàííîì ñëó÷àå ýòî ÷èñëî 1, òàê ÷òî ïàðàìåòð, ðàíååîáîçíà÷àâøèéñÿ %2, ïîñëå ýòîé äèðåêòèâû áóäåò èìåòü îáîçíà÷åíèå %1,â ñâîþ î÷åðåäü áûâøèé %3 ïðåâðàòèòñÿ â %2 è ò.
ä., íó à ïàðàìåòð, ñòîÿâøèé ñàìûì ïåðâûì è èìåâøèé îáîçíà÷åíèå %1, â ñèëó ¾öèêëè÷íîñòè¿íàøåãî ñäâèãà ïîëó÷èò íîìåð, ðàâíûé îáùåìó êîëè÷åñòâó ïàðàìåòðîâ.Îáîçíà÷åíèå %0 â ðîòàöèè íå ó÷àñòâóåò è íèêàê íå èçìåíÿåòñÿ.Äèðåêòèâà ïîçâîëÿåò ïðîèçâîäèòü öèêëè÷åñêèé ñäâèã è â îáðàòíîìíàïðàâëåíèè (âëåâî), äëÿ ýòîãî ñëåäóåò çàäàòü å¼ ïàðàìåòð îòðèöàòåëüíûì. Òàê, ïîñëå îòðàáîòêè äèðåêòèâû%rotate -1%1 áóäåò îáîçíà÷àòü ïàðàìåòð, ðàíåå ñòîÿâøèé ñàìûì ïîñëåäíèì, %2 ñòàíåò îáîçíà÷àòü ïàðàìåòð, ðàíåå áûâøèé ïåðâûì (òî åñòü èìåâøèé îáîçíà÷åíèå %1) è ò. ä.Âñïîìíèì, ÷òî ðàíåå (ñì.
ñòð. 105) ìû îáåùàëè íàïèñàòü ìàêðîñpcall, ïîçâîëÿþùèé â îäíó ñòðî÷êó ñôîðìèðîâàòü âûçîâ ïîäïðîãðàììû ñ ëþáûì êîëè÷åñòâîì àðãóìåíòîâ. Ñåé÷àñ, èìåÿ â ñâî¼ì ðàñïîðÿæåíèè ìàêðîñû ñ ïåðåìåííûì ÷èñëîì àðãóìåíòîâ è äèðåêòèâó %rotate, ìûãîòîâû ýòî ñäåëàòü. Íàø ìàêðîñ, êîòîðûé ìû íàçîâ¼ì ïðîñòî pcall, áóäåò ïðèíèìàòü íà âõîä àäðåñ ïðîöåäóðû (àðãóìåíò äëÿ êîìàíäû call) èïðîèçâîëüíîå êîëè÷åñòâî ïàðàìåòðîâ, ïðåäíàçíà÷åííîå äëÿ ðàçìåùåíèÿâ ñòåêå. Ìû áóäåì, êàê è ðàíüøå, ïðåäïîëàãàòü äëÿ ïðîñòîòû, ÷òî êàæäûé ïàðàìåòð çàíèìàåò ðîâíî 4 áàéòà. Íàïîìíèì, ÷òî ïàðàìåòðû äîëæíû áûòü ïîìåùåíû â ñòåê â îáðàòíîì ïîðÿäêå, íà÷èíàÿ ñ ïîñëåäíåãî. Ìû119äîáü¼ìñÿ ýòîãî ñ ïîìîùüþ ìàêðîöèêëà %rep è äèðåêòèâû %rotate -1,êîòîðàÿ íà êàæäîì øàãå áóäåò äåëàòü ïîñëåäíèé (íà òåêóùèé ìîìåíò)ïàðàìåòð ïàðàìåòðîì íîìåð 1. Êîëè÷åñòâî èòåðàöèé öèêëà íà åäèíèöóìåíüøå, ÷åì êîëè÷åñòâî ïàðàìåòðîâ, ïåðåäàííûõ â ìàêðîñ, ïîòîìó ÷òîïåðâûé èç ïàðàìåòðîâ ÿâëÿåòñÿ èìåíåì ïðîöåäóðû è åãî â ñòåê çàíîñèòüíå íàäî. Ïîñëå ýòîãî öèêëà íàì îñòàíåòñÿ ñíîâà ïðåâðàòèòü ïîñëåäíèéïàðàìåòð â ïåðâûé (íà ýòîò ðàç ýòî êàê ðàç è îêàæåòñÿ ñàìûé ïåðâûéèç âñåõ ïàðàìåòðîâ, òî åñòü àäðåñ ïðîöåäóðû) è ñäåëàòü call, à çàòåìâñòàâèòü êîìàíäó add äëÿ î÷èñòêè ñòåêà îò ïàðàìåòðîâ.
Èòàê, ïèøåì:%macro pcall 1-* ; îò îäíîãî äî ñêîëüêè óãîäíî%rep %0 - 1; öèêë ïî âñåì ïàðàìåòðàì êðîìå ïåðâîãî%rotate -1; ïîñëåäíèé ïàðàìåòð ñòàíîâèòñÿ %1push dword %1%endrep%rotate -1; àäðåñ ïðîöåäóðû ñòàíîâèòñÿ %1call %1add esp, (%0 - 1) * 4%endmacroÅñëè òåïåðü âûçâàòü ýòîò ìàêðîñ, íàïðèìåð, âîò òàê:pcall myproc, eax, myvar, 27òî ðåçóëüòàòîì ïîäñòàíîâêè ñòàíåò ñëåäóþùèé ôðàãìåíò:push dword 27push dword myvarpush dword eaxcall myprocadd esp, 12÷òî, ñîáñòâåííî, íàì è òðåáîâàëîñü. 3.5.8. Ìàêðîäèðåêòèâû äëÿ ðàáîòû ñî ñòðîêàìèÀññåìáëåð NASM ïîääåðæèâàåò äâå äèðåêòèâû, ïðåäíàçíà÷åííûå äëÿ ïðåîáðàçîâàíèÿ ñòðîê (ñòðîêîâûõ êîíñòàíò) âî âðåìÿ ìàêðîïðîöåññèðîâàíèÿ.
Îíè ìîãóò îêàçàòüñÿ ïîëåçíûìè, íàïðèìåð, âíóòðè ìíîãîñòðî÷íîãî ìàêðîñà, îäíèì èçïàðàìåòðîâ êîòîðîãî ÿâëÿåòñÿ (äîëæíà áûòü) ñòðîêà è ñ ýòîé ñòðîêîé íåîáõîäèìîïðåäâàðèòåëüíî âûïîëíèòü òå èëè èíûå ïðåîáðàçîâàíèÿ.Ïåðâàÿ èç äèðåêòèâ, %strlen, ïîçâîëÿåò îïðåäåëèòü äëèíó ñòðîêè. Äèðåêòèâàèìååò äâà ïàðàìåòðà. Ïåðâûé èç íèõ èìÿ ìàêðîïåðåìåííîé, êîòîðîé ñëåäóåò ïðèñâîèòü ÷èñëî, ñîîòâåòñòâóþùåå äëèíå ñòðîêè, íó à âòîðîé ñîáñòâåííîñòðîêà. Òàê, â ðåçóëüòàòå âûïîëíåíèÿ%strlen sl 'my string'120ìàêðîïåðåìåííàÿ sl ïîëó÷èò çíà÷åíèå 9.Âòîðàÿ äèðåêòèâà, %substr, ïîçâîëÿåò âûäåëèòü èç ñòðîêè ñèìâîë ñ çàäàííûìíîìåðîì. Íàïðèìåð, ïîñëå âûïîëíåíèÿ%substr var1 'abcd' 1%substr var2 'abcd' 2%substr var3 'abcd' 3ìàêðîïåðåìåííûå var1, var2 è var3 ïîëó÷àò çíà÷åíèÿ 'a', 'b' è 'c' ñîîòâåòñòâåííî, òî åñòü ïðîèçîéä¼ò òî æå ñàìîå, êàê åñëè áû ìû íàïèñàëè%define var1 'a'%define var2 'b'%define var3 'c'Âñ¼ ýòî èìååò ñìûñë, êàê ïðàâèëî, òîëüêî â ñëó÷àå, åñëè â êà÷åñòâå àðãóìåíòàäèðåêòèâû ïîëó÷àþò ëèáî èìÿ ìàêðîïåðåìåííîé, ëèáî îáîçíà÷åíèå ïîçèöèîííîãîïàðàìåòðà â ìíîãîñòðî÷íîì ìàêðîñå.Íàïîìíèì, ÷òî âñå ìàêðîäèðåêòèâû îòðàáàòûâàþò âî âðåìÿ ìàêðîïðîöåññèðîâàíèÿ (ïåðåä êîìïèëÿöèåé, òî åñòü çàäîëãî äî âûïîëíåíèÿ íàøåé ïðîãðàììû),òàê ÷òî, ðàçóìååòñÿ, íà ìîìåíò ñîîòâåòñòâóþùèõ ìàêðîïîäñòàíîâîê âñå èñïîëüçóåìûå ñòðîêè äîëæíû áûòü óæå èçâåñòíû. 3.6.
Êîìàíäíàÿ ñòðîêà NASMÐàññêàç îá àññåìáëåðå NASM ìû çàâåðøàåì êðàòêèì îáçîðîì àðãóìåíòîâ åãî êîìàíäíîé ñòðîêè. Êàê óæå ãîâîðèëîñü, ïðè âûçîâå ïðîãðàììû nasm íåîáõîäèìî óêàçàòü èìÿ ôàéëà, ñîäåðæàùåãî èñõîäíûé òåêñò íàÿçûêå àññåìáëåðà, à êðîìå ýòîãî, îáû÷íî òðåáóåòñÿ óêàçàòü êëþ÷è, çàäàþùèå ðåæèì ðàáîòû. Ñ íåêîòîðûìè èç íèõ ìû óæå çíàêîìû: ýòî êëþ÷è-f, -o è -d.Íàïîìíèì, ÷òî êëþ÷ -f ïîçâîëÿåò óêàçàòü ôîðìàò ïîëó÷àåìîãî êîäà.  íàøåì ñëó÷àå âñåãäà èñïîëüçóåòñÿ ôîðìàò elf. Èíòåðåñíî, ÷òî,åñëè íå óêàçàòü ýòîò êëþ÷, àññåìáëåð ñîçäàñò âûõîäíîé ôàéë â ¾ñûðîì¿ôîðìàòå, òî åñòü, ïîïðîñòó ãîâîðÿ, ïåðåâåä¼ò íàøè êîìàíäû â äâîè÷íîåïðåäñòàâëåíèå è â òàêîì âèäå çàïèøåò â ôàéë.
Ðàáîòàÿ ïîä óïðàâëåíèåì îïåðàöèîííûõ ñèñòåì, ìû òàêîé ôàéë çàïóñòèòü íà âûïîëíåíèå íåñìîæåì, îäíàêî åñëè áû ìû, ê ïðèìåðó, õîòåëè íàïèñàòü ïðîãðàììó äëÿðàçìåùåíèÿ â çàãðóçî÷íîì ñåêòîðå äèñêà, òî ¾ñûðîé¿ ôîðìàò îêàçàëñÿáû êàê ðàç òåì, ÷òî íàì íóæíî.Êëþ÷ -o çàäà¼ò èìÿ ôàéëà, â êîòîðûé ñëåäóåò çàïèñàòü ðåçóëüòàòòðàíñëÿöèè. Åñëè ìû èñïîëüçóåì ôîðìàò elf, òî âïîëíå ìîæåì äîâåðèòüâûáîð èìåíè ôàéëà ñàìîìó NASM'ó: îí îòáðîñèò îò èìåíè èñõîäíîãîôàéëà ñóôôèêñ .asm è çàìåíèò åãî íà .o, ÷òî íàì â áîëüøèíñòâå ñëó÷àåâè òðåáóåòñÿ.
Åñëè æå ïî êàêèì-òî ïðè÷èíàì íàì óäîáíåå äðóãîå èìÿ, ìûìîæåì óêàçàòü åãî ÿâíî ñ ïîìîùüþ -o.121Êëþ÷ -d, êàê ìû óæå çíàåì (ñì. ñòð. 112), èñïîëüçóåòñÿ äëÿ îïðåäåëåíèÿ ìàêðîñèìâîëà â ñëó÷àå, åñëè ìû íå õîòèì äåëàòü ýòîãî ïóò¼ì ðåäàêòèðîâàíèÿ èñõîäíîãî òåêñòà. Ìû èñïîëüçîâàëè åãî â ôîðìå -dSYMBOL,÷òî äà¼ò òîò æå ýôôåêò, êàê åñëè â íà÷àëî ïðîãðàììû âñòàâèòü ñòðîêó %define SYMBOL. Íî ìîæíî èñïîëüçîâàòü åãî è äëÿ çàäàíèÿ çíà÷åíèÿ ìàêðîñèìâîëà: íàïðèìåð, -dSIZE=1024 íå òîëüêî îïðåäåëèò ñèìâîëSIZE, íî è ïðèïèøåò åìó çíà÷åíèå 1024, êàê ýòî ñäåëàëà áû äèðåêòèâà%define SIZE 1024.Î÷åíü èíòåðåñíû â ïîçíàâàòåëüíîì ïëàíå âîçìîæíîñòè ãåíåðàöèè òàêíàçûâàåìîãî ëèñòèíãà ïîäðîáíîãî îò÷¼òà àññåìáëåðà î ïðîäåëàííîéðàáîòå.
Ëèñòèíã âêëþ÷àåò â ñåáÿ ñòðîêè èñõîäíîãî êîäà, ñíàáæ¼ííûåèíôîðìàöèåé îá èñïîëüçóåìûõ àäðåñàõ è î òîì, êàêîé èòîãîâûé êîä ñãåíåðèðîâàí â ðåçóëüòàòå îáðàáîòêè êàæäîé èñõîäíîé ñòðîêè. Ãåíåðàöèÿëèñòèíãà çàïóñêàåòñÿ êëþ÷îì -l, ïîñëå êîòîðîãî òðåáóåòñÿ óêàçàòü èìÿôàéëà. Äëÿ ïðèìåðà âîçüìèòå ëþáóþ ïðîãðàììó íà ÿçûêå àññåìáëåðà èîòòðàíñëèðóéòå å¼ ñ ôëàãîì -l; òàê, åñëè âàøà ïðîãðàììà íàçûâàåòñÿprog.asm, ïîïðîáóéòå ïðèìåíèòü êîìàíäónasm -f elf -l prog.lst prog.asmâ ðåçóëüòàòå êîòîðîé òåêñò ëèñòèíãà áóäåò ïîìåù¼í â ôàéë prog.lst;îáÿçàòåëüíî ïðîñìîòðèòå ïîëó÷èâøèéñÿ ôàéë è çàäàéòå âàøåìó ïðåïîäàâàòåëþ âîïðîñû ïî ïîâîäó âñåãî, ÷òî â ëèñòèíãå îêàçàëîñü íåïîíÿòíî.Âåñüìà ïîëåçíûì ìîæåò îêàçàòüñÿ êëþ÷ -g, óêàçûâàþùèé NASM'óíà íåîáõîäèìîñòü âêëþ÷åíèÿ â ðåçóëüòàòû òðàíñëÿöèè òàê íàçûâàåìîéîòëàäî÷íîé èíôîðìàöèè. Ïðè óêàçàíèè ýòîãî êëþ÷à NASM âñòàâëÿåòâ îáúåêòíûé ôàéë ïîìèìî îáúåêòíîãî êîäà åù¼ è ñâåäåíèÿ îá èìåíèèñõîäíîãî ôàéëà, íîìåðàõ ñòðîê â í¼ì è ò.