А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 37
Текст из файла (страница 37)
Ïðè èñïîëüçîâàíèè ôëàãà -l ðåäàêòîð ñâÿçåé ïûòàåòñÿ íàéòèôàéë áèáëèîòåêè ñ ñîîòâåòñòâóþùèì èìåíåì â ñèñòåìíûõ äèðåêòîðèÿõ(/lib, /usr/lib è ò. ï.), íî ìîæíî óêàçàòü åìó äîïîëíèòåëüíûå äèðåêòîðèè ñ ïîìîùüþ ôëàãà -L; òàê, ¾-L .¿ îçíà÷àåò, ÷òî ñëåäóåò ñíà÷àëàïîïðîáîâàòü íàéòè áèáëèîòåêó â òåêóùåé äèðåêòîðèè, è ëèøü çàòåì íà÷èíàòü ïîèñê â ñèñòåìíûõ äèðåêòîðèÿõ. ñâîåé ðàáîòå ðåäàêòîð ñâÿçåé èñïîëüçóåò äâà ñïèñêà ñèìâîëîâ : ñïèñîê èçâåñòíûõ (ðàçðåø¼ííûõ, îò àíãëèéñêîãî resolved ) ñèìâîëîâ è ñïèñîêíåðàçðåø¼ííûõ ññûëîê (unresolved links).
 ïåðâûé ñïèñîê çàíîñÿòñÿ ñèìâîëû, ýêñïîðòèðóåìûå îáúåêòíûìè ìîäóëÿìè (â ñâîèõ òåêñòàõ íà ÿçûêå àññåìáëåðà NASM ìû ïîìå÷àëè òàêèå ñèìâîëû äèðåêòèâîé global),âî âòîðîé ñïèñîê çàíîñÿòñÿ ñèìâîëû, ê êîòîðûì óæå åñòü îáðàùåíèÿ,òî åñòü èìåþòñÿ ìîäóëè, èìïîðòèðóþùèå ýòè ñèìâîëû (äëÿ NASM ýòîñèìâîëû, îáúÿâëåííûå äèðåêòèâîé extern è çàòåì èñïîëüçîâàííûå), íîêîòîðûå ïîêà íå âñòðåòèëèñü íè â îäíîì èç ìîäóëåé â êà÷åñòâå ýêñïîðòèðóåìûõ.Ðåäàêòîð ñâÿçåé íà÷èíàåò ðàáîòó, èíèöèàëèçèðîâàâ îáà ñïèñêà ñèìâîëîâ êàê ïóñòûå, è øàã çà øàãîì ïðîäâèãàåòñÿ ñëåâà íàïðàâî ïî ñïèñêó1 Ìû çäåñü íå ðàññìàòðèâàåì ñëó÷àé òàê íàçûâàåìûõ ðàçäåëÿåìûõ áèáëèîòåê, ôàéëû êîòîðûõ èìåþò ñóôôèêñ .so; êîíöåïöèÿ äèíàìè÷åñêîé çàãðóçêè òðåáóåò äîïîëíèòåëüíîãî îáñóæäåíèÿ, êîòîðîå âûõîäèò çà ðàìêè äàííîãî ïîñîáèÿ.163îáúåêòîâ, óêàçàííûõ â åãî êîìàíäíîé ñòðîêå.
 ñëó÷àå, åñëè î÷åðåäíûìóêàçàííûì îáúåêòîì áóäåò îáúåêòíûé ôàéë, ðåäàêòîð ñâÿçåé ¾ïðèíèìàåò¿ åãî â ôîðìèðóåìûé èñïîëíÿåìûé ôàéë. Ïðè ýòîì âñå ñèìâîëû,ýêñïîðòèðóåìûå ýòèì ìîäóëåì, çàíîñÿòñÿ â ñïèñîê èçâåñòíûõ ñèìâîëîâ;åñëè íåêîòîðûå èç íèõ ïðèñóòñòâîâàëè â ñïèñêå íåðàçðåø¼ííûõ ññûëîê,îíè îòòóäà óäàëÿþòñÿ. Ñèìâîëû, èìïîðòèðóåìûå ìîäóëåì, çàíîñÿòñÿ âñïèñîê íåðàçðåø¼ííûõ ññûëîê, åñëè òîëüêî îíè ê ýòîìó âðåìåíè íå ôèãóðèðóþò â ñïèñêå èçâåñòíûõ ñèìâîëîâ. Îáúåêòíûé êîä èç ìîäóëÿ ïðèíèìàåòñÿ ðåäàêòîðîì ñâÿçåé ê ïîñëåäóþùåìó ïðåîáðàçîâàíèþ â èñïîëíÿåìûé êîä è âñòàâêå â èñïîëíÿåìûé ôàéë.Åñëè æå î÷åðåäíûì îáúåêòîì èç ñïèñêà, óêàçàííîãî â êîìàíäíîéñòðîêå, îêàæåòñÿ áèáëèîòåêà, äåéñòâèÿ ðåäàêòîðà ñâÿçåé áóäóò áîëååñëîæíûìè è ãèáêèìè, ïîñêîëüêó âîçìîæíî, ÷òî ïðèíèìàòü âñå ñîñòàâëÿþùèå áèáëèîòåêó ìîäóëè íè ê ÷åìó. Ïðåæäå âñåãî ðåäàêòîð ñâÿçåé ñâåðèòñÿ ñî ñïèñêîì íåðàçðåø¼ííûõ ññûëîê; åñëè ýòîò ñïèñîê ïóñò, áèáëèîòåêà áóäåò ïîëíîñòüþ ïðîèãíîðèðîâàíà êàê íåíóæíàÿ.
Îäíàêî îáû÷íîñïèñîê â òàêîé ñèòóàöèè íå ïóñò (èíà÷å ïðîãðàììèñò íå ñòàë áû óêàçûâàòü áèáëèîòåêó), è ñëåäóþùèì äåéñòâèåì ðåäàêòîðà ñâÿçåé ñòàíîâÿòñÿïîî÷åð¼äíûå ïîïûòêè íàéòè â áèáëèîòåêå òàêèå ìîäóëè, êîòîðûå ýêñïîðòèðóþò îäèí èëè íåñêîëüêî ñèìâîëîâ ñ èìåíàìè, ôèãóðèðóþùèìè âòåêóùåì ñïèñêå íåðàçðåø¼ííûõ ññûëîê; åñëè òàêîé ìîäóëü íàéäåí, ðåäàêòîð ñâÿçåé ¾ïðèíèìàåò¿ åãî, ñîîòâåòñòâóþùèì îáðàçîì ìîäèôèöèðóåò ñïèñêè ñèìâîëîâ è íà÷èíàåò ðàññìîòðåíèå áèáëèîòåêè ñíîâà, è òàê äîòåõ ïîð, êîãäà íè îäèí èç îñòàâøèõñÿ â áèáëèîòåêå íåïðèíÿòûõ ìîäóëåéíå áóäåò ïðèãîäåí äëÿ ðàçðåøåíèÿ ññûëîê.
Òîãäà ðåäàêòîð ñâÿçåé ïðåêðàùàåò ðàññìîòðåíèå áèáëèîòåêè è ïåðåõîäèò ê ñëåäóþùåìó îáúåêòó èçñïèñêà. Òàêèì îáðàçîì, èç áèáëèîòåêè áåðóòñÿ òîëüêî òå ìîäóëè, êîòîðûå íóæíû, ÷òîáû óäîâëåòâîðèòü ïîòðåáíîñòè ïðåäøåñòâóþùèõ ìîäóëåéâ èìïîðòå ñèìâîëîâ, ïëþñ, âîçìîæíî, òàêèå ìîäóëè, â êîòîðûõ íóæäàþòñÿ óæå ïðèíÿòûå ìîäóëè èç òîé æå áèáëèîòåêè. Òàê, ïðè ñáîðêå ïðîãðàììû greet èç ïðåäûäóùåãî ïàðàãðàôà ðåäàêòîð ñâÿçåé ñíà÷àëà ïðèíÿëèç áèáëèîòåêè libgreet.a ìîäóëè getstr, putstr è quit, ïîñêîëüêó âíèõ ïðèñóòñòâîâàëè ñèìâîëû, èìïîðòèðóåìûå ðàíåå ïðèíÿòûì ìîäóëåìgreet.o; çàòåì ðåäàêòîð ñâÿçåé ïðèíÿë è ìîäóëü strlen, ïîñêîëüêó âí¼ì íóæäàëñÿ ìîäóëü putstr.Ðåäàêòîð ñâÿçåé âûäà¼ò ñîîáùåíèÿ îá îøèáêàõ è îòêàçûâàåòñÿ ïðîäîëæàòü ñáîðêó èñïîëíÿåìîãî ôàéëà â äâóõ îñíîâíûõ ñëó÷àÿõ.
Ïåðâûéèç íèõ âîçíèêàåò, êîãäà ñïèñîê îáúåêòîâ (ìîäóëåé è áèáëèîòåê) èñ÷åðïàí, à ñïèñîê íåðàçðåø¼ííûõ ññûëîê íå îïóñòåë, òî åñòü êàê ìèíèìóìîäèí èç ïðèíÿòûõ ìîäóëåé ññûëàåòñÿ â êà÷åñòâå âíåøíåãî íà ñèìâîë, êîòîðûé òàê íè â îäíîì èç ìîäóëåé è íå âñòðåòèëñÿ; òàêàÿ îøèáî÷íàÿ ñèòóàöèÿ íàçûâàåòñÿ íåîïðåäåë¼ííîé ññûëêîé (àíãë. undened reference ).Âòîðîé ñëó÷àé îøèáî÷íîé ñèòóàöèè ýòî ïîÿâëåíèå â î÷åðåäíîì ïðè164íèìàåìîì ìîäóëå ýêñïîðòèðóåìîãî ñèìâîëà, êîòîðûé ê ýòîìó ìîìåíòóóæå çíà÷èòñÿ â ñïèñêå èçâåñòíûõ; èíà÷å ãîâîðÿ, äâà èëè áîëåå ïðèíÿòûõ ê ðàññìîòðåíèþ ìîäóëÿ ýêñïîðòèðóþò îäèí è òîò æå ñèìâîë.
Ýòîíàçûâàåòñÿ êîíôëèêòîì èì¼í 2 .Èíòåðåñíî, ÷òî ðåäàêòîð ñâÿçåé íèêîãäà íå âîçâðàùàåòñÿ íàçàä â ñâî¼ì äâèæåíèè ïî ñïèñêó îáúåêòîâ, òàê ÷òî åñëè íåêîòîðûé ìîäóëü èç ñîñòàâà áèáëèîòåêè íå áûë ïðèíÿò íà ìîìåíò, êîãäà ðåäàêòîðäî ýòîé áèáëèîòåêè äîáðàëñÿ, òî ïîòîì îí íå áóäåò ïðèíÿò òåì áîëåå,äàæå åñëè â êàêîì-ëèáî èç ïîñëåäóþùèõ ìîäóëåé ïîÿâèòñÿ èìïîðòèðóåìûé ñèìâîë, êîòîðûé ìîæíî áûëî áû ðàçðåøèòü, ïðèíÿâ åù¼ ìîäóëè èçðàíåå îáðàáîòàííîé áèáëèîòåêè. Èç ýòîãî ôàêòà âûòåêàåò âàæíîå ñëåäñòâèå: îáúåêòíûå ìîäóëè ñëåäóåò óêàçûâàòü ðàíüøå, ÷åì áèáëèîòåêè, âêîòîðûõ ýòè ìîäóëè íóæäàþòñÿ.
Âòîðûì âàæíûì ñëåäñòâèåì ÿâëÿåòñÿòî, ÷òî áèáëèîòåêè íèêîãäà íå äîëæíû ¾ïåðåêð¼ñòíî¿ çàâèñåòüäðóã îò äðóãà, òî åñòü åñëè îäíà áèáëèîòåêà èñïîëüçóåò âîçìîæíîñòèâòîðîé, òî âòîðàÿ íå äîëæíà èñïîëüçîâàòü âîçìîæíîñòè ïåðâîé. Åñëè ïîäîáíîãî ðîäà ïåðåêð¼ñòíûå çàâèñèìîñòè âîçíèêëè, òàêèå äâå áèáëèîòåêèñëåäóåò îáúåäèíèòü â îäíó.Íàêîíåö, ìîæíî ñäåëàòü åù¼ îäèí âûâîä.
Äî òåõ ïîð, ïîêà áèáëèîòåêè âîîáùå íå çàâèñÿò äðóã îò äðóãà, ìû ìîæåì íå ñëèøêîì âîëíîâàòüñÿî ïîðÿäêå ïàðàìåòðîâ äëÿ ðåäàêòîðà ñâÿçåé: äîñòàòî÷íî ñíà÷àëà óêàçàòüâ ïðîèçâîëüíîì ïîðÿäêå âñå îáúåêòíûå ôàéëû, ñîñòàâëÿþùèå íàøó ïðîãðàììó, à çàòåì, îïÿòü-òàêè â ïðîèçâîëüíîì ïîðÿäêå, ïåðå÷èñëèòü âñåíóæíûå áèáëèîòåêè. Åñëè æå çàâèñèìîñòè ìåæäó áèáëèîòåêàìè ïîÿâëÿþòñÿ, ïîðÿäîê èõ óêàçàíèÿ ñòàíîâèòñÿ âàæåí, è ïðè åãî íåñîáëþäåíèèïðîãðàììà íå ñîáåð¼òñÿ. Òàêèì îáðàçîì, çàâèñèìîñòè áèáëèîòåê äðóãîò äðóãà, äàæå íå ïåðåêð¼ñòíûå, ïîðîæäàþò îïðåäåë¼ííûå ïðîáëåìû.Ïîýòîìó, ïðåæäå ÷åì ïîëàãàòüñÿ ïðè ðàçðàáîòêå îäíîé áèáëèîòåêè íàâîçìîæíîñòè äðóãîé, ñëåäóåò ìíîãîêðàòíî è òùàòåëüíî âñ¼ îáäóìàòü.Çíàíèå ïðèíöèïîâ ðàáîòû ðåäàêòîðà ñâÿçåé ïðèãîäèòñÿ âàì íå òîëüêî (è íå ñòîëüêî) â ó÷åáíîì ïðîãðàììèðîâàíèè íà ÿçûêå àññåìáëåðà, íîè â ïðàêòè÷åñêîé ðàáîòå íà ÿçûêàõ ïðîãðàììèðîâàíèÿ âûñîêîãî óðîâíÿ,â îñîáåííîñòè íà ÿçûêàõ Ñè è Ñè++.
Íå ïðèíèìàÿ âî âíèìàíèå ñîäåðæàíèå ýòîãî ïàðàãðàôà, âû ðèñêóåòå, ñ îäíîé ñòîðîíû, ïåðåãðóçèòü ñâîèèñïîëíÿåìûå ôàéëû íåíóæíûì (íåèñïîëüçóåìûì) ñîäåðæèìûì, à ñ äðóãîé ñïðîåêòèðîâàòü ñâîè áèáëèîòåêè òàê, ÷òî äàæå ñàìè íà÷í¼òå â íèõïóòàòüñÿ.2 Ñîâðåìåííûå ðåäàêòîðû ñâÿçåé â óãîäó íåðàäèâûì ïðîãðàììèñòàì ïîçâîëÿþòíå ñ÷èòàòü íåêîòîðûå ñëó÷àè êîíôëèêòà èì¼í îøèáêîé; ýòî èñïîëüçóåòñÿ, íàïðèìåð,êîìïèëÿòîðàìè ÿçûêà Ñè++. Ïîñòàðàéòåñü, íàñêîëüêî âîçìîæíî, íå ïîëàãàòüñÿ íàïîäîáíûå âîçìîæíîñòè.165Ãëàâà 6. Àðèôìåòèêà ñïëàâàþùåé òî÷êîéÄî ñèõ ïîð ìû ðàññìàòðèâàëè òîëüêî öåëûå ÷èñëà, è ëèøü âñêîëüçüóïîìèíàëè î ñóùåñòâîâàíèè àëüòåðíàòèâû.
Ìåæäó òåì, ïðè âûïîëíåíèè÷èñëåííûõ ðàñ÷¼òîâ (íàïðèìåð, â çàäà÷àõ, ñâÿçàííûõ ñ ìîäåëèðîâàíèåì ôèçè÷åñêèõ ÿâëåíèé è ïðîöåññîâ) öåëî÷èñëåííàÿ àðèôìåòèêà îêàçûâàåòñÿ íåóäîáíà; ìîæíî, êîíå÷íî, ïðèáåãíóòü ê ìåòîäó ôèêñèðîâàííîé òî÷êè (ñ÷èòàòü, ÷òî èñïîëüçóåìûå öåëûå ÷èñëà ïðåäñòàâëÿþò íååäèíèöû, à, íàïðèìåð, äåñÿòèòûñÿ÷íûå äîëè åäèíèö), íî äëÿ ñåðü¼çíûõðàñ÷¼òîâ ýòî íå ïîäõîäèò. Àëüòåðíàòèâîé ÿâëÿåòñÿ ðàáîòà ñ ìàøèííûìïðåäñòàâëåíèåì äðîáíûõ ÷èñåë â âèäå äâîè÷íûõ äðîáåé. Òàêîå ïðåäñòàâëåíèå îáû÷íî ñ÷èòàåòñÿ ïðèáëèçèòåëüíûì, à â õîäå ðàáîòû ïðè âûïîëíåíèè àðèôìåòè÷åñêèõ îïåðàöèé âîçíèêàþò îøèáêè îêðóãëåíèÿ ; ýòî íåèçáåæíàÿ ïëàòà çà ïðåäñòàâëåíèå íåïðåðûâíûõ (ïî ñâîåé ñóòè) âåëè÷èíäèñêðåòíûì ñïîñîáîì. ðàííèõ ïðîöåññîðàõ ëèíåéêè x86 (âïëîòü äî 80386) âîçìîæíîñòèðàáîòû ñ ÷èñëàìè ñ ïëàâàþùåé òî÷êîé îòñóòñòâîâàëè; èõ ìîæíî áûëîëèáî ýìóëèðîâàòü ïðîãðàììíî (ðàáîòàëà òàêàÿ ýìóëÿöèÿ î÷åíü ìåäëåííî), ëèáî óñòàíîâèòü â êîìïüþòåð äîïîëíèòåëüíóþ ìèêðîñõåìó, íàçûâàåìóþ àðèôìåòè÷åñêèì ñîïðîöåññîðîì : 8087 äëÿ 8086, 80287 äëÿ80287, è, íàêîíåö, 80387 äëÿ 80386.
Ïðàêòè÷åñêè âñå êîìïüþòåðû íà îñíîâå 386-ãî ïðîöåññîðà áûëè îñíàùåíû ñîïðîöåññîðîì; ñïðîñà íà êîìïüþòåðû áåç òàêîâîãî íå áûëî, ïîñêîëüêó íåçíà÷èòåëüíîå óäåøåâëåíèåñèñòåìû íå êîìïåíñèðîâàëî îòâðàòèòåëüíî ìåäëåííîé ðàáîòû ìàøèíû ñëþáûìè ìàëî-ìàëüñêè çàìåòíûìè ðàñ÷¼òíûìè çàäà÷àìè. Ïîýòîìó ïðèðàçðàáîòêå î÷åðåäíîãî ïðîöåññîðà â ëèíåéêå (486DX) ñõåìû ñîïðîöåññîðà áûëè âêëþ÷åíû â îäíó ôèçè÷åñêóþ ìèêðîñõåìó ñ îñíîâíûì ïðîöåññîðîì. Òåì íå ìåíåå, ñ òî÷êè çðåíèÿ âûïîëíÿþùåéñÿ ïðîãðàììû àðèôìåòè÷åñêèé ñîïðîöåññîð ïî-ïðåæíåìó (äî ñèõ ïîð) ïðåäñòàâëÿåò ñîáîéîòäåëüíûé ïðîöåññîð ñî ñâîåé ñèñòåìîé ðåãèñòðîâ, ñîâñåì íå ïîõîæèõ íàðåãèñòðû îñíîâíîãî ïðîöåññîðà, ñî ñâîèìè ôëàãàìè, êîòîðûå ïðèõîäèòñÿ166êîïèðîâàòü â îñíîâíîé ðåãèñòð ôëàãîâ ñïåöèàëüíûìè êîìàíäàìè, è ñîñâîèìè ñâîåîáðàçíûìè ïðèíöèïàìè ôóíêöèîíèðîâàíèÿ. 6.1. Ôîðìàò ÷èñåë ñ ïëàâàþùåé òî÷êîé×èñëî ñ ïëàâàþùåé òî÷êîé ýòî îñîáûé ñïîñîá äâîè÷íîãî ïðåäñòàâëåíèÿ äðîáíîãî ÷èñëà, ïðåäïîëàãàþùèé îòäåëüíîå õðàíåíèå ìàíòèññû M (äâîè÷íîé äðîáè èç èíòåðâàëà 1 6 M < 2) è ìàøèííîãîïîðÿäêà P öåëîãî ÷èñëà, îçíà÷àþùåãî ñòåïåíü äâîéêè, íà êîòîðóþñëåäóåò óìíîæèòü ìàíòèññó.
Îòäåëüíûé áèò s âûäåëÿåòñÿ ïîä çíàê ÷èñëà: åñëè îí ðàâåí 1 ÷èñëî ñ÷èòàåòñÿ îòðèöàòåëüíûì, èíà÷å ïîëîæèòåëüíûì. Èòîãîâîå ÷èñëî, òàêèì îáðàçîì, âû÷èñëÿåòñÿ êàê N = (−1)s M 2P .Íàáîð ÷àñòíûõ ñîãëàøåíèé î ôîðìàòå ÷èñåë ñ ïëàâàþùåé òî÷êîé, èçâåñòíûé êàê ñòàíäàðò IEEE-754, â íàñòîÿùåå âðåìÿ èñïîëüçóåòñÿ ïðàêòè÷åñêè âñåìè ïðîöåññîðàìè, ñïîñîáíûìè âûïîëíÿòü àðèôìåòèêó ñ ïëàâàþùåé òî÷êîé, è äâîè÷íûìè ôîðìàòàìè äàííûõ, ïðåäïîëàãàþùèìè õðàíåíèå äðîáíûõ ÷èñåë.Ïîñêîëüêó öåëàÿ ÷àñòü ìàíòèññû âñåãäà ðàâíà 1, å¼ ìîæíî íå õðàíèòü1 , èñïîëüçóÿ èìåþùèåñÿ ðàçðÿäû äëÿ õðàíåíèÿ öèôð äðîáíîé ÷àñòè.
Äëÿ õðàíåíèÿ ìàøèííîãî ïîðÿäêà â ðàçíîå âðåìÿ èñïîëüçîâàëèñüðàçíûå ñïîñîáû (çíàêîâîå öåëîå ñ èñïîëüçîâàíèåì äîïîëíèòåëüíîãî êîäà,îòäåëüíûé áèò äëÿ çíàêà ïîðÿäêà è ò. ï.); ñòàíäàðò IEEE-754 ïðåäïîëàãàåò õðàíåíèå ìàøèííîãî ïîðÿäêà â âèäå ñìåù¼ííîãî áåççíàêîâîãî öåëîãî÷èñëà: ñîîòâåòñòâóþùèå ðàçðÿäû ðàññìàòðèâàþòñÿ êàê öåëîå ÷èñëî áåççíàêà, èç êîòîðîãî äëÿ ïîëó÷åíèÿ ìàøèííîãî ïîðÿäêà âû÷èòàþò íåêîòîðóþ êîíñòàíòó, íàçûâàåìóþ ñìåùåíèåì ìàøèííîãî ïîðÿäêà.Ñòàíäàðò IEEE-754 óñòàíàâëèâàåò òðè îñíîâíûõ òèïà ÷èñåë ñ ïëàâàþùåé òî÷êîé: ÷èñëî îáû÷íîé òî÷íîñòè, ÷èñëî äâîéíîé òî÷íîñòè è ÷èñëîïîâûøåííîé òî÷íîñòè2 .