А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 16
Текст из файла (страница 16)
Êîìàíäû óñëîâíîãî ïåðåõîäà ïî ðåçóëüòàòàì àðèôìåòè÷åñêîãî ñðàâíåíèÿ (cmp a, b)ñìûñëà, íî çàòî îñìûñëåííûì ñòàíîâèòñÿ ðàññìîòðåíèå ôëàãà CF (carryag), êîòîðûé âûñòàâëÿåòñÿ â åäèíèöó, åñëè ïî èòîãàì àðèôìåòè÷åñêîéîïåðàöèè ïðîèçîøåë ïåðåíîñ èç ñòàðøåãî ðàçðÿäà (ïðè ñëîæåíèè), ëèáî çà¼ì èç íåñóùåñòâóþùåãî ðàçðÿäà (äëÿ âû÷èòàíèÿ). Èìåííî ýòî íàìçäåñü è íóæíî: åñëè a è b ðàññìàòðèâàþòñÿ êàê áåççíàêîâûå è a < b, òîïðè âû÷èòàíèè a − b êàê ðàç è ïðîèçîéä¼ò òàêîé çà¼ì.
Òàêèì îáðàçîì,íàì äîñòàòî÷íî âîñïîëüçîâàòüñÿ çíà÷åíèåì ôëàãà CF, òî åñòü âûïîëíèòüêîìàíäó jc, êîòîðàÿ ñïåöèàëüíî äëÿ äàííîé ñèòóàöèè èìååò ñèíîíèìûjb (¾jump if below¿) è jnae (¾jump if not above or equal¿).Êîãäà íàñ èíòåðåñóþò ñîîòíîøåíèÿ ¾áîëüøå¿ è ¾ìåíüøå ëèáî ðàâíî¿,íåîáõîäèìî âêëþ÷èòü â ðàññìîòðåíèå è ôëàã ZF, êîòîðûé (êàê äëÿ çíàêîâûõ, òàê è äëÿ áåççíàêîâûõ ÷èñåë) îáîçíà÷àåò ðàâåíñòâî àðãóìåíòîâïðåäøåñòâóþùåé êîìàíäû cmp.Âñå êîìàíäû óñëîâíûõ ïåðåõîäîâ ïî ðåçóëüòàòó àðèôìåòè÷åñêîãîñðàâíåíèÿ ïðèâåäåíû â òàáë. 2.3.62 2.4.4. Óñëîâíûå ïåðåõîäû è ðåãèñòð ECX; öèêëûÊàê óæå ãîâîðèëîñü, íåêîòîðûå ðåãèñòðû îáùåãî íàçíà÷åíèÿ â íåêîòîðûõ ñëó÷àÿõ èìåþò îñîáóþ ðîëü; â ÷àñòíîñòè, ðåãèñòð ECX ëó÷øå äðóãèõ ïðèñïîñîáëåí ê ðîëè ñ÷¼ò÷èêà öèêëà.
Âûðàæàåòñÿ ýòî â òîì, ÷òî âñèñòåìå êîìàíä ïðîöåññîðà i386 èìåþòñÿ ñïåöèàëüíûå êîìàíäû, ó÷èòûâàþùèå çíà÷åíèå ECX, à äëÿ äðóãèõ ðåãèñòðîâ òàêèõ êîìàíä íåò.Îäíà èç òàêèõ êîìàíä íàçûâàåòñÿ loop è ïðåäíàçíà÷åíà äëÿ îðãàíèçàöèè öèêëîâ ñ çàðàíåå èçâåñòíûì êîëè÷åñòâîì èòåðàöèé.  êà÷åñòâåñ÷¼ò÷èêà öèêëà îíà èñïîëüçóåò ðåãèñòð ECX, â êîòîðûé ïåðåä íà÷àëîìöèêëà íåîáõîäèìî çàíåñòè íóæíîå ÷èñëî èòåðàöèé. Ñàìà êîìàíäà loopâûïîëíÿåò äâà äåéñòâèÿ: óìåíüøàåò íà åäèíèöó çíà÷åíèå â ðåãèñòðå ECXè, åñëè â ðåçóëüòàòå çíà÷åíèå íå ñòàëî ðàâíûì íóëþ, ïðîèçâîäèò ïåðåõîäíà çàäàííóþ ìåòêó.Îòìåòèì, ÷òî êîìàíäà loop èìååò îäíî âàæíîå îãðàíè÷åíèå: îíà âûïîëíÿåò òîëüêî ¾êîðîòêèå¿ ïåðåõîäû, òî åñòü ñ å¼ ïîìîùüþ íåâîçìîæíîîñóùåñòâèòü ïåðåõîä íà ìåòêó, îòñòîÿùóþ îò ñàìîé êîìàíäû áîëåå ÷åìíà 128 áàéò.Ïóñòü, íàïðèìåð, ó íàñ åñòü ìàññèâ èç 1000 äâîéíûõ ñëîâ, çàäàííûéñ ïîìîùüþ äèðåêòèâûarrayresd 1000è ìû õîòèì ïîñ÷èòàòü ñóììó åãî ýëåìåíòîâ.
Ýòî ìîæíî ñäåëàòü ñ ïîìîùüþ ñëåäóþùåãî ôðàãìåíòà êîäà:lp:mov ecx,mov esi,mov eax,add eax,add esi,loop lp1000; êîë-âî èòåðàöèéarray ; àäðåñ ïåðâîãî ýëåìåíòà0; íà÷àëüíîå çíà÷åíèå ñóììû[esi] ; ïðèáàâëÿåì ÷èñëî ê ñóììå4; àäðåñ ñëåäóþùåãî ýëåìåíòà; óìåíüøàåì ñ÷¼ò÷èê;; åñëè íóæíî - ïðîäîëæàåìÇäåñü ìû èñïîëüçîâàëè ôàêòè÷åñêè äâå ïåðåìåííûå öèêëà ðåãèñòðECX â êà÷åñòâå ñ÷¼ò÷èêà è ðåãèñòð ESI äëÿ õðàíåíèÿ àäðåñà òåêóùåãîýëåìåíòà ìàññèâà.Êîíå÷íî, ìîæíî ïðîèçâåñòè àíàëîãè÷íîå äåéñòâèå è äëÿ ëþáîãî äðóãîãî ðåãèñòðà îáùåãî íàçíà÷åíèÿ, âîñïîëüçîâàâøèñü äâóìÿ êîìàíäàìè.Íàïðèìåð, ìû ìîæåì óìåíüøèòü íà åäèíèöó ðåãèñòð EAX è îñóùåñòâèòüïåðåõîä íà ìåòêó lp ïðè óñëîâèè, ÷òî ïîëó÷åííûé â EAX ðåçóëüòàò íåðàâåí íóëþ; ýòî áóäåò âûãëÿäåòü òàê:dec eaxjnz lp63Òî÷íî òàê æå ìîæíî çàïèñàòü äâå êîìàíäû è äëÿ ðåãèñòðà ECX:dec ecxjnz lpÎäíàêî êîìàíäà loop lp, äåëàÿ òå æå äåéñòâèÿ, ðàáîòàåò áûñòðåå è çàíèìàåò ìåíüøå ïàìÿòè. ïðèìåðå ñ ìàññèâîì ìîæíî îáîéòèñü è áåç ESI, îäíèì òîëüêî ñ÷¼ò÷èêîì:lp:mov ecx, 1000mov eax, 0add eax, [array+4*ecx-4]loop lpÇäåñü åñòü äâà èíòåðåñíûõ ìîìåíòà.
Âî-ïåðâûõ, ìàññèâ ìû âûíóæäåíû ïðîõîäèòü ñ êîíöà â íà÷àëî. Âî-âòîðûõ, èñïîëíèòåëüíûé àäðåñ â êîìàíäå add èìååòíåñêîëüêî ñòðàííûé âèä. Äåéñòâèòåëüíî, ðåãèñòð ECX ïðîáåãàåò çíà÷åíèÿ îò 1000äî 1 (äëÿ íóëåâîãî çíà÷åíèÿ öèêë óæå íå âûïîëíÿåòñÿ), òîãäà êàê àäðåñà ýëåìåíòîâ ìàññèâà ïðîáåãàþò çíà÷åíèÿ îò array+4*999 äî array+4*0, òàê ÷òî óìíîæàòüíà 4 ñëåäîâàëî áû íå ECX, à (ecx-1). Îäíàêî ýòîãî ìû ñäåëàòü íå ìîæåì è ïðîñòîâû÷èòàåì 4. Íà ïåðâûé âçãëÿä ýòî ïðîòèâîðå÷èò ñêàçàííîìó â 2.2.6 îòíîñèòåëüíîîáùåãî âèäà èñïîëíèòåëüíîãî àäðåñà (ñëàãàåìîå â âèäå êîíñòàíòû äîëæíî áûòüîäíî, ëèáî íè îäíîãî), îäíàêî íà ñàìîì äåëå àññåìáëåð NASM ïðÿìî âî âðåìÿòðàíñëÿöèè âû÷òåò çíà÷åíèå 4 èç çíà÷åíèÿ array è óæå â òàêîì âèäå îòòðàíñëèðóåò, òàê ÷òî â èòîãîâîì ìàøèííîì êîäå êîíñòàíòíîå ñëàãàåìîå êàê ðàç è áóäåòîäíî.Ðàññìîòðèì òåïåðü äâå äîïîëíèòåëüíûå êîìàíäû óñëîâíîãî ïåðåõîäà.
Êîìàíäà jcxz (jump if CX iz zero) ïðîèçâîäèò óñëîâíûé ïåðåõîä,åñëè â ðåãèñòðå CX ñîäåðæèòñÿ íîëü. Ôëàãè ïðè ýòîì íå ó÷èòûâàþòñÿ.Àíàëîãè÷íûì îáðàçîì êîìàíäà jecxz ïðîèçâîäèò ïåðåõîä, åñëè íîëü ñîäåðæèòñÿ â ðåãèñòðå ECX. Êàê è äëÿ êîìàíäû loop, ýòîò ïåðåõîä âñåãäàêîðîòêèé. ×òîáû ïîíÿòü, çà÷åì ââåäåíû ýòè êîìàíäû, ïðåäñòàâüòå ñåáå,÷òî íà ìîìåíò âõîäà â öèêë â ðåãèñòðå ECX óæå ñîäåðæèòñÿ íîëü.
Òîãäàñíà÷àëà âûïîëíèòñÿ òåëî öèêëà, à ïîòîì êîìàíäà loop óìåíüøèò ñ÷¼ò÷èê íà åäèíèöó, â ðåçóëüòàòå ÷åãî ñ÷¼ò÷èê îêàæåòñÿ ðàâåí ìàêñèìàëüíîâîçìîæíîìó öåëîìó áåççíàêîâîìó ÷èñëó (äâîè÷íàÿ çàïèñü ýòîãî ÷èñëàñîñòîèò èç âñåõ åäèíèö), òàê ÷òî òåëî öèêëà áóäåò âûïîëíåíî 232 ðàç,òîãäà êàê ïî ñìûñëó åãî, ñêîðåå âñåãî, íå ñëåäîâàëî âûïîëíÿòü âîîáùå.×òîáû èçáåæàòü òàêèõ íåïðèÿòíîñòåé, ïåðåä öèêëîì ìîæíî ïîñòàâèòüêîìàíäó jecxz:lp:lpq:; çàïîëíÿåì ecxjecxz lpq; òåëî öèêëà; ...loop lp64 çàêëþ÷åíèå ðàññìîòðèì äâå ìîäèôèêàöèè êîìàíäû loop. Êîìàíäàloope, íàçûâàåìàÿ òàêæå loopz, ïðîèçâîäèò ïåðåõîä, åñëè â ðåãèñòðåECX íå íîëü è ïðè ýòîì ôëàã ZF óñòàíîâëåí, òîãäà êàê êîìàíäà loopne(èëè, ÷òî òî æå ñàìîå, loopnz) åñëè â ðåãèñòðå ECX íå íîëü è ôëàã ZFñáðîøåí. 2.5.
Ïîáèòîâûå îïåðàöèè 2.5.1. Ëîãè÷åñêèå îïåðàöèèÈíôîðìàöèþ, çàïèñàííóþ â ðåãèñòðû è ïàìÿòü â âèäå áàéòîâ, ñëîâ èäâîéíûõ ñëîâ ìîæíî ðàññìàòðèâàòü íå òîëüêî êàê ïðåäñòàâëåíèå öåëûõ÷èñåë, íî è êàê ñòðîêè, ñîñòîÿùèå èç îòäåëüíûõ è (â îáùåì ñëó÷àå) íèêàêíå ñâÿçàííûõ ìåæäó ñîáîé áèòîâ.Äëÿ ðàáîòû ñ òàêèìè áèòîâûìè ñòðîêàìè èñïîëüçóþòñÿ ñïåöèàëüíûå êîìàíäû ïîáèòîâûõ îïåðàöèé .
Ïðîñòåéøèìè èç íèõ ÿâëÿþòñÿäâóõìåñòíûå êîìàíäû and, or è xor, âûïîëíÿþùèå ñîîòâåòñòâóþùóþëîãè÷åñêóþ îïåðàöèþ (¾è¿, ¾èëè¿, ¾èñêëþ÷àþùåå èëè¿) îòäåëüíî íàäïåðâûìè áèòàìè îáîèõ îïåðàíäîâ, îòäåëüíî íàä âòîðûìè áèòàìè è ò. ä.;ðåçóëüòàò, ïðåäñòàâëÿþùèé ñîáîé áèòîâóþ ñòðîêó òîé æå äëèíû, ÷òî èîïåðàíäû, çàíîñèòñÿ, êàê îáû÷íî äëÿ àðèôìåòè÷åñêèõ êîìàíä, â ðåãèñòðèëè îáëàñòü ïàìÿòè, îïðåäåëÿåìóþ ïåðâûì îïåðàíäîì. Îãðàíè÷åíèÿ íàèñïîëüçóåìûå îïåðàíäû ó ýòèõ êîìàíä òàêèå æå, êàê è ó äâóõìåñòíûõàðèôìåòè÷åñêèõ êîìàíä: ïåðâûé îïåðàíä äîëæåí áûòü ëèáî ðåãèñòðîâûì, ëèáî òèïà ¾ïàìÿòü¿, âòîðîé îïåðàíä ìîæåò áûòü ëþáîãî òèïà;íåëüçÿ èñïîëüçîâàòü îïåðàíä òèïà ¾ïàìÿòü¿ îäíîâðåìåííî äëÿ ïåðâîãîè âòîðîãî îïåðàíäà; åñëè íè îäèí èç îïåðàíäîâ íå ÿâëÿåòñÿ ðåãèñòðîâûì, íåîáõîäèìî óêàçàòü ðàçðÿäíîñòü îïåðàöèè ñ ïîìîùüþ îäíîãî èçñëîâ byte, word è dword.
Îñóùåñòâèòü ïîáèòîâîå îòðèöàíèå (èíâåðñèþ)ìîæíî ñ ïîìîùüþ êîìàíäû not, èìåþùåé îäèí îïåðàíä. Îïåðàíä ìîæåòáûòü ðåãèñòðîâûé èëè òèïà ¾ïàìÿòü¿; â ïîñëåäíåì ñëó÷àå, åñòåñòâåííî,íåîáõîäèìî çàäàòü äëèíó îïåðàíäà ñëîâîì byte, word èëè dword. Âñå ýòèêîìàíäû óñòàíàâëèâàþò ôëàãè ZF, SF è PF â ñîîòâåòñòâèè ñ ðåçóëüòàòîì;îáû÷íî èñïîëüçóåòñÿ òîëüêî ôëàã ZF. ïðîãðàììàõ íà ÿçûêå àññåìáëåðà î÷åíü ÷àñòî âñòðå÷àåòñÿ êîìàíäà xor, îáàîïåðàíäà êîòîðîé ïðåäñòàâëÿþò ñîáîé îäèí è òîò æå ðåãèñòð, íàïðèìåð,xor eax, eaxÝòî îçíà÷àåòîáíóëåíèåóêàçàííîãî ðåãèñòðà, ò.
å. òî æå ñàìîå, ÷òî èmov eax, 0Êîìàíäó xor äëÿ ýòîãî èñïîëüçóþò, ïîòîìó ÷òî îíà çàíèìàåò ìåíüøå ìåñòà (2áàéòà ïðîòèâ 5 äëÿ êîìàíäû mov) è ðàáîòàåò íà íåñêîëüêî òàêòîâ áûñòðåå. Íåêîòîðûå ïðîãðàììèñòû âìåñòî mov eax,-1 ïðåäïî÷èòàþò èñïîëüçîâàòü äâå êîìàíäû65SHR0SHL, SALCFCF0CFSARÐèñ. 2.3.
Ñõåìà ðàáîòû êîìàíä ïîáèòîâîãî ñäâèãàxor eax,eax è not eax, õîòÿ âûèãðûø òóò óæå íå ñòîëü çàìåòåí (4 áàéòà êîäàïðîòèâ 5), à ïî âðåìåíè èñïîëíåíèÿ òóò ìîæíî è ïðîèãðàòü. ñëó÷àå, åñëè íåîáõîäèìî ïðîñòî ïðîâåðèòü íàëè÷èå â ÷èñëå îäíîãî èç çàäàííûõ áèòîâ, ìîæåò îêàçàòüñÿ óäîáíîé êîìàíäà test, êîòîðàÿðàáîòàåò òàê æå, êàê è êîìàíäà and (òî åñòü âûïîëíÿåò ïîáèòîâîå ¾è¿íàä ñâîèìè îïåðàíäàìè), íî ðåçóëüòàò íèêóäà íå çàïèñûâàåò, à òîëüêîâûñòàâëÿåò ôëàãè. ÷àñòíîñòè, äëÿ ïðîâåðêè íà ðàâåíñòâî íóëþ âìåñòîcmp eax, 0÷àñòî èñïîëüçóþò êîìàíäótest eax, eaxêîòîðàÿ çàíèìàåò ìåíüøå ïàìÿòè è ðàáîòàåò áûñòðåå. 2.5.2.
Îïåðàöèè ñäâèãà×àñòî ïðèõîäèòñÿ ïðèìåíÿòü îïåðàöèè ïîáèòîâîãî ñäâèãà . Ïðîñòåéøèå èç íèõ êîìàíäû ïðîñòîãî ïîáèòîâîãî ñäâèãà shr (shiftright) è shl (shift left). Êîìàíäû èìåþò äâà îïåðàíäà, ïåðâûé èç êîòîðûéóêàçûâàåò, ÷òî ñäâèãàòü, à âòîðîé íà ñêîëüêî áèòîâ ïðîèçâîäèòü ñäâèã.Ïåðâûé îïåðàíä ìîæåò áûòü ðåãèñòðîâûì èëè òèïà ¾ïàìÿòü¿ (âî âòîðîì ñëó÷àå îáÿçàòåëüíî óêàçàíèå ðàçðÿäíîñòè). Âòîðîé îïåðàíä ìîæåòáûòü ëèáî íåïîñðåäñòâåííûì, òî åñòü ÷èñëîì îò 1 äî 31 (íà ñàìîì äåëå, ìîæíî óêàçàòü ëþáîå ÷èñëî, íî îò íåãî áóäóò èñïîëüçîâàòüñÿ òîëüêîìëàäøèå ïÿòü ðàçðÿäîâ), ëèáî ðåãèñòðîì CL ; íèêàêèå äðóãèå ðåãèñòðûèñïîëüçîâàòü íåëüçÿ.
Ïðè âûïîëíåíèè ýòèõ êîìàíä ñ ðåãèñòðîì CL â êà÷åñòâå âòîðîãî îïåðàíäà ïðîöåññîð èãíîðèðóåò âñå ðàçðÿäû CL, êðîìåïÿòè ìëàäøèõ.Ñõåìà ñäâèãà íà 1 áèò ñëåäóþùàÿ. Ïðè ñäâèãå âëåâî ñòàðøèé áèòñäâèãàåìîãî ÷èñëà ïåðåíîñèòñÿ âî ôëàã CF, îñòàëüíûå áèòû ñäâèãàþòñÿ66âëåâî (òî åñòü áèò ñ íîìåðîì10 n ïîëó÷àåò çíà÷åíèå, êîòîðîå äî îïåðàöèè èìåë áèò ñ íîìåðîì n − 1), â ìëàäøèé áèò çàïèñûâàåòñÿ íîëü. Ïðèñäâèãå âïðàâî, íàîáîðîò, âî ôëàã CF çàíîñèòñÿ ìëàäøèé áèò, âñå áèòûñäâèãàþòñÿ âïðàâî (òî åñòü áèò ñ íîìåðîì n ïîëó÷àåò çíà÷åíèå, êîòîðîåäî îïåðàöèè èìåë áèò ñ íîìåðîì n+1), â ñòàðøèé áèò çàïèñûâàåòñÿ íîëü.Îòìåòèì, ÷òî äëÿ áåççíàêîâûõ ÷èñåë ñäâèã íà n áèò âëåâî ýêâèâàëåíòåí óìíîæåíèþ íà 2n , à ñäâèã âïðàâî öåëî÷èñëåííîìó äåëåíèþ íà2n ñ îòáðàñûâàíèåì îñòàòêà. Èíòåðåñíî, ÷òî äëÿ çíàêîâûõ ÷èñåë ñèòóàöèÿ ñî ñäâèãîì âëåâî àáñîëþòíî àíàëîãè÷íà, à âîò ñäâèã âïðàâî äëÿëþáîãî îòðèöàòåëüíîãî ÷èñëà äàñò ïîëîæèòåëüíîå, âåäü â çíàêîâûé áèòáóäåò çàïèñàí íîëü. Ïîýòîìó íàðÿäó ñ êîìàíäàìè ïðîñòîãî ñäâèãà ââîäÿòñÿ òàêæå è êîìàíäû àðèôìåòè÷åñêîãî ïîáèòîâîãî ñäâèãà sal(shift arithmetic left) è sar (shift arithmetic right).