А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 15
Текст из файла (страница 15)
Åäèíñòâåííûé îïåðàíä êîìàíäû, êàê óæå ãîâîðèëîñü âûøå, çàäà¼ò äåëèòåëü. çàâèñèìîñòè îò ðàçðÿäíîñòè ýòîãî äåëèòåëÿ (1, 2 èëè 4 áàéòà) äåëèìîå áåð¼òñÿ èç ðåãèñòðà AX, ðåãèñòðîâîé ïàðû DX:AX èëè ðåãèñòðîâîéïàðû EDX:EAX, ÷àñòíîå ïîìåùàåòñÿ â ðåãèñòð AL, AX èëè EAX, à îñòàòîêîò äåëåíèÿ â ðåãèñòðû AH, DX èëè EDX, ñîîòâåòñòâåííî (ñì. òàáë. 2.1).×àñòíîå âñåãäà îêðóãëÿåòñÿ â ñòîðîíó íóëÿ (äëÿ áåççíàêîâûõ è ïîëîæèòåëüíûõ â ìåíüøóþ, äëÿ îòðèöàòåëüíûõ â áîëüøóþ ñòîðîíó). Çíàê57îñòàòêà, âû÷èñëÿåìîãî êîìàíäîé imul, âñåãäà ñîâïàäàåò ñî çíàêîì äåëèìîãî, à àáñîëþòíàÿ âåëè÷èíà (ìîäóëü) îñòàòêà âñåãäà ñòðîãî ìåíüøåìîäóëÿ äåëèòåëÿ.
Çíà÷åíèÿ ôëàãîâ ïîñëå âûïîëíåíèÿ öåëî÷èñëåííîãîäåëåíèÿ íå îïðåäåëåíû.Îòäåëüíîãî ðàññìîòðåíèÿ çàñëóæèâàåò ñèòóàöèÿ, êîãäà â äåëèòåëå íà ìîìåíòâûïîëíåíèÿ êîìàíäû div èëè idiv íàõîäèòñÿ ÷èñëî 0. Äåëèòü íà íîëü, êàê èçâåñòíî, íåëüçÿ, à ñîáñòâåííûõ ñðåäñòâ, ÷òîáû ñîîáùèòü î ïðîèñøåäøåé îøèáêå,ó ïðîöåññîðà íåò. Ïîýòîìó ïðîöåññîð èíèöèèðóåò òàê íàçûâàåìîå âíóòðåííåå ïðåðûâàíèå, â ðåçóëüòàòå êîòîðîãî óïðàâëåíèå ïîëó÷àåò îïåðàöèîííàÿ ñèñòåìà; âáîëüøèíñòâå ñëó÷àåâ îíà ñîîáùàåò îá îøèáêå è çàâåðøàåò òåêóùóþ çàäà÷ó êàêàâàðèéíóþ.
Òî æå ñàìîå ïðîèçîéä¼ò è â ñëó÷àå, åñëè ðåçóëüòàò äåëåíèÿ íå óìåñòèëñÿ â îòâåä¼ííûå åìó ðàçðÿäû: íàïðèìåð, åñëè ìû çàíåñ¼ì â EDX ÷èñëî 10h, àâ EAX ëþáîå äðóãîå, äàæå ïðîñòî 0, è ïîïûòàåìñÿ ïîäåëèòü ýòî (òî åñòü øåñòíàäöàòåðè÷íîå 1000000000, èëè 236 ), ñêàæåì, íà 2 (çàïèñàâ åãî, íàïðèìåð, â EBX,÷òîáû ñäåëàòü äåëåíèå 32-ðàçðÿäíûì), òî ðåçóëüòàò (235 ) â 32 ðàçðÿäà ¾íå âëåçåò¿, è ïðîöåññîðó ïðèä¼òñÿ èíèöèèðîâàòü ïðåðûâàíèå.
Ïîäðîáíåå î ïðåðûâàíèÿõìû ðàññêàæåì â 4.2. 2.4. Óñëîâíûå è áåçóñëîâíûå ïåðåõîäûÊàê óæå îòìå÷àëîñü, â îáû÷íîå ïîñëåäîâàòåëüíîå âûïîëíåíèå êîìàíäìîæíî âìåøàòüñÿ, âûïîëíèâ ïåðåäà÷ó óïðàâëåíèÿ , íàçûâàåìóþ òàêæå ïåðåõîäîì . Ðàçëè÷àþò êîìàíäû áåçóñëîâíûõ ïåðåõîäîâ , âûïîëíÿþùèå ïåðåäà÷ó óïðàâëåíèÿ â äðóãîå ìåñòî ïðîãðàììû áåç âñÿêèõ ïðîâåðîê, è êîìàíäû óñëîâíûõ ïåðåõîäîâ , êîòîðûå ìîãóò, â çàâèñèìîñòèîò ðåçóëüòàòà ïðîâåðêè íåêîòîðîãî óñëîâèÿ, ëèáî âûïîëíèòü ïåðåõîä âçàäàííóþ òî÷êó, ëèáî íå âûïîëíÿòü åãî â ýòîì ñëó÷àå âûïîëíåíèåïðîãðàììû, êàê îáû÷íî, ïðîäîëæèòñÿ ñî ñëåäóþùåé êîìàíäû. 2.4.1. Áåçóñëîâíûé ïåðåõîä è âèäû ïåðåõîäîâ ñèñòåìå êîìàíä ïðîöåññîðà i386 âñå êîìàíäû ïåðåäà÷è óïðàâëåíèÿïîäðàçäåëÿþòñÿ, â çàâèñèìîñòè îò ¾äàëüíîñòè¿ òàêîé ïåðåäà÷è, íà òðèòèïà.(far) ïåðåõîäû ïîäðàçóìåâàþò ïåðåäà÷ó óïðàâëåíèÿ âîôðàãìåíò ïðîãðàììû, ðàñïîëîæåííûé â äðóãîì ñåãìåíòå.
Ïîñêîëüêó ïîä óïðàâëåíèåì ÎÑ Unix ìû èñïîëüçóåì ¾ïëîñêóþ¿ ìîäåëü ïàìÿòè, â êîòîðîé ðàçäåëåíèå íà ñåãìåíòû îòñóòñòâóåò (òî÷íåå, èìååò ìåñòî ëèøü îäèí ñåãìåíò, ¾íàêðûâàþùèé¿ âñ¼ íàøå âèðòóàëüíîå àäðåñíîå ïðîñòðàíñòâî), òàêèå ïåðåõîäû íàì ïîíàäîáèòüñÿ íå ìîãóò: ó íàñ ïîïðîñòó íåò äðóãèõ ñåãìåíòîâ.1.Äàëüíèå2.Áëèçêèå (near) ïåðåõîäû ýòî ïåðåäà÷à óïðàâëåíèÿ â ïðîèçâîëüíîå ìåñòî âíóòðè îäíîãî ñåãìåíòà; ôàêòè÷åñêè òàêèå ïåðåõîäû58ïðåäñòàâëÿþò ñîáîé ÿâíîå èçìåíåíèå çíà÷åíèÿ EIP.  ¾ïëîñêîé¿ìîäåëè ïàìÿòè ýòî èìåííî òîò âèä ïåðåõîäîâ, ñ ïîìîùüþ êîòîðîãî ìû ìîæåì ¾ïðûãíóòü¿ â ïðîèçâîëüíîå ìåñòî â íàøåì àäðåñíîìïðîñòðàíñòâå.3.(short) ïåðåõîäû èñïîëüçóþòñÿ äëÿ îïòèìèçàöèè âñëó÷àå, åñëè òî÷êà, êóäà íàäëåæèò ¾ïðûãíóòü¿, îòñòîèò îò òåêóùåé êîìàíäû íå áîëåå ÷åì íà 127 áàéò âïåð¼ä èëè 128 áàéò íàçàä. ìàøèííîì êîäå òàêîé êîìàíäû ñìåùåíèå çàäà¼òñÿ âñåãî îäíèìáàéòîì, îòñþäà ñîîòâåòñòâóþùåå îãðàíè÷åíèå.ÊîðîòêèåÏðè íàïèñàíèè êîìàíäû ïåðåõîäà ìû ìîæåì ÿâíî óêàçàòü âèä íóæíîãî íàì ïåðåõîäà, ïîñòàâèâ ïîñëå êîìàíäû ñëîâî short èëè near (àññåìáëåð ïîíèìàåò, ðàçóìååòñÿ, è ñëîâî far, íî íàì ýòî íå íóæíî).
Åñëè ýòîãîíå ñäåëàòü, àññåìáëåð âûáèðàåò òèï ïåðåõîäà ïî óìîë÷àíèþ, ïðè÷¼ì äëÿáåçóñëîâíûõ ïåðåõîäîâ ýòî near, ÷òî íàñ îáû÷íî óñòðàèâàåò, à âîò äëÿóñëîâíûõ ïåðåõîäîâ ïî óìîë÷àíèþ èñïîëüçóåòñÿ short. Âûòåêàþùèå èçýòîãî ñëîæíîñòè è ñïîñîáû èõ ïðåîäîëåíèÿ ìû îáñóäèì â ñëåäóþùåìïàðàãðàôå, êîòîðûé ïîñâÿù¼í óñëîâíûì ïåðåõîäàì, à ïîêà âåðí¼ìñÿ êïåðåõîäàì áåçóñëîâíûì.Êîìàíäà áåçóñëîâíîãî ïåðåõîäà íàçûâàåòñÿ jmp (îò ñëîâà ¾jump¿, êîòîðîå áóêâàëüíî ïåðåâîäèòñÿ êàê ¾ïðûæîê¿).
Ó êîìàíäû ïðåäóñìîòðåíîäèí îïåðàíä, îïðåäåëÿþùèé ñîáñòâåííî àäðåñ, êóäà ñëåäóåò ïåðåäàòüóïðàâëåíèå. ×àùå âñåãî èñïîëüçóåòñÿ ôîðìà êîìàíäû jmp ñ íåïîñðåäñòâåííûì îïåðàíäîì, òî åñòü àäðåñîì, óêàçàííûì ïðÿìî â êîìàíäå. Åñòåñòâåííî, óêàçûâàåì ìû íå ÷èñëîâîé àäðåñ (êîòîðîãî îáû÷íî íå çíàåì), àìåòêó. Âîçìîæíî, îäíàêî, èñïîëüçîâàòü è ðåãèñòðîâûé îïåðàíä (â ýòîìñëó÷àå ïåðåõîä ïðîèçâîäèòñÿ ïî àäðåñó, âçÿòîìó èç ðåãèñòðà), è îïåðàíäòèïà ¾ïàìÿòü¿ (àäðåñ ÷èòàåòñÿ èç äâîéíîãî ñëîâà, ðàñïîëîæåííîãî â çàäàííîé ïîçèöèè â ïàìÿòè); òàêèå ïåðåõîäû íàçûâàþò êîñâåííûìè , â îòëè÷èå îò ïðÿìûõ , äëÿ êîòîðûõ àäðåñ çàäà¼òñÿ ÿâíî. Ïðèâåä¼ì íåñêîëüêî ïðèìåðîâ:jmp cyclejmp eaxjmp [addr]jmp [eax];;;;;;;ïåðåõîä íà ìåòêó cycleïåðåõîä ïî àäðåñó èç ðåãèñòðà EAXïåðåõîä ïî àäðåñó, ñîäåðæàùåìóñÿâ ïàìÿòè, êîòîðàÿ ïîìå÷åíà ìåòêîé addrïåðåõîä ïî àäðåñó, ïðî÷èòàííîìó èçïàìÿòè, ðàñïîëîæåííîé ïî àäðåñó,âçÿòîìó èç ðåãèñòðà EAXÇäåñü ïåðâàÿ êîìàíäà çàäà¼ò ïðÿìîé ïåðåõîä, à îñòàëüíûå êîñâåííûé.Åñëè ìåòêà, íà êîòîðóþ íóæíî ïåðåéòè, íàõîäèòñÿ äîñòàòî÷íî áëèçêî ê òåêóùåé ïîçèöèè, ìîæíî ïîïûòàòüñÿ ñîïòèìèçèðîâàòü ìàøèííûé êîä, ïðèìåíèâñëîâî short:59mylabel:; ...; íåáîëüøîå êîëè÷åñòâî êîìàíä; ...jmp short mylabelÍà ãëàç îáû÷íî òÿæåëî îïðåäåëèòü, äåéñòâèòåëüíî ëè ìåòêà íàõîäèòñÿ äîñòàòî÷íîáëèçêî, òåì áîëåå ÷òî ìàêðîñû (íàïðèìåð, GETCHAR) ìîãóò ñãåíåðèðîâàòü öåëûéðÿä êîìàíä, èíîãäà ñëàáî ïðåäñêàçóåìûé ïî äëèíå.
Íî íà ýòîò ñ÷¼ò ìîæíî íåáåñïîêîèòüñÿ: åñëè ðàññòîÿíèå äî ìåòêè îêàæåòñÿ áîëüøå äîïóñòèìîãî, àññåìáëåðâûäàñò îøèáêó ïðèìåðíî òàêîãî âèäà:file.asm:35: error: short jump is out of rangeè îñòàíåòñÿ òîëüêî íàéòè ñòðîêó ñ óêàçàííûì íîìåðîì (â äàííîì ñëó÷àå 35) èóáðàòü ¾íåñðàáîòàâøåå¿ cëîâî short. 2.4.2. Óñëîâíûå ïåðåõîäû ïî îòäåëüíûì ôëàãàì ïðîòèâîïîëîæíîñòü êîìàíäàì áåçóñëîâíîãî ïåðåõîäà, êîìàíäûóñëîâíîãî ïåðåõîäà àññåìáëåð ïî óìîë÷àíèþ ñ÷èòàåò ¾êîðîòêèìè¿, åñëè íå óêàçàòü òèï ïåðåõîäà ÿâíî.Òàêîé, íà ïåðâûé âçãëÿä, ñòðàííûé ïîäõîä ê êîìàíäàì ïåðåõîäîâ îáóñëîâëåíèñòîðè÷åñêèìè ïðè÷èíàìè: íà ðàííèõ ïðîöåññîðàõ ëèíåéêè x86 óñëîâíûå ïåðåõîäû áûëû òîëüêî êîðîòêèìè, äðóãèõ êîìàíä ïðîñòî íå áûëî.
Ïðîöåññîð i386 èâñå áîëåå ïîçäíèå ïðîöåññîðû, êîíå÷íî æå, ïîääåðæèâàþò è áëèçêèå óñëîâíûåïåðåõîäû; äàëüíèå óñëîâíûå ïåðåõîäû äî ñèõ ïîð íå ïîääåðæèâàþòñÿ, íî íàì îíèâñ¼ ðàâíî íå íóæíû.Ïðîñòåéøèå êîìàíäû óñëîâíîãî ïåðåõîäà ïðîèçâîäÿò ïåðåõîä ïî óêàçàííîìó àäðåñó â ñëó÷àå, åñëè îäèí èç ôëàãîâ ðàâåí íóëþ (ñáðîøåí) èëèåäèíèöå (óñòàíîâëåí). Èìåíà ýòèõ êîìàíä îáðàçóþòñÿ èç áóêâû J (îòñëîâà ¾jump¿, ïåðâîé áóêâû íàçâàíèÿ ôëàãà (íàïðèìåð, Z äëÿ ôëàãà ZF)è, âîçìîæíî, âñòàâëåííîé ìåæäó íèìè áóêâû N (îò ñëîâà ¾not¿), åñëèïåðåõîä íóæíî ïðîèçâåñòè ïðè óñëîâèè ðàâåíñòâà ôëàãà íóëþ. Âñå ýòèêîìàíäû ïðèâåäåíû â òàáë.
2.2. Íàïîìíèì, ÷òî ñìûñë êàæäîãî èç ôëàãîâìû ðàññìîòðåëè íà ñòð. 36.Òàêèå êîìàíäû óñëîâíîãî ïåðåõîäà îáû÷íî ñòàâÿò íåïîñðåäñòâåííîïîñëå àðèôìåòè÷åñêîé îïåðàöèè (íàïðèìåð, ñðàçó ïîñëå êîìàíäû cmp,ñì. ñòð. 55). Íàïðèìåð, äâå êîìàíäûcmp eax, ebxjz are_equalìîæíî ïðî÷èòàòü êàê ïðèêàç ¾ñðàâíèòü çíà÷åíèÿ â ðåãèñòðàõ EAX è EBXè åñëè îíè ðàâíû, ïåðåéòè íà ìåòêó are_equal¿.60êîìàíäàjzjsjcjojpóñëîâèåïåðåõîäàZF=1SF=1CF=1OF=1PF=1êîìàíäàjnzjnsjncjnojnpóñëîâèåïåðåõîäàZF=0SF=0CF=0OF=0PF=0Òàáëèöà 2.2. Ïðîñòåéøèå êîìàíäû óñëîâíîãî ïåðåõîäà 2.4.3. Ïåðåõîäû ïî ðåçóëüòàòàì ñðàâíåíèéÅñëè íàì íóæíî ñðàâíèòü äâà ÷èñëà íà ðàâåíñòâî, âñ¼ äîâîëüíî ïðîñòî: äîñòàòî÷íî, êàê â ïðåäûäóùåì ïðèìåðå, âîñïîëüçîâàòüñÿ ôëàãîì ZF.Íî ÷òî äåëàòü, åñëè íàñ èíòåðåñóåò, íàïðèìåð, óñëîâèå a < b? Ñíà÷àëàìû, åñòåñòâåííî, ïðèìåíèì êîìàíäócmp a, b(â êà÷åñòâå a è b ìîãóò áûòü ëþáûå îïåðàíäû, íóæíî òîëüêî ïîìíèòü,÷òî îíè íå ìîãóò áûòü îáà îäíîâðåìåííî îïåðàíäàìè òèïà ¾ïàìÿòü¿).Êîìàíäà âûïîëíèò ñðàâíåíèå ñâîèõ îïåðàíäîâ òî÷íåå ãîâîðÿ, âû÷òåòèç a çíà÷åíèå b è ñîîòâåòñòâóþùèì îáðàçîì âûñòàâèò çíà÷åíèÿ ôëàãîâ.Íî âîò äàëüíåéøåå, êàê ìû ñåé÷àñ óâèäèì, îêàçûâàåòñÿ íåñêîëüêî ñëîæíåå.Åñëè ÷èñëà a è b çíàêîâûå, òî íà ïåðâûé âçãëÿä âñ¼ ïðîñòî: âû÷èòàíèå a − b ïðè óñëîâèè a < b äà¼ò ÷èñëî ñòðîãî îòðèöàòåëüíîå, òàê ÷òîôëàã çíàêà (SF, sign ag) äîëæåí áûòü óñòàíîâëåí, è ìû ìîæåì âîñïîëüçîâàòüñÿ êîìàíäîé js èëè jns.
Íî âåäü ðåçóëüòàò ìîã è íå ïîìåñòèòüñÿ âäëèíó îïåðàíäà (íàïðèìåð, â 32 áèòà, åñëè ìû ñðàâíèâàåì 32-ðàçðÿäíûå÷èñëà), òî åñòü ìîãëî âîçíèêíóòü ïåðåïîëíåíèå!  ýòîì ñëó÷àå çíà÷åíèåôëàãà SF îêàæåòñÿ ïðÿìî ïðîòèâîïîëîæíûì îæèäàâøåìóñÿ, çàòî áóäåòâçâåä¼í ôëàã OF (overow ag). Òàêèì îáðàçîì, óñëîâèå a < b âûïîëíÿåòñÿ â äâóõ ñëó÷àÿõ: åñëè SF=1, íî OF=0 (òî åñòü ïåðåïîëíåíèÿ íå áûëî,÷èñëî ïîëó÷èëîñü îòðèöàòåëüíîå), ëèáî åñëè SF=0, íî OF=1 (÷èñëî ïîëó÷èëîñü ïîëîæèòåëüíîå, íî ýòî ðåçóëüòàò ïåðåïîëíåíèÿ, à íà ñàìîì äåëåðåçóëüòàò îòðèöàòåëüíûé).
Èíà÷å ãîâîðÿ, íàñ èíòåðåñóåò, ÷òîáû ôëàãèSF è OF íå áûëè ðàâíû äðóã äðóãó : SF6=OF. Äëÿ òàêîãî ñëó÷àÿ â ïðîöåññîðåi386 ïðåäóñìîòðåíà êîìàíäà jl (îò ñëîâ ¾jump if less than¿), îáîçíà÷àåìàÿ òàêæå ìíåìîíèêîé jnge (¾jump if not greater or equal¿).Ðàññìîòðèì òåïåðü ñèòóàöèþ, åñëè ÷èñëà a è b áåççíàêîâûå. Êàêìû óæå îáñóæäàëè â 2.3.1 (ñì. ñòð. 54), ïî èòîãàì àðèôìåòè÷åñêèõ îïåðàöèé íàä áåççíàêîâûìè ÷èñëàìè ôëàãè OF è SF ðàññìàòðèâàòü íå èìååò61èìÿêîì.jejnejljngejlejngjgjnlejgejnljbjnaejbejnajajnbejaejnbjump if...âûð.óñëîâèåa∨bïåðåõîäàðàâåíñòâîequala=bZF= 1not equala 6= bZF= 0íåðàâåíñòâà äëÿ çíàêîâûõ ÷èñåëlessa<bSF6=OFnot greater or equalless or equala 6 b SF6=OF èëè ZF= 1not greatergreatera>bSF=OF è ZF= 0not less or equalgreater or equala>bSF=OFnot lessíåðàâåíñòâà äëÿ áåççíàêîâûõ ÷èñåëbelowa<bCF= 1not above or equalbelow or equala 6 b CF= 1 èëè ZF= 1not aboveabovea>bCF= 0 è ZF= 0not below or equalabove or equala>bCF= 0not belowñèíîíèìjzjnzjcjncÒàáëèöà 2.3.