А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 22
Текст из файла (страница 22)
Ïóñòü, íàïðèìåð, â ìàññèâå buf1 ñîäåðæèòñÿ ñòðîêà"This is a string" è íàì íóæíî ïåðåä ñëîâîì "string" âñòàâèòü ñëîâî"long". Äëÿ ýòîãî ñíà÷àëà íóæíî ñêîïèðîâàòü îáëàñòü ïàìÿòè, íà÷èíàÿñ àäðåñà [buf1+10], íà ïÿòü áàéò âïåð¼ä, ÷òîáû îñâîáîäèòü ìåñòî äëÿñëîâà "long" è ïðîáåëà. ßñíî, ÷òî ïðîèçâîäèòü òàêîå êîïèðîâàíèå ìûìîæåì òîëüêî èç êîíöà â íà÷àëî, èíà÷å ÷àñòü áóêâ áóäåò çàò¼ðòà äî òîãî, êàê ìû èõ ñêîïèðóåì.
Òàêèì îáðàçîì, åñëè ñëîâî "long " (âìåñòå ñïðîáåëîì) ñîäåðæèòñÿ â áóôåðå buf2, òî âñòàâèòü åãî âî ôðàçó, íàõîäÿùóþñÿ â buf1, ìû ìîæåì òàê:stdmovmovmovrepedi, buf1+17+5esi, buf1+17ecx, 8movsb92mov esi, buf2+4mov ecx, 5rep movsbÊðîìå ïåðå÷èñëåííûõ, ïðîöåññîð i386 ðåàëèçóåò êîìàíäû cmpsb,cmpsw è cmpsd (compare string), à òàêæå scasb, scasw è scasd (scanstring). Êîìàíäû ñåðèè scas ñðàâíèâàþò àêêóìóëÿòîð (ñîîòâåòñòâåííî,AL, AX èëè EAX) ñ áàéòîì, ñëîâîì èëè äâîéíûì ñëîâîì ïî àäðåñó [edi],óñòàíàâëèâàÿ ñîîòâåòñòâóþùèå ôëàãè ïîäîáíî êîìàíäå cmp, è óâåëè÷èâàþò/óìåíüøàþò EDI Êîìàíäû ñåðèè cmps ñðàâíèâàþò áàéòû, ñëîâà èëèäâîéíûå ñëîâà, íàõîäÿùèåñÿ â ïàìÿòè ïî àäðåñàì [esi] è [edi], óñòàíàâëèâàþò ôëàãè è óâåëè÷èâàþò/óìåíüøàþò îáà ðåãèñòðà.Êðîìå ïðåôèêñà rep, ìîæíî âîñïîëüçîâàòüñÿ òàêæå ïðåôèêñàìè repzè repnz (òàêæå íàçûâàåìûìè repe è repne), êîòîðûå, êðîìå óìåíüøåíèÿ è ïðîâåðêè ðåãèñòðà ECX (èëè CX, åñëè êîìàíäà äâóõáàéòíàÿ) òàêæåïðîâåðÿþò çíà÷åíèå ôëàãà ZF è ïðîäîëæàþò ðàáîòó, òîëüêî åñëè ýòîòôëàã óñòàíîâëåí (repz/repe) èëè ñáðîøåí (repnz/repne).
Îáû÷íî ýòèïðåôèêñû èñïîëüçóþò êàê ðàç â ñî÷åòàíèè ñ êîìàíäàìè ñåðèé scas ècmps. 2.8. Åù¼ íåñêîëüêî èíòåðåñíûõ êîìàíä çàâåðøåíèå èçó÷åíèÿ ñèñòåìû êîìàíä ïðîöåññîðà i386 ðàññìîòðèìåù¼ íåñêîëüêî êîìàíä.Êîìàíäû cbw, cwd, cwde è cdq ïðåäíàçíà÷åíû äëÿ óâåëè÷åíèÿ ðàçðÿäíîñòè çíàêîâîãî ÷èñëà ; ïîïðîñòó ãîâîðÿ, îíè çàïîëíÿþò äîïîëíèòåëüíûå ðàçðÿäû çíà÷åíèåì çíàêîâîãî áèòà èñõîäíîãî ÷èñëà. Âñå ýòè ÷åòûðåêîìàíäû íå èìåþò îïåðàíäîâ è âñåãäà ðàáîòàþò ñ îäíèìè è òåìè æå ðåãèñòðàìè. Êîìàíäà cbw ðàñøèðÿåò ÷èñëî â ðåãèñòðå AL äî âñåãî ðåãèñòðàAX, ò.
å. çàïîëíÿåò ðàçðÿäû ðåãèñòðà AH. Êîìàíäà cwd ðàñøèðÿåò ÷èñëî âðåãèñòðå AX äî ðåãèñòðîâîé ïàðû DX:AX, òî åñòü çàïîëíÿåò ðàçðÿäû ðåãèñòðà DX. Êîìàíäà cwde ðàñøèðÿåò òîò æå ðåãèñòð AX äî ðåãèñòðà EAX,çàïîëíÿÿ ñòàðøèå 16 ðàçðÿäîâ ýòîãî ðåãèñòðà. Íàêîíåö, êîìàíäà cdqðàñøèðÿåò EAX äî ðåãèñòðîâîé ïàðû EDX:EAX, çàïîëíÿÿ ðàçðÿäû ðåãèñòðà EDX. Îñîáåííî àêòóàëüíûìè ýòè êîìàíäû îêàçûâàþòñÿ â ñî÷åòàíèèñ êîìàíäîé öåëî÷èñëåííîãî äåëåíèÿ (div, ñì. 2.3.4).Êîìàíäû movsx (move signed extension) è movzx (move zero extension)ïîçâîëÿþò ñîâìåñòèòü êîïèðîâàíèå ñ óâåëè÷åíèåì ðàçðÿäíîñòè. Îáå êîìàíäû èìåþò ïî äâà îïåðàíäà, ïðè÷¼ì ïåðâûé îïåðàíä îáÿçàí áûòü ðåãèñòðîâûì, à âòîðîé ìîæåò áûòü ðåãèñòðîì èëè ïàìÿòüþ, è â ëþáîì ñëó÷àåäëèíà ïåðâîãî îïåðàíäà äîëæíà áûòü âäâîå áîëüøå äëèíû âòîðîãî (òîåñòü ìîæíî êîïèðîâàòü èç áàéòà â ñëîâî èëè èç ñëîâà â äâîéíîå ñëî93âî).
Íåäîñòàþùèå ðàçðÿäû êîìàíäà movzx çàïîëíÿåò íóëÿìè, à êîìàíäàmovsx çíà÷åíèåì ñòàðøåãî áèòà èñõîäíîãî îïåðàíäà.Íàêîíåö, ðàññìîòðåíèå ñèñòåìû êîìàíä íå ìîæåò ñ÷èòàòüñÿ çàêîí÷åííûì áåç êîìàíäû nop. Îíà âûïîëíÿåò î÷åíü âàæíîå äåéñòâèå: íå äåëàåòíè÷åãî. Ñàìî å¼ íàçâàíèå îáðàçîâàíî îò ñëîâ ¾No OPeration¿. 2.9. Çàêëþ÷èòåëüíûå çàìå÷àíèÿÊîíå÷íî, ìû íå ðàññìîòðåëè è äåñÿòîé äîëè âîçìîæíîñòåé ïðîöåññîðà i386, åñëè æå ãîâîðèòü î ðàñøèðåíèÿõ åãî âîçìîæíîñòåé, ïîÿâèâøèõñÿâ áîëåå ïîçäíèõ ïðîöåññîðàõ (íàïðèìåð, MMX-ðåãèñòðû), òî äîëÿ èçó÷åííîãî íàìè îêàæåòñÿ åù¼ ñêðîìíåå. Îäíàêî ïèñàòü ïðîãðàììû íà ÿçûêåàññåìáëåðà ìû òåïåðü ìîæåì, è ýòî ïîçâîëèò íàì ïîëó÷èòü îïûò ïðîãðàììèðîâàíèÿ â òåðìèíàõ ìàøèííûõ êîìàíä, ÷òî, êàê áûëî ñêàçàíîâ ïðåäèñëîâèè, ÿâëÿåòñÿ íåîáõîäèìûì óñëîâèåì êà÷åñòâåííîãî ïðîãðàììèðîâàíèÿ âîîáùå íà ëþáîì ÿçûêå ïðîãðàììèðîâàíèÿ : íåëüçÿ ñîçäàâàòüõîðîøèå ïðîãðàììû, íå ïîíèìàÿ, ÷òî íà ñàìîì äåëå ïðîèñõîäèò.×èòàòåëè, ó êîòîðûõ âîçíèêíåò æåëàíèå èçó÷èòü àïïàðàòíóþ ïëàòôîðìó i386 áîëåå ãëóáîêî, ìîãóò îáðàòèòüñÿ ê òåõíè÷åñêîé äîêóìåíòàöèèè ñïðàâî÷íèêàì, êîòîðûå â áîëåå ÷åì äîñòàòî÷íîì êîëè÷åñòâå ïðåäñòàâëåíû â ñåòè Èíòåðíåò.
Õî÷åòñÿ, îäíàêî, çàðàíåå ïðåäóïðåäèòü âñåõ, ó êîãîâîçíèêíåò òàêîå æåëàíèå, ÷òî ïðîöåññîð i386 (îò÷àñòè ¾áëàãîäàðÿ¿ òÿæåëîìó íàñëåäèþ 8086) èìååò îäíó èç ñàìûõ õàîòè÷íûõ è íåëîãè÷íûõ ñèñòåì êîìàíä â ìèðå; îñîáåííî ýòî ñòàíîâèòñÿ çàìåòíî, êàê òîëüêî ìû ïîêèäàåì óþòíûé ìèð îãðàíè÷åííîãî ðåæèìà è ¾ïëîñêîé¿ ìîäåëè ïàìÿòè,â êîòîðîì íàñ çàáîòëèâî óñòðîèëà îïåðàöèîííàÿ ñèñòåìà, è âñòðå÷àåìñÿëèöîì ê ëèöó ñ ïðîãðàììèðîâàíèåì äåñêðèïòîðîâ ñåãìåíòîâ, íåëåïûìèïðûæêàìè ìåæäó êîëüöàìè çàùèòû è ïðî÷èìè ¾ïðåëåñòÿìè¿ ïëàòôîðìû, ñ êîòîðûìè ïðèõîäèòñÿ áîðîòüñÿ ñîçäàòåëÿì ñîâðåìåííûõ îïåðàöèîííûõ ñèñòåì.Òàê ÷òî, åñëè âàñ âñåðü¼ç çàèíòåðåñîâàëî íèçêîóðîâíåâîå ïðîãðàììèðîâàíèå, ìû ìîæåì ïîñîâåòîâàòü ïîèçó÷àòü äðóãèå àðõèòåêòóðû, íàïðèìåð, ïðîöåññîðû SPARC.
Âïðî÷åì, ëþáîïûòñòâî â ëþáîì ñëó÷àå íå ïîðîê,è åñëè âû ãîòîâû ê îïðåäåë¼ííûì òðóäíîñòÿì òî íàéäèòå ëþáîé ñïðàâî÷íèê ïî i386 è èçó÷àéòå íà çäîðîâüå :-)94Ãëàâà 3. Àññåìáëåð NASMÐàíåå ìû èñïîëüçîâàëè àññåìáëåð NASM, îãðàíè÷èâàÿñü ëèøü îáùèìè çàìå÷àíèÿìè è èçðåäêà îòâëåêàÿñü, ÷òîáû îïèñàòü íåêîòîðûå åãîâîçìîæíîñòè, áåç êîòîðûõ íå ìîãëè îáîéòèñü. Òàê, â 1.5 áûëî äàíî ðîâíî ñòîëüêî ïîÿñíåíèé, ÷òîáû ìîæíî áûëî ïîíÿòü îäíó ïðîñòåéøóþ ïðîãðàììó.  2.2 íàì ïîòðåáîâàëîñü èñïîëüçîâàòü ïàìÿòü äëÿ õðàíåíèÿäàííûõ, è ïðèøëîñü ïîñâÿòèòü 2.2.2 äèðåêòèâàì ðåçåðâèðîâàíèÿ ïàìÿòè è ìåòêàì.
Ïðåæäå ÷åì ïðèâåñòè â 2.6.9 ïðèìåð ñëîæíîé ïîäïðîãðàììû, ìû âûíóæäåíû áûëè â 2.6.8 ðàññêàçàòü ïðî ëîêàëüíûå ìåòêè.Ýòó ãëàâó ìû öåëèêîì ïîñâÿòèì èçó÷åíèþ àññåìáëåðà NASM, íà÷àâñ áîëåå ôîðìàëüíîãî, ÷åì ðàíüøå, îïèñàíèÿ ñèíòàêñèñà åãî ÿçûêà. Ïîñëåýòîãî ìû èçó÷èì âîçìîæíîñòè åãî ìàêðîïðîöåññîðà è çàêîí÷èì ýòî âñ¼êðàòêèì îïèñàíèåì êëþ÷åé êîìàíäíîé ñòðîêè, èñïîëüçóåìûõ ïðè çàïóñêå NASM. 3.1. Ñèíòàêñèñ ÿçûêà àññåìáëåðà NASMÎñíîâíîé ñèíòàêñè÷åñêîé åäèíèöåé ïðàêòè÷åñêè ëþáîãî ÿçûêà àññåìáëåðà (è NASM òóò íå èñêëþ÷åíèå) ÿâëÿåòñÿ ñòðîêà òåêñòà. Ýòèì ÿçûêè àññåìáëåðà îòëè÷àþòñÿ îò áîëüøèíñòâà (õîòÿ è äàëåêî íå âñåõ) ÿçûêîââûñîêîãî óðîâíÿ, â êîòîðûõ ñèìâîë ïåðåâîäà ñòðîêè ïðèðàâíèâàåòñÿ êîáû÷íîìó ïðîáåëó.Åñëè ïî êàêèì-ëèáî ïðè÷èíàì íàì íå õâàòèëî äëèíû ñòðîêè, ÷òîáûóìåñòèòü âñ¼, ÷òî ìû õîòåëè â íåé óìåñòèòü, òî ìîæíî âîñïîëüçîâàòüñÿñðåäñòâîì ¾ñêëåèâàíèÿ¿ ñòðîê.
Åñëè ïîñëåäíèì ñèìâîëîì ñòðîêè ïîñòàâèòü ¾îáðàòíûé ñëýø¿ (ñèìâîë ¾\¿), òî àññåìáëåð áóäåò ñ÷èòàòü ñëåäóþùóþ ñòðîêó ïðîäîëæåíèåì ïðåäûäóùåé. Îòìåòèì, ÷òî ýòî ãîðàçäîëó÷øå, ÷åì äîïóñêàòü â òåêñòå ïðîãðàììû î÷åíü äëèííûå ñòðîêè; îáû÷íî ñòðîêà ïðîãðàììû (ëþáîé, íå òîëüêî íà ÿçûêå àññåìáëåðà) íå äîëæíàïðåâûøàòü 75 ñèìâîëîâ, õîòÿ êîìïèëÿòîðû ýòîãî îò íàñ è íå òðåáóþò.95Ñòðîêà òåêñòà1 íà ÿçûêå àññåìáëåðà NASM ñîñòîèò (â îáùåì ñëó÷àå)èç ÷åòûð¼õ ïîëåé: ìåòêè, èìåíè êîìàíäû, îïåðàíäîâ è êîììåíòàðèÿ, ïðè÷¼ì ìåòêà, èìÿ êîìàíäû è êîììåíòàðèé ÿâëÿþòñÿ ïîëÿìè íåîáÿçàòåëüíûìè, ÷òî êàñàåòñÿ îïåðàíäîâ, òî òðåáîâàíèÿ ê íèì íàëàãàþòñÿ êîìàíäîé; åñëè èìÿ êîìàíäû îòñóòñòâóåò, òî îòñóòñòâóþò è îïåðàíäû. Ìîãóòîòñóòñòâîâàòü è âñå ÷åòûðå ïîëÿ, òîãäà ñòðîêà îêàçûâàåòñÿ ïóñòîé. Àññåìáëåð ïóñòûå ñòðîêè èãíîðèðóåò, íî ìû ìîæåì èñïîëüçîâàòü èõ, ÷òîáûâèçóàëüíî ðàçäåëÿòü ìåæäó ñîáîé ÷àñòè ïðîãðàììû. êà÷åñòâå ìåòêè ìîæíî èñïîëüçîâàòü ñëîâî, ñîñòîÿùåå èç ëàòèíñêèõáóêâ, öèôð, à òàêæå ñèìâîëîâ '_', '$', '#', '@', '~', '.' è '?', ïðè÷¼ìíà÷èíàòüñÿ ìåòêà ìîæåò òîëüêî ñ áóêâû èëè ñèìâîëîâ '_', '?' è '.';êàê ìû âèäåëè â 2.6.8, ìåòêè, íà÷èíàþùèåñÿ ñ òî÷êè, ñ÷èòàþòñÿ ëîêàëüíûìè.
Êðîìå òîãî, â íåêîòîðûõ ñëó÷àÿõ èìÿ ìåòêè ìîæíî ïðåäâàðèòüñèìâîëîì '$'; îáû÷íî ýòî èñïîëüçóåòñÿ, åñëè íóæíî ñîçäàòü ìåòêó, èìÿêîòîðîé ñîâïàäàåò ñ èìåíåì ðåãèñòðà, êîìàíäû èëè äèðåêòèâû2 . Íàäî îòìåòèòü, ÷òî àññåìáëåð ðàçëè÷àåò ðåãèñòð áóêâ â èìåíàõ ìåòîê, òî åñòü,íàïðèìåð, 'label', 'LABEL', 'Label' è 'LaBeL' ýòî ÷åòûðå ðàçíûåìåòêè. Ïîñëå ìåòêè, åñëè îíà â ñòðîêå ïðèñóòñòâóåò, ìîæíî ïîñòàâèòüñèìâîë äâîåòî÷èÿ, íî íå îáÿçàòåëüíî. Êàê óæå îòìå÷àëîñü, îáû÷íî ïðîãðàììèñòû ñòàâÿò äâîåòî÷èÿ ïîñëå ìåòîê, íà êîòîðûå ìîæíî ïåðåäàâàòüóïðàâëåíèå, è íå ñòàâÿò äâîåòî÷èÿ ïîñëå ìåòîê, îáîçíà÷àþùèõ îáëàñòèïàìÿòè. Õîòÿ àññåìáëåð è íå òðåáóåò ïîñòóïàòü èìåííî òàê, ïðîãðàììàïðè èñïîëüçîâàíèè ýòîãî ñîãëàøåíèÿ ñòàíîâèòñÿ ÿñíåå. ïîëå èìåíè êîìàíäû, åñëè îíî ïðèñóòñòâóåò, ìîæåò áûòü îáîçíà÷åíèå ìàøèííîé êîìàíäû (âîçìîæíî, ñ ïðåôèêñîì rep, ñì.
ñòð. 91; ñóùåñòâóþò è äðóãèå ïðåôèêñû), ëèáî ïñåâäîêîìàíäû äèðåêòèâû ñïåöèàëüíîãî âèäà (íåêîòîðûå èç íèõ ìû óæå ðàññìàòðèâàëè, è ê ýòîìóâîïðîñó åù¼ âåðí¼ìñÿ), ëèáî, íàêîíåö, èìÿ ìàêðîñà (ñ òàêèìè ìû òîæåâñòðå÷àëèñü, ê íèì îòíîñèòñÿ, íàïðèìåð, èñïîëüçîâàâøèéñÿ â ïðèìåðàõPRINT; ñîçäàíèþ ìàêðîñîâ áóäåò ïîñâÿù¼í îòäåëüíûé ïàðàãðàô).  îòëè÷èå îò ìåòîê, â èìåíàõ ìàøèííûõ êîìàíä è ïñåâäîêîìàíä àññåìáëåððåãèñòðû áóêâ íå ðàçëè÷àåò, òàê ÷òî ìû ìîæåì ñ ðàâíûì óñïåõîì íàïèñàòü, íàïðèìåð, mov, MOV, Mov è äàæå mOv, õîòÿ òàê ïèñàòü, êîíå÷íî æå,íå ñòîèò.
 èìåíàõ ìàêðîñîâ, êàê è â èìåíàõ ìåòîê, ðåãèñòð ðàçëè÷àåòñÿ.Òðåáîâàíèÿ ê ñîäåðæèìîìó ïîëÿ îïåðàíäîâ çàâèñÿò îò òîãî, êàêàÿêîíêðåòíî êîìàíäà, ïñåâäîêîìàíäà èëè ìàêðîñ óêàçàíû â ïîëå êîìàíäû. Åñëè îïåðàíäîâ áîëüøå îäíîãî, òî îíè ðàçäåëÿþòñÿ çàïÿòîé.  ïîëå1 Çäåñü è äàëåå ïîä ¾ñòðîêîé¿ ïîíèìàåòñÿ â òîì ÷èñëå è ¾ëîãè÷åñêàÿ¿ ñòðîêà,ñêëååííàÿ èç íåñêîëüêèõ ñòðîê ñ ïîìîùüþ îáðàòíûõ ñëýøåé; â äàëüíåéøåì ìû íåáóäåì óòî÷íÿòü, ÷òî èìååì â âèäó èìåííî òàêèå ñòðîêè.2 Òàêîå ìîæåò ïîíàäîáèòüñÿ òîëüêî â ñëó÷àå, åñëè âàøà ïðîãðàììà ñîñòîèò èç ìîäóëåé, íàïèñàííûõ íà ðàçíûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ; òîãäà â äðóãèõ ìîäóëÿõâïîëíå ìîãóò âñòðåòèòüñÿ ìåòêè, ñîâïàäàþùèå ïî èìåíè ñ êëþ÷åâûìè ñëîâàìè àññåìáëåðà, è ìîæåò ïîòðåáîâàòüñÿ âîçìîæíîñòü íà íèõ ññûëàòüñÿ.96îïåðàíäîâ ÷àñòî ïðèõîäèòñÿ èñïîëüçîâàòü íàçâàíèÿ ðåãèñòðîâ, è â ýòèõíàçâàíèÿõ ðåãèñòð áóêâ íå ðàçëè÷àåòñÿ, êàê è â èìåíàõ ìàøèííûõ êîìàíä.×èòàòåëþ, çàïóòàâøåìóñÿ â òîì, ãäå æå ðåãèñòð âàæåí, à ãäå íåò,ìîæíî ïîðåêîìåíäîâàòü îäíî ïðîñòîå ïðàâèëî: àññåìáëåð nasm íå ðàç-ëè÷àåò çàãëàâíûå è ñòðî÷íûå áóêâû âî âñåõ ñëîâàõ, êîòîðûå îíââ¼ë ñàì: â èìåíàõ êîìàíä, íàçâàíèÿõ ðåãèñòðîâ, äèðåêòèâàõ,ïñåâäîêîìàíäàõ, îáîçíà÷åíèÿõ äëèíû îïåðàíäîâ è òèïà ïåðåõîäîâ (ñëîâà byte, dword, near è ò.
ï.), íî ïðè ýòîì ñ÷èòàåò çàãëàâíûå è ñòðî÷íûå ðàçíûìè áóêâàìè â òåõ èìåíàõ, êîòîðûå ââîäèòïîëüçîâàòåëü (ïðîãðàììèñò, ïèøóùèé íà ÿçûêå àññåìáëåðà) â ìåòêàõ è èìåíàõ ìàêðîñîâ.Îòìåòèì åù¼ îäíî ñâîéñòâî NASM, ñâÿçàííîå ñ çàïèñüþ îïåðàíäîâ.Îïåðàíä òèïà ¾ïàìÿòü¿ âñåãäà çàïèñûâàåòñÿ ñ èñïîëüçîâàíèåìêâàäðàòíûõ ñêîáîê.