А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 17
Текст из файла (страница 17)
Êîìàíäà sal äåëàåò òî æå ñàìîå, ÷òî è êîìàíäà shl (íà ñàìîì äåëå, ýòî îäíà è òà æåìàøèííàÿ êîìàíäà). ×òî êàñàåòñÿ êîìàíäû sar, òî îíà ðàáîòàåò àíàëîãè÷íî êîìàíäå shr, çà èñêëþ÷åíèåì òîãî, ÷òî â ñòàðøåì áèòå çíà÷åíèåñîõðàíÿåòñÿ òàêèì æå, êàêèì îíî áûëî äî îïåðàöèè; òàêèì îáðàçîì, åñëèðàññìàòðèâàòü ñäâèãàåìóþ áèòîâóþ ñòðîêó êàê çàïèñü çíàêîâîãî öåëîãî÷èñëà, òî îïåðàöèÿ sar íå èçìåíèò çíàê ÷èñëà (ïîëîæèòåëüíîå îñòàíåòñÿïîëîæèòåëüíûì, îòðèöàòåëüíîå îòðèöàòåëüíûì). Èíà÷å ãîâîðÿ, îïåðàöèÿ àðèôìåòè÷åñêîãî ñäâèãà âïðàâî ýêâèâàëåíòíà äåëåíèþ íà 2n ñîòáðàñûâàíèåì îñòàòêà äëÿ çíàêîâûõ öåëûõ ÷èñåë.
Îïåðàöèè ïðîñòûõ èàðèôìåòè÷åñêèõ ñäâèãîâ ñõåìàòè÷åñêè ïîêàçàíû íà ðèñ. 2.3.Êîìàíäû ïîáèòîâûõ ñäâèãîâ ðàáîòàþò ãîðàçäî áûñòðåå, ÷åì êîìàíäû óìíîæåíèÿ è äåëåíèÿ; êðîìå òîãî, îáðàùàòüñÿ ñ íèìè ñóùåñòâåííîëåã÷å: ìîæíî èñïîëüçîâàòü ëþáûå ðåãèñòðû, òàê ÷òî íå íóæíî äóìàòüî âûñâîáîæäåíèè àêêóìóëÿòîðà. Ïîýòîìó ïðè óìíîæåíèè è äåëåíèè íàñòåïåíè äâîéêè ïðîãðàììèñòû ïðàêòè÷åñêè âñåãäà èñïîëüçóþò èìåííîêîìàíäû ïîáèòîâûõ ñäâèãîâ.
Áîëåå òîãî, êîìïèëÿòîðû ÿçûêîâ âûñîêîãîóðîâíÿ ïðè òðàíñëÿöèè àðèôìåòè÷åñêèõ âûðàæåíèé òîæå, êàê ïðàâèëî,ñòàðàþòñÿ èñïîëüçîâàòü ñäâèãè âìåñòî óìíîæåíèé è äåëåíèé, åñëè ýòîâîçìîæíî.Êðîìå ðàññìîòðåííûõ, ïðîöåññîð i386 ïîääåðæèâàåò òàêæå êîìàíäû¾ñëîæíûõ¿ ïîáèòîâûõ ñäâèãîâ shrd è shld, ðàáîòàþùèõ ÷åðåç äâà ðåãèñòðà; êîìàíäû öèêëè÷åñêîãî ïîáèòîâîãî ñäâèãà ror è rol; êîìàíäûöèêëè÷åñêîãî ñäâèãà ÷åðåç ôëàã CF rcr è rcl. Âñå ýòè êîìàíäû ìûðàññìàòðèâàòü íå áóäåì; ïðè æåëàíèè ÷èòàòåëü ìîæåò îñâîèòü èõ ñàìîñòîÿòåëüíî.10 Ïî òðàäèöèè ìû ïðåäïîëàãàåì, ÷òî áèòû çàíóìåðîâàíû ñïðàâà íàëåâî, íà÷èíàÿ ñíóëÿ, òî åñòü, íàïðèìåð, â 32-áèòíîì ÷èñëå ìëàäøèé áèò èìååò íîìåð 0, à ñòàðøèé íîìåð 31.67 2.5.3.
ÏðèìåðÎäíèì èç ïðèìåíåíèé áèòîâûõ ñòðîê â ïðîãðàììèðîâàíèè ÿâëÿåòñÿïðåäñòàâëåíèå ïîäìíîæåñòâ èç êîíå÷íîãî ÷èñëà èñõîäíûõ ýëåìåíòîâ; ïîïðîñòó ãîâîðÿ, ó íàñ èìååòñÿ êîíå÷íîå ìíîæåñòâî îáúåêòîâ (íàïðèìåð,ñîòðóäíèêè êàêîãî-íèáóäü ïðåäïðèÿòèÿ, èëè òóìáëåðû íà êàêîì-íèáóäüïóëüòå óïðàâëåíèÿ, èëè äàæå ïðîñòî ÷èñëà îò 0 äî N) è íàì â ïðîãðàììå íóæíà âîçìîæíîñòü ïðåäñòàâëÿòü ïîäìíîæåñòâî ýòîãî ìíîæåñòâà:êàêèå èç ñîòðóäíèêîâ â íàñòîÿùåå âðåìÿ íàõîäÿòñÿ íà ðàáîòå; êàêèå èçòóìáëåðîâ íà ïóëüòå óñòàíîâëåíû â ïîëîæåíèå ¾âêëþ÷åíî¿; êàêèå èçN ñïîðòñìåíîâ, ó÷àñòâóþùèõ â ìàðàôîíå, ïðîøëè î÷åðåäíîé êîíòðîëüíûé ïóíêò; è ò.
ï. Íàèáîëåå î÷åâèäíîå ïðåäñòàâëåíèå äëÿ ïîäìíîæåñòâàìíîæåñòâà N ýëåìåíòîâ ýòî îáëàñòü ïàìÿòè, ñîäåðæàùàÿ N äâîè÷íûõðàçðÿäîâ (òàê, åñëè â ìíîæåñòâî ìîãóò âõîäèòü ÷èñëà îò 0 äî 511, íàìïîòðåáóåòñÿ 512 ðàçðÿäîâ, òî åñòü 64 îäíîáàéòîâûõ ÿ÷åéêè), ãäå êàæäîìó èç N âîçìîæíûõ ýëåìåíòîâ ïðèïèñûâàåòñÿ îäèí ðàçðÿä, è ýòîò ðàçðÿäáóäåò ðàâåí åäèíèöå, åñëè ñîîòâåòñòâóþùèé ýëåìåíò âõîäèò â ïîäìíîæåñòâî, è íóëþ â ïðîòèâíîì ñëó÷àå. Ãîâîðÿò, ÷òî êàæäîìó èç N îáúåêòîâïðèñâîåí îäèí èç äâóõ ñòàòóñîâ : ëèáî ¾âõîäèò â ìíîæåñòâî¿ (1), ëèáî¾íå âõîäèò â ìíîæåñòâî¿ (0).Èòàê, ïóñòü íàì ïîòðåáîâàëîñü ïîäìíîæåñòâî ìíîæåñòâà èç 512 ýëåìåíòîâ; ýòî ìîãóò áûòü ñîâåðøåííî ïðîèçâîëüíûå îáúåêòû, íàñ èíòåðåñóåò òîëüêî òî, ÷òî ó êàæäîãî èç íèõ åñòü óíèêàëüíûé íîìåð ÷èñëîîò 0 äî 511.
×òîáû õðàíèòü òàêîå ìíîæåñòâî, ìû îïèøåì ìàññèâ èç 16¾äâîéíûõ ñëîâ¿ (íàïîìíèì, ÷òî ¾äâîéíîå ñëîâî¿ ñîäåðæèò 32 áèòà è ìîæåò, ñîîòâåòñòâåííî, õðàíèòü ñòàòóñ 32 ðàçíûõ îáúåêòîâ). Êàê îáû÷íî,ýëåìåíòû ìàññèâà áóäåì ñ÷èòàòü çàíóìåðîâàííûìè (èëè èìåþùèìè èíäåêñû ) îò 0 äî 15. Ýëåìåíò ìàññèâà ñ èíäåêñîì 0 áóäåò õðàíèòü ñòàòóñîáúåêòîâ ñ íîìåðàìè îò 0 äî 31, ýëåìåíò ñ èíäåêñîì 1 ñòàòóñ îáúåêòîâñ íîìåðàìè îò 32 äî 63, è ò. ä.
Ïðè ýòîì âíóòðè ñàìîãî ýëåìåíòà áèòûáóäåì ñ÷èòàòü çàíóìåðîâàííûìè ñïðàâà íàëåâî, òî åñòü ñàìûé ìëàäøèéðàçðÿä áóäåò èìåòü íîìåð 0, ñàìûé ñòàðøèé íîìåð 31. Íàïðèìåð, ñòàòóñ îáúåêòà ñ íîìåðîì 17 áóäåò õðàíèòüñÿ â 17-ì áèòå íóëåâîãî ýëåìåíòàìàññèâà; ñòàòóñ îáúåêòà ñ íîìåðîì 37 â 5-ì áèòå ïåðâîãî ýëåìåíòà; ñòàòóñ îáúåêòà ñ íîìåðîì 510 â 29-ì áèòå 15-ãî ýëåìåíòà ìàññèâà. Âîîáùå,÷òîáû ïî íîìåðó îáúåêòà X óçíàòü, â êàêîì áèòå êàêîãî ýëåìåíòà ìàññèâà õðàíèòñÿ åãî ñòàòóñ, äîñòàòî÷íî ðàçäåëèòü X íà 32 (êîëè÷åñòâî áèòâ êàæäîì ýëåìåíòå) ñ îñòàòêîì. ×àñòíîå áóäåò ñîîòâåòñòâîâàòü íîìåðóýëåìåíòà â ìàññèâå, îñòàòîê íîìåðó áèòà â ýòîì ýëåìåíòå.
Ýòî ìîæíîáûëî áû ñäåëàòü ñ ïîìîùüþ êîìàíäû div, íî ëó÷øå áóäåò âñïîìíèòü,÷òî ÷èñëî 32 åñòü ñòåïåðü äâîéêè (25 ), òàê ÷òî åñëè âçÿòü ìëàäøèå ïÿòüáèò ÷èñëà X, ìû ïîëó÷èì îñòàòîê îò åãî äåëåíèÿ íà 32, à åñëè âûïîëíèòüäëÿ íåãî ïîáèòîâûé ñäâèã âïðàâî íà 5 ïîçèöèé ðåçóëüòàò áóäåò ðàâåí68èñêîìîìó ÷àñòíîìó. Íàïðèìåð, ïóñòü ÷èñëî X çàíåñåíî â ðåãèñòð EBX, èíàì íåîáõîäèìî óçíàòü ñîîòâåòñòâóþùèé íîìåð ýëåìåíòà è íîìåð áèòàâ ýëåìåíòå. Îáà íîìåðà íå ïðåâîñõîäÿò 255 (òî÷íåå, íîìåð ýëåìåíòà íåïðåâîñõîäèò 15, à íîìåð áèòà íå ïðåâîñõîäèò 32), òàê ÷òî ðåçóëüòàò ìûìîæåì ðàçìåñòèòü â îäíîáàéòîâûõ ðåãèñòðàõ; ïóñòü ýòî áóäóò BL (äëÿíîìåðà áèòà) è BH (äëÿ íîìåðà ýëåìåíòà ìàññèâà).
Ïîñêîëüêó çàíåñåíèåëþáûõ íîâûõ çíà÷åíèé â BL è BH èñïîðòèò ñîäåðæèìîå ðåãèñòðà EBX êàêöåëîãî, ëîãè÷íî áóäåò ñíà÷àëà ñêîïèðîâàòü ÷èñëî êóäà-òî åù¼, íàïðèìåðâ EDX, ïîòîì â EBX îáíóëèòü âñå áèòû, êðîìå ïÿòè ìëàäøèõ (ïðè ýòîì èçíà÷åíèå EBX êàê öåëîãî, è çíà÷åíèå åãî ìëàäøåãî áàéòà ðåãèñòðà BLñòàíóò ðàâíû èñêîìîìó îñòàòêó îò äåëåíèÿ; ïîòîì â EDX ìû âûïîëíèìñäâèã âïðàâî è ðåóëüòàò (êîòîðûé ïîëíîñòüþ óìåñòèòñÿ â ìëàäøåì áàéòåðåãèñòðà EDX, òî åñòü â ðåãèñòðà DL) ñêîïèðóåì â BH:movandshrmovedx, ebxebx, 11111bedx, 5bh, dl; âçÿëè 5 ìëàäøèõ ðàçðÿäîâ; ðàçäåëèëè îñòàëüíîå íà 32Îäíàêî òî æå ñàìîå ìîæíî ñäåëàòü è êîðî÷å, áåç èñïîëüçîâàíèÿ äîïîëíèòåëüíûõ ðåãèñòðîâ, âåäü âñå íóæíûå áèòû ó íàñ ñ ñàìîãî íà÷àëà íàõîäÿòñÿ â EBX. Ìëàäøèå ïÿòü ðàçðÿäîâ ÷èñëà X ýòî íóæíûé íàì îñòàòîêîò äåëåíèÿ, à íóæíîå íàì ÷àñòíîå ýòî ñëåäóþùèå íåñêîëüêî (â äàííîìñëó÷àå íå áîëåå ÷åòûð¼õ) ðàçðÿäîâ.
Êîãäà â EBX çàíåñëè ÷èñëî X, ýòèðàçðÿäû îêàçàëèñü â ïîçèöèÿõ, íà÷èíàÿ ñ ïÿòîé, à íàì íóæíî, ÷òîáûîíè îêàçàëèñü â ðåãèñòðå BH, êîòîðûé åñòü íè ÷òî èíîå êàê âòîðîé áàéòðåãèñòðà EBX, òàê ÷òî äîñòàòî÷íî ñäâèíóòü âñ¼ ñîäåðæèìîå EBX âëåâî íàòðè ïîçèöèè, è íóæíûé íàì ðåçóëüòàò äåëåíèÿ àêêóðàòíî ¾âïèøåòñÿ¿ âBH; ïîñëå ýòîãî ñîäåðæèìîå BL ìû ñäâèíåì îáðàòíî íà òå æå òðè áèòà,÷òî çàîäíî è î÷èñòèò íàì åãî ñòàðøèå áèòû:shlshrebx, 3bl, 3Íàó÷èâøèñü ïðåîáðàçîâûâàòü íîìåð îáúåêòà â íîìåð ýëåìåíòà ìàññèâà è íîìåð ðàçðÿäà â ýëåìåíòå, âåðí¼ìñÿ ê èñõîäíîé çàäà÷å. Äëÿ íà÷àëàîïèøåì ìàññèâ:section .bssset512 resd16Òåïåðü ó íàñ åñòü ïîäõîäÿùàÿ îáëàñòü ïàìÿòè, è ñ àäðåñîì å¼ íà÷àëà ñâÿçàíà ìåòêà set512.
Ãäå-òî â íà÷àëå ïðîãðàììû (à âîçìîæíî, è íå òîëüêî âíà÷àëå) íàì, âèäèìî, ïîíàäîáèòñÿ îïåðàöèÿ î÷èñòêè ìíîæåñòâà, òî åñòüòàêîé íàáîð êîìàíä, ïîñëå êîòîðîãî ñòàòóñ âñåõ ýëåìåíòîâ îêàçûâàåòñÿ69íóëåâîé (â ìíîæåñòâî íå âõîäèò íè îäèí ýëåìåíò). Äëÿ ýòîãî äîñòàòî÷íîçàíåñòè íóëè âî âñå ýëåìåíòû ìàññèâà, íàïðèìåð, òàê:section .text; ...lp:xormovmovmovloopeax, eax; eax := 0ecx, 15esi, set512[esi+4*ecx], eaxlpÏóñòü òåïåðü ó íàñ â ðåãèñòðå EBX èìååòñÿ íîìåð ýëåìåíòà X, è íàìíåîáõîäèìî âíåñòè ýëåìåíò â ìíîæåñòâî, òî åñòü óñòàíîâèòü ñîîòâåòñòâóþùèé áèò â åäèíèöó. Äëÿ ýòîãî ìû ñíà÷àëà íàéä¼ì íîìåð áèòà â ýëåìåíòå ìàññèâà è âû÷èñëèì ìàñêó òàêîå ÷èñëî, â êîòîðîì òîëüêî îäèíáèò (êàê ðàç íóæíûé íàì) ðàâåí åäèíèöå, à â îñòàëüíûõ ðàçðÿäàõ íóëè. Çàòåì ìû íàéä¼ì íóæíûé ýëåìåíò ìàññèâà è ïðèìåíèì ê íåìó èê ìàñêå îïåðàöèþ ¾èëè¿, ðåçóëüòàò êîòîðîé çàíåñ¼ì îáðàòíî â ýëåìåíòìàññèâà.
Ïðè ýòîì íóæíûé íàì áèò â ýëåìåíòå îêàæåòñÿ ðàâåí åäèíèöå,à îñòàëüíûå íå èçìåíÿòñÿ. Äëÿ âû÷èñëåíèÿ ìàñêè ìû âîçüì¼ì åäèíèöóè ñäâèíåì å¼ íà íóæíîå êîëè÷åñòâî ðàçðÿäîâ âëåâî. Íàïîìíèì, ÷òî èçðåãèñòðîâ òîëüêî CL ìîæåò áûòü âòîðûì àðãóìåíòîì êîìàíä ïîáèòîâûõñäâèãîâ, òàê ÷òî íîìåð áèòà èìååò ñìûñë ñðàçó âû÷èñëÿòü â CL. Èòàê,ïèøåì:; âíåñòè â ìíîæåñòâî set512 ýëåìåíò,; íîìåð êîòîðîãî íàõîäèòñÿ â EBXmovcl, bl;andcl, 11111b;moveax, 1;shleax, cl;movedx, ebx;shredx, 5;or[set512+4*edx], eax ;ïîëó÷àåì íîìåð áèòàâ ðåãèñòðå CLñîçäà¼ì ìàñêóâ ðåãèñòðå EAXâû÷èñëÿåì íîìåð ýë-òàâ ðåãèñòðå edxïðèìåíÿåì ìàñêóÀíàëîãè÷íî ðåøàåòñÿ è çàäà÷à ïî èñêëþ÷åíèþ ýëåìåíòà èç ìíîæåñòâà,òîëüêî ìàñêà íà ýòîò ðàç áóäåò èíâåðòèðîâàíà (0 â íóæíîì ðàçðÿäå,åäèíèöû âî âñåõ îñòàëüíûõ), à ïðèìåíÿòü ìû å¼ áóäåì ñ êîìàíäîé and(ëîãè÷åñêîå ¾è¿), â ðåçóëüòàòå ÷åãî íóæíûé áèò îáíóëèòñÿ, îñòàëüíûåíå èçìåíÿòñÿ:; óáðàòü èç ìíîæåñòâà set512 ýëåìåíò,; íîìåð êîòîðîãî íàõîäèòñÿ â EBX70movandmovshlnotmovshrandcl, blcl, 11111beax, 1eax, cleaxedx, ebxedx, 5[set512+4*edx], eax;;;;;;;;ïîëó÷àåì íîìåð áèòàâ ðåãèñòðå CLñîçäà¼ì ìàñêóâ ðåãèñòðå EAXèíâåðòèðóåì ìàñêóâû÷èñëÿåì íîìåð ýë-òàâ ðåãèñòðå edxïðèìåíÿåì ìàñêóÓçíàòü, âõîäèò ëè ýëåìåíò ñ çàäàííûì íîìåðîì â ìíîæåñòâî, ìîæíîòîæå ñ ïîìîùüþ ìàñêè (åäèíèöà â íóæíîì ðàçðÿäå, íóëè â îñòàëüíûõ)è êîìàíäû test.
Ðåçóëüòàò ïîêàæåò ôëàã ZF: åñëè îí áóäåò âçâåä¼í çíà÷èò, ñîîòâåòñòâóþùåãî ýëåìåíòà â ìíîæåñòâå íå áûëî, è íàîáîðîò:; óçíàòü, âõîäèò ëè â ìíîæåñòâî set512 ýëåìåíò,; íîìåð êîòîðîãî íàõîäèòñÿ â EBXmovcl, bl; ïîëó÷àåì íîìåð áèòàandcl, 11111b; â ðåãèñòðå CLmoveax, 1; ñîçäà¼ì ìàñêóshleax, cl;â ðåãèñòðå EAXmovedx, ebx; âû÷èñëÿåì íîìåð ýë-òàshredx, 5;â ðåãèñòðå edxtest[set512+4*edx], eax ; ïðèìåíÿåì ìàñêó; òåïåðü ZF=1 îçíà÷àåò, ÷òî ýëåìåíò â ìíîæåñòâå;îòñóòñòâîâàë, à ZF=0 - ÷òî ïðèñóòñòîâàëÐàññìîòðèì åù¼ îäèí ïðèìåð. Ïóñòü íàì ïîòðåáîâàëîñü ñîñ÷èòàòü,ñêîëüêî ýëåìåíòîâ âõîäÿò â ìíîæåñòâî.
Äëÿ ýòîãî ïðèä¼òñÿ ïðîñìîòðåòüâñå ýëåìåíòû ìàññèâà è â êàæäîì èç íèõ ñîñ÷èòàòü åäèíè÷íûå áèòû. Ïðîùå âñåãî ýòî ñäåëàòü, çàãðóçèâ çíà÷åíèå èç ýëåìåíòà ìàññèâà â ðåãèñòð, àïîòîì ñäâèãàÿ çíà÷åíèå âïðàâî íà îäèí áèò è êàæäûé ðàç ïðîâåðÿÿ, åäèíèöà ëè â ìëàäøåì ðàçðÿäå; ýòî ìîæíî äåëàòü ðîâíî 32 ðàçà, íî ïðîùåçàêîí÷èòü, êîãäà â ðåãèñòðå îñòàíåòñÿ íîëü. Ìàññèâ ìû áóäåì ïðîñìàòðèâàòü ñ êîíöà, èíäåêñèðóÿ ïî ECX: ýòî ïîçâîëèò íàì ïðèìåíèòü êîìàíäójecxz.  êà÷åñòâå ñ÷¼ò÷èêà ðåçóëüòàòà âîñïîëüçóåìñÿ ðåãèñòðîì EBX, àäëÿ àíàëèçà ýëåìåíòîâ ìàññèâà ïðèìåíèì EAX.; ñîñ÷èòàòü ýëåìåíòû â ìíîæåñòâå set512xorebx, ebx ; EBX := 0movecx, 15; ïîñëåäíèé èíäåêñlp:moveax, [set512+4*ecx] ; çàãðóçèëè ýëåìåíòlp2:testeax, 1; åäèíèöà â ìëàäøåì ðàçðÿäå?jznotone;åñëè íåò, ïðûãàåìincebx; åñëè äà, óâåëè÷èâàåì ñ÷¼ò÷èênotone: shreax, 1; ñäâèíóëè EAX71testjnzeax, eaxlp2jecxzdecjmpquitecxlp; òàì åù¼ ÷òî-òî îñòàëîñü?; åñëè äà, ïðîäîëæàåì;âíóòðåííèé öèêë; åñëè â ECX íîëü, çàêàí÷èâàåì;èíà÷å óìåíüøàåì åãî;è ïðîäîëæàåì âíåøíèé öèêëquit:; òåïåðü ðåçóëüòàò ïîäñ÷¼òà íàõîäèòñÿ â EBX 2.6.