А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 13
Текст из файла (страница 13)
 ïðåäûäóùåì ïàðàãðàôå ìûðàññìàòðèâàëè ñèòóàöèè, êîãäà àäðåñ âû÷èñëåí, ðåçóëüòàò âû÷èñëåíèéçàíåñ¼í â ðåãèñòð è èìåííî çíà÷åíèå, õðàíÿùååñÿ â ðåãèñòðå, èñïîëüçóåòñÿ â êà÷åñòâå èñïîëíèòåëüíîãî àäðåñà. Äëÿ óäîáñòâà ïðîãðàììèðîâà48CONSTANT+EAXEBXECXEDXESIEDIEBPESP+EAXEBXECXEDXESIEDIEBP*1248Ðèñ. 2.2. Îáùèé âèä èñïîëíèòåëüíîãî àäðåñàíèÿ ïðîöåññîð i386 ïîçâîëÿåò è áîëåå ñëîæíûå ñïîñîáû çàäàíèÿ èñïîëíèòåëüíîãî àäðåñà, ïðè êîòîðûõ èñïîëíèòåëüíûé àäðåñ âû÷èñëÿåòñÿ óæåâ õîäå âûïîëíåíèÿ êîìàíäû.Åñëè ãîâîðèòü òî÷íåå, ìû ìîæåì ïîòðåáîâàòü îò ïðîöåññîðà âçÿòüíåêîòîðîå çàðàíåå çàäàííîå çíà÷åíèå (âîçìîæíî, ðàâíîå íóëþ, à âîçìîæíî, è íå íóëåâîå), ïðèáàâèòü ê íåìó çíà÷åíèå, õðàíÿùååñÿ â îäíîì èç ðåãèñòðîâ, à çàòåì âçÿòü çíà÷åíèå, õðàíÿùååñÿ â åù¼ îäíîì èç ðåãèñòðîâ,óìíîæèòü íà 1, 2, 4 èëè 8 è ïðèáàâèòü ðåçóëüòàò ê óæå èìåþùåìóñÿàäðåñó.
Íàïðèìåð, ìû ìîæåì íàïèñàòümov eax, [array+ebx+2*edi] ðåçóëüòàòå òàêîé êîìàíäû ïðîöåññîð ñëîæèò ÷èñëî (çàäàííîå ìåòêîéarray) ñ ñîäåðæèìûì ðåãèñòðà EBX è óäâîåííûì ñîäåðæèìûì ðåãèñòðàEDI, ðåçóëüòàò òàêîãî ñëîæåíèÿ èñïîëüçóåò â êà÷åñòâå èñïîëíèòåëüíîãî àäðåñà, èçâëå÷¼ò èç îáëàñòè ïàìÿòè ïî ýòîìó àäðåñó 4 áàéòà è ñêîïèðóåò èõ â ðåãèñòð EAX. Êàæäîå èç òð¼õ ñëàãàåìûõ, èñïîëüçóåìûõ âèñïîëíèòåëüíîì àäðåñå, ÿâëÿåòñÿ íåîáÿçàòåëüíûì, òî åñòü ìû ìîæåì èñïîëüçîâàòü òîëüêî äâà ñëàãàåìûõ èëè âñåãî îäíî (êàê, ñîáñòâåííî, ìû èïîñòóïàëè â ïðåäûäóùèõ ïàðàãðàôàõ).Âàæíî ïîíèìàòü, ÷òî âûðàæåíèå â êâàäðàòíûõ ñêîáêàõ íèêîèì îáðàçîì íå ìîæåò áûòü ïðîèçâîëüíûì. Íàïðèìåð, ìû íå ìîæåì âçÿòü òðèðåãèñòðà, íå ìîæåì óìíîæèòü îäèí ðåãèñòð íà 2, à äðóãîé íà 4, íå ìîæåìóìíîæàòü íà èíûå ÷èñëà, êðîìå 1, 2, 4 è 8, íå ìîæåì, íàïðèìåð, ïåðåìíîæèòü äâà ðåãèñòðà ìåæäó ñîáîé èëè âû÷åñòü çíà÷åíèå ðåãèñòðà, âìåñòîòîãî ÷òîáû ïðèáàâëÿòü åãî.
Îáùèé âèä èñïîëíèòåëüíîãî àäðåñà ïîêàçàííà ðèñ. 2.2; êàê ìîæíî çàìåòèòü, â êà÷åñòâå ðåãèñòðà, ïîäëåæàùåãî äîìíîæåíèþ íà êîýôôèöèåíò, ìû íå ìîæåì èñïîëüçîâàòü ESP, â êà÷åñòâåæå ðåãèñòðà, çíà÷åíèå êîòîðîãî ïðîñòî äîáàâëÿåòñÿ ê çàäàííîìó àäðåñó,ìîæíî èñïîëüçîâàòü ëþáîé èç âîñüìè ðåãèñòðîâ îáùåãî íàçíà÷åíèÿ.49Ñ äðóãîé ñòîðîíû, àññåìáëåð äîïóñêàåò îïðåäåë¼ííûå âîëüíîñòè ñ çàïèñüþàäðåñà, åñëè òîëüêî îí ïðè ýòîì ìîæåò êîððåêòíî ïðåîáðàçîâàòü àäðåñ â ìàøèííóþ êîìàíäó. Âî-ïåðâûõ, ñëàãàåìûå ìîæíî ðàñïîëîæèòü â ïðîèçâîëüíîì ïîðÿäêå.Âî-âòîðûõ, ìîæíî èñïîëüçîâàòü íå îäíó êîíñòàíòó, à äâå: àññåìáëåð ñàì ñëîæèòèõ è ðåçóëüòàò çàïèøåò â ïîëó÷àþùóþñÿ ìàøèííóþ êîìàíäó. Íàêîíåö, ìîæíîóìíîæèòü ðåãèñòð íà 3, 5 èëè 9: åñëè âû íàïèøåòå, íàïðèìåð, [eax*5], àññåìáëåð ¾ïåðåâåä¼ò¿ ýòî êàê [eax+eax*4].
Êîíå÷íî, åñëè âû ïîïûòàåòåñü íàïèñàòü[eax+ebx*5], àññåìáëåð âûäàñò îøèáêó, âåäü íóæíîå åìó ñëàãàåìîå âû óæå èñïîëüçîâàëè.×òîáû ïîíÿòü, çà÷åì ìîæåò ïîíàäîáèòüñÿ òàêîé ñëîæíûé âèä èñïîëíèòåëüíîãî àäðåñà, äîñòàòî÷íî ïðåäñòàâèòü ñåáå äâóìåðíûé ìàññèâ, ñîñòîÿùèé, íàïðèìåð, èç 10 ñòðîê, êàæäàÿ èç êîòîðûõ ñîäåðæèò 15 ÷åòûð¼õáàéòíûõ öåëûõ ÷èñåë. Íàçîâ¼ì ýòîò ìàññèâ matrix, ïîñòàâèâ ïåðåäåãî îïèñàíèåì ñîîòâåòñòâóþùóþ ìåòêó:matrixdd 10*15Äëÿ äîñòóïà ê ýëåìåíòàì N -é ñòðîêè òàêîãî ìàññèâà ìû ìîæåì âû÷èñëèòü ñìåùåíèå îò íà÷àëà ìàññèâà äî íà÷àëà ýòîé N -é ñòðîêè (äëÿ ýòîãîíóæíî óìíîæèòü N íà äëèíó ñòðîêè, ñîñòàâëÿþùóþ 15 ∗ 4 = 60 áàéò),çàíåñòè ðåçóëüòàò âû÷èñëåíèé, ñêàæåì, â EAX, çàòåì â äðóãîé ðåãèñòð(íàïðèìåð, â EBX) çàíåñòè íîìåð íóæíîãî ýëåìåíòà â ñòðîêå è èñïîëíèòåëüíûé àäðåñ âèäà [matrix+eax+4*ebx] â òî÷íîñòè çàäàñò íàì ìåñòîâ ïàìÿòè, ãäå ðàñïîëîæåí íóæíûé ýëåìåíò. 2.2.7.
Ðàçìåðû îïåðàíäîâ è èõ äîïóñòèìûåêîìáèíàöèèÈòàê, ìû ââåëè òðè òèïà îïåðàíäîâ:1. íåïîñðåäñòâåííûå îïåðàíäû, çàäàþùåå çíà÷åíèå ïðÿìî â êîìàíäå;2. ðåãèñòðîâûå îïåðàíäû, ïðåäïèñûâàþùèå âçÿòü çíà÷åíèå èç çàäàííîãî ðåãèñòðà è/èëè ïîìåñòèòü ðåçóëüòàò âûïîëíåíèÿ êîìàíäû âýòîò ðåãèñòð3. îïåðàíäû òèïà ¾ïàìÿòü¿, çàäàþùèå àäðåñ, ïî êîòîðîìó â ïàìÿòèíàõîäèòñÿ íóæíîå çíà÷åíèå è/èëè ïî êîòîðîìó â ïàìÿòü íóæíîçàïèñàòü ðåçóëüòàò ðàáîòû êîìàíäû.ßñíî, ÷òî íå â ëþáîé ñèòóàöèè íàì ïîäîéä¼ò ëþáîé òèï îïåðàíäà. Íàïðèìåð, î÷åâèäíî, ÷òî íåïîñðåäñòâåííûé îïåðàíä íåëüçÿ èñïîëüçîâàòüâ êà÷åñòâå ïåðâîãî àðãóìåíòà êîìàíäû mov, âåäü ýòîò àðãóìåíò äîëæåíçàäàâàòü òî ìåñòî, êóäà ïðîèçâîäèòñÿ êîïèðîâàíèå äàííûõ; ìû ìîæåìêîïèðîâàòü äàííûå â ðåãèñòð èëè â îáëàñòü îïåðàòèâíîé ïàìÿòè, îäíàêîíåïîñðåäñòâåííûå îïåðàíäû íè òîãî, íè äðóãîãî íå çàäàþò.
Èìåþòñÿ è50äðóãèå îãðàíè÷åíèÿ, íàëàãàåìûå, êàê ïðàâèëî, óñòðîéñòâîì ñàìîãî ïðîöåññîðà êàê ýëåêòðîííîé ñõåìû. Òàê, íàïðèìåð, íè â êîìàíäå mov, íè âäðóãèõ êîìàíäàõ íåëüçÿ èñïîëüçîâàòü ñðàçó äâà îïåðàíäà òèïà ¾ïàìÿòü¿.Åñëè íåîáõîäèìî, ñêàæåì, ñêîïèðîâàòü çíà÷åíèå èç îáëàñòè ïàìÿòè x âîáëàñòü ïàìÿòè y, íåîáõîäèìî äåëàòü ýòî ÷åðåç ðåãèñòð:mov eax, [x]mov [y], eaxÊîìàíäà mov [y],[x] áóäåò îòâåðãíóòà àññåìáëåðîì êàê îøèáî÷íàÿ, ïîñêîëüêó åé íå ñîîòâåòñòâóåò íèêàêîé ìàøèííûé êîä: ïðîöåññîð ïîïðîñòóíå óìååò âûïîëíÿòü òàêîå êîïèðîâàíèå çà îäíó èíñòðóêöèþ.Âñå îñòàëüíûå êîìáèíàöèè òèïîâ îïåðàíäîâ äëÿ êîìàíäû mov ÿâëÿþòñÿ äîïóñòèìûìè, òî åñòü çà îäíó êîìàíäó mov ìû ìîæåì:1. ñêîïèðîâàòü çíà÷åíèå èç ðåãèñòðà â ðåãèñòð2. ñêîïèðîâàòü çíà÷åíèå èç ðåãèñòðà â ïàìÿòü3.
ñêîïèðîâàòü çíà÷åíèå èç ïàìÿòè â ðåãèñòð4. çàäàòü (íåïîñðåäñòâåííûì îïåðàíäîì) çíà÷åíèå ðåãèñòðà5. çàäàòü (íåïîñðåäñòâåííûì îïåðàíäîì) çíà÷åíèå ÿ÷åéêè èëè îáëàñòè ïàìÿòè.Ïîñëåäíèé âàðèàíò çàñëóæèâàåò îñîáîãî ðàññìîòðåíèÿ. Äî ñèõ ïîð âîâñåõ êîìàíäàõ, êîòîðûå ìû èñïîëüçîâàëè â ïðèìåðàõ, õîòÿ áû îäèí èçîïåðàíäîâ áûë ðåãèñòðîâûì; ýòî ïîçâîëÿëî íå äóìàòü î ðàçìåðå îïåðàíäîâ, òî åñòü î òîì, ÿâëÿþòñÿ ëè íàøè îïåðàíäû îòäåëüíûìè áàéòàìè,äâóõáàéòîâûìè ¾ñëîâàìè¿ èëè ÷åòûð¼õáàéòîâûìè ¾äâîéíûìè ñëîâàìè¿.Îòìåòèì, ÷òî êîìàíäà mov íå ìîæåò ïåðåñûëàòü äàííûå ìåæäó îïåðàíäàìè ðàçíîãî ðàçìåðà (íàïðèìåð, ìåæäó îäíîáàéòîâûì ðåãèñòðîì AL èäâóõáàéòîâûì ðåãèñòðîì CX); ïîýòîìó âñåãäà, åñëè õîòÿ áû îäèí èç îïåðàíäîâ ÿâëÿåòñÿ ðåãèñòðîâûì, ìîæíî îäíîçíà÷íî ñêàçàòü, êàêîãî ðàçìåðà ïîðöèÿ äàííûõ ïîäëåæèò îáðàáîòêå (â äàííîì ñëó÷àå ïðîñòîìóêîïèðîâàíèþ).
Îäíàêî æå â âàðèàíòå, êîãäà ïåðâûé îïåðàíä êîìàíäûmov çàäà¼ò àäðåñ â ïàìÿòè, êóäà íóæíî çàïèñàòü çíà÷åíèå, à âòîðîé ÿâëÿåòñÿ íåïîñðåäñòâåííûì (òî åñòü çàïèñûâàåìîå çíà÷åíèå çàäàíî ïðÿìîâ êîìàíäå), àññåìáëåð íå çíàåò è íå èìååò îñíîâàíèé ïðåäïîëàãàòü, êàêîãî êîíêðåòíî ðàçìåðà íóæíî ïåðåñëàòü ïîðöèþ äàííûõ, èëè, èíà÷åãîâîðÿ, ñêîëüêî áàéò ïàìÿòè, íà÷èíàÿ ñ çàäàííîãî àäðåñà, äîëæíî áûòüçàïèñàíî. Ïîýòîìó, íàïðèìåð, êîìàíäàmov [x], 25; ÎØÈÁÊÀ!!!51áóäåò îòâåðãíóòà êàê îøèáî÷íàÿ: íåïîíÿòíî, èìååòñÿ ëè â âèäó áàéò ñîçíà÷åíèåì 25, ¾ñëîâî¿ ñî çíà÷åíèåì 25 èëè ¾äâîéíîå ñëîâî¿ ñî çíà÷åíèåì 25. Òåì íå ìåíåå, êîìàíäà, ïîäîáíàÿ âûøåïðèâåä¼ííîé, âïîëíå ìîæåòïîíàäîáèòüñÿ, è ïðîöåññîð óìååò òàêóþ êîìàíäó âûïîëíÿòü. ×òîáû âîñïîëüçîâàòüñÿ òàêîé êîìàíäîé, íàì íóæíî ïðîñòî óêàçàòü àññåìáëåðó, ÷òîêîíêðåòíî ìû èìååì â âèäó.
Ýòî äåëàåòñÿ óêàçàíèåì ñïåöèôèêàòîðàðàçìåðà ïåðåä ëþáûì èç îïåðàíäîâ; â êà÷åñòâå òàêîãî ñïåöèôèêàòîðàìîæåò âûñòóïàòü ñëîâî byte, word èëè dword, îáîçíà÷àþùèå, ñîîòâåòñòâåííî, áàéò, ñëîâî èëè äâîéíîå ñëîâî (ò. å. ðàçìåð 1, 2 èëè 4 áàéòà).Òàê, íàïðèìåð, åñëè ìû õîòåëè çàïèñàòü ÷èñëî 25 â ÷åòûð¼õáàéòíóþ îáëàñòü ïàìÿòè, íàõîäÿùóþñÿ ïî àäðåñó x, ìû ìîæåì íàïèñàòümov [x], dword 25èëèmov dword [x], 25Ñäåëàåì îäíî âàæíîå çàìå÷àíèå. Ðàçëè÷íûå ìàøèííûå êîìàíäû, âûïîëíÿþùèå ñõîæèå äåéñòâèÿ, ìîãóò îáîçíà÷àòüñÿ îäíîé è òîé æå ìíåìîíèêîé.
Òàê,movmovmovmoveax,eax,[x],[x],2[x]eaxalïðåäñòàâëÿþò ñîáîé ÷åòûðå ñîâåðøåííî ðàçíûå ìàøèííûå êîìàíäû, îíèèìåþò ðàçíûå çíà÷åíèÿ ìàøèííîãî êîäà è äàæå çàíèìàþò ðàçíîåêîëè÷åñòâî áàéòîâ â ïàìÿòè. Âìåñòå ñ òåì, êîìàíäûmov eax, 2mov eax, xèñïîëüçóþò îäèí è òîò æå ìàøèííûé êîä îïåðàöèè è ðàçëè÷àþòñÿ òîëüêîçíà÷åíèåì âòîðîãî îïåðàíäà, êîòîðûé â îáîèõ ñëó÷àÿõ íåïîñðåäñòâåííûé(äåéñòâèòåëüíî, âåäü ìåòêà x áóäåò çàìåíåíà íà àäðåñ, òî åñòü ïðîñòî÷èñëî). 2.2.8. Êîìàíäà leaÂîçìîæíîñòè ïðîöåññîðà ïî âû÷èñëåíèþ èñïîëíèòåëüíîãî àäðåñàìîæíî çàäåéñòâîâàòü è îòäåëüíî îò îáðàùåíèÿ ê ïàìÿòè.
Äëÿ ýòîãîïðåäóñìîòðåíà êîìàíäà lea (íàçâàíèå îáðàçîâàíî îò ñëîâ ¾load eectiveaddress¿). Êîìàíäà èìååò äâà îïåðàíäà, ïðè÷¼ì ïåðâûé èç íèõ îáÿçàíáûòü ðåãèñòðîâûì (ðàçìåðîì 2 èëè 4 áàéòà), à âòîðîé îïåðàíäîì òèïà52¾ïàìÿòü¿. Ïðè ýòîì íèêàêîãî îáðàùåíèÿ ê ïàìÿòè êîìàíäà íå äåëàåò;âìåñòî ýòîãî â ðåãèñòð, óêàçàííûé ïåðâûì îïåðàíäîì, çàíîñèòñÿ àäðåñ,âû÷èñëåííûé îáû÷íûì ñïîñîáîì äëÿ âòîðîãî îïåðàíäà.
Åñëè ïåðâûé îïåðàíä äâóõáàéòíûé ðåãèñòð, òî â íåãî áóäóò çàïèñàíû ìëàäøèå 16 áèòâû÷èñëåííîãî àäðåñà. Íàïðèìåð, êîìàíäàlea eax, [1000+ebx+8*ecx]âîçüì¼ò çíà÷åíèå ðåãèñòðà ECX, óìíîæèò åãî íà 8, ïðèáàâèò ê ýòîìó çíà÷åíèå ðåãèñòðà EBX è ÷èñëî 1000, à ïîëó÷åííûé ðåçóëüòàò çàíåñ¼ò â ðåãèñòð EAX. Ðàçóìååòñÿ, âìåñòî ÷èñëà ìîæíî èñïîëüçîâàòü è ìåòêó. Îãðàíè÷åíèÿ íà âûðàæåíèå â ñêîáêàõ òî÷íî òàêèå æå, êàê è â äðóãèõ ñëó÷àÿõèñïîëüçîâàíèÿ îïåðàíäà òèïà ¾ïàìÿòü¿ (ñì. ðèñ. 2.2 íà ñòð. 49).Ïîä÷åðêí¼ì åù¼ ðàç, ÷òî êîìàíäà lea òîëüêî âû÷èñëÿåò àäðåñ,íå îáðàùàÿñü ê ïàìÿòè, íåñìîòðÿ íà èñïîëüçîâàíèå îïåðàíäà òèïà¾ïàìÿòü¿. 2.3. Öåëî÷èñëåííàÿ àðèôìåòèêà 2.3.1. Ïðîñòûå êîìàíäû ñëîæåíèÿ è âû÷èòàíèÿÎïåðàöèè ñëîæåíèÿ è âû÷èòàíèÿ íàä öåëûìè ÷èñëàìè ïðîèçâîäÿòñÿñîîòâåòñòâåííî êîìàíäàìè add è sub.