А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 11
Текст из файла (страница 11)
Âñ¼ ýòî àññåìáëåð çàïèøåòâ ôàéë ñ îáúåêòíûì êîäîì, à ñèñòåìíûé êîìïîíîâùèê èç òàêèõ ôàéëîâ (âîçìîæíî, íåñêîëüêèõ) ñôîðìèðóåò èñïîëíÿåìûé ôàéë, ñîäåðæàùèé (êðîìå ñîáñòâåííî ìàøèííîãî êîäà), âî-ïåðâûõ, òå äàííûå, êîòîðûåíóæíî çàïèñàòü â ïàìÿòü ïåðåä ñòàðòîì ïðîãðàììû, è, âî-âòîðûõ, óêàçàíèÿ íà òî, ñêîëüêî ïðîãðàììå ïîíàäîáèòñÿ åù¼ ïàìÿòè, êðîìå òîé, ÷òîíóæíà ïîä ðàçìåùåíèå ìàøèííîãî êîäà è èñõîäíûõ äàííûõ. ×òîáû ñîîáùèòü àññåìáëåðó, â êàêîé ñåêöèè äîëæåí áûòü ðàçìåù¼í òîò èëè èíîéôðàãìåíò ôîðìèðóåìîãî îáðàçà ïàìÿòè, ìû â ïðîãðàììå íà ÿçûêå àññåìáëåðà äîëæíû èñïîëüçîâàòü äèðåêòèâó section; íàïðèìåð, ñòðî÷êàsection .textîçíà÷àåò, ÷òî ðåçóëüòàò îáðàáîòêè ïîñëåäóþùèõ ñòðîê äîëæåí ðàçìåùàòüñÿ â ñåêöèè êîäà, à ñòðî÷êàsection .bssçàñòàâëÿåò àññåìáëåð ïåðåéòè ê ôîðìèðîâàíèþ ñåêöèè íåèíèöèàëèçèðîâàííûõ äàííûõ. Äèðåêòèâû ïåðåêëþ÷åíèÿ ñåêöèé ìîãóò âñòðå÷àòüñÿ âïðîãðàììå ñêîëüêî óãîäíî ðàç ìû ìîæåì ñôîðìèðîâàòü ÷àñòü îäíîéñåêöèè, çàòåì ÷àñòü äðóãîé, ïîòîì âåðíóòüñÿ ê ôîðìèðîâàíèþ ïåðâîé.Ñîîáùèòü àññåìáëåðó î íàøèõ ïîòðåáíîñòÿõ â îïåðàòèâíîé ïàìÿòèìîæíî ñ ïîìîùüþ äèðåêòèâ ðåçåðâèðîâàíèÿ ïàìÿòè , êîòîðûå äåëÿòñÿ íà äâà âèäà: äèðåêòèâû ðåçåðâèðîâàíèÿ íåèíèöèàëèçèðîâàííîéïàìÿòè è äèðåêòèâû çàäàíèÿ èñõîäíûõ äàííûõ.
Îáû÷íî ïåðåä äèðåêòèâàìè îáîèõ âèäîâ ñòàâèòñÿ ìåòêà, ÷òîáû ìîæíî áûëî ññûëàòüñÿ ñ å¼ïîìîùüþ íà àäðåñ â ïàìÿòè, ãäå àññåìáëåð îòâ¼ë äëÿ íàñ òðåáóåìûåÿ÷åéêè.Äèðåêòèâû ðåçåðâèðîâàíèÿ íåèíèöèàëèçèðîâàííîé ïàìÿòèñîîáùàþò àññåìáëåðó, ÷òî íåîáõîäèìî çàðåçåðâèðîâàòü çàäàííîå êîëè÷åñòâî ÿ÷ååê ïàìÿòè, ïðè÷¼ì íè÷åãî, êðîìå êîëè÷åñòâà, íå óòî÷íÿåòñÿ.Ìû íå òðåáóåì îò àññåìáëåðà çàïîëíÿòü îòâåä¼ííóþ ïàìÿòü êàêèìèëèáî êîíêðåòíûìè çíà÷åíèÿìè, íàì äîñòàòî÷íî, ÷òîáû ýòà ïàìÿòü âîîáùå áûëà â íàëè÷èè. Äëÿ ðåçåðâèðîâàíèÿ çàäàííîãî êîëè÷åñòâà îäíîáàéòîâûõ ÿ÷ååê èñïîëüçóåòñÿ äèðåêòèâà resb, äëÿ ðåçåðâèðîâàíèÿ ïà40ìÿòè ïîä îïðåäåë¼ííîå êîëè÷åñòâî ¾ñëîâ4 ¿, òî åñòü äâóõáàéòîâûõ çíà÷åíèé (íàïðèìåð, êîðîòêèõ öåëûõ ÷èñåë) äèðåêòèâà resw, äëÿ ¾äâîéíûõ ñëîâ¿ (òî åñòü ÷åòûð¼õáàéòíûõ çíà÷åíèé) èñïîëüçóåòñÿ resd; ïîñëåäèðåêòèâû óêàçûâàåòñÿ (â êà÷åñòâå ïàðàìåòðà) ÷èñëî, îáîçíà÷àþùåå êîëè÷åñòâî çíà÷åíèé, ïîä êîòîðîå ìû ðåçåðâèðóåì ïàìÿòü.
Êàê óæå ãîâîðèëîñü, îáû÷íî ïåðåä äèðåêòèâîé ðåçåðâèðîâàíèÿ ïàìÿòè ñòàâèòñÿ ìåòêà.Íàïðèìåð, åñëè ìû íàïèøåì ñëåäóþùèå ñòðîêè:stringcountxresb 20resw 256resd 1òî ïî àäðåñó, ñâÿçàííîìó ñ ìåòêîé string, áóäåò ðàñïîëîæåí ìàññèâ èç 20îäíîáàéòîâûõ ÿ÷ååê (òàêîé ìàññèâ ìîæíî, íàïðèìåð, èñïîëüçîâàòü äëÿõðàíåíèÿ ñòðîêè ñèìâîëîâ); ïî àäðåñó count àññåìáëåð îòâåä¼ò ìàññèâèç 256 äâóáàéòíûõ ¾ñëîâ¿ (ò. å. 512 ÿ÷ååê), êîòîðûå ìîæíî èñïîëüçîâàòü,íàïðèìåð, äëÿ êàêèõ-íèáóäü ñ÷¼ò÷èêîâ; íàêîíåö, ïî àäðåñó x áóäåò ðàñïîëàãàòüñÿ îäíî ¾äâîéíîå ñëîâî¿, òî åñòü ÷åòûðå áàéòà ïàìÿòè, êîòîðûåìîæíî èñïîëüçîâàòü äëÿ õðàíåíèÿ äîñòàòî÷íî áîëüøîãî öåëîãî ÷èñëà.Äèðåêòèâû âòîðîãî òèïà, íàçûâàåìûå äèðåêòèâàìè çàäàíèÿ èñõîäíûõ äàííûõ , íå ïðîñòî ðåçåðâèðóþò ïàìÿòü, à óêàçûâàþò, êàêèåçíà÷åíèÿ â ýòîé ïàìÿòè äîëæíû íàõîäèòüñÿ ê ìîìåíòó çàïóñêà ïðîãðàììû.
Ñîîòâåòñòâóþùèå çíà÷åíèÿ óêàçûâàþòñÿ ïîñëå äèðåêòèâû ÷åðåç çàïÿòóþ; ïàìÿòè îòâîäèòñÿ ñòîëüêî, ñêîëüêî óêàçàíî çíà÷åíèé. Äëÿ çàäàíèÿ îäíîáàéòîâûõ çíà÷åíèé èñïîëüçóåòñÿ äèðåêòèâà db, äëÿ çàäàíèÿ¾ñëîâ¿ äèðåêòèâà dw è äëÿ çàäàíèÿ ¾äâîéíûõ ñëîâ¿ äèðåêòèâà dd.Íàïðèìåð, ñòðîêàfibondw 1, 1, 2, 3, 5, 8, 13, 21çàðåçåðâèðóåò ïàìÿòü ïîä âîñåìü äâóáàéòíûõ ¾ñëîâ¿ (òî åñòü âñåãî 16áàéò), ïðè÷¼ì â ïåðâûå äâà ¾ñëîâà¿ áóäåò çàíåñåíî ÷èñëî 1, â òðåòüåñëîâî ÷èñëî äâà, â ÷åòâ¼ðòîå ÷èñëî 5 è ò. ä.
Ñ àäðåñîì ïåðâîãî áàéòàîòâåä¼ííîé è çàïîëíåííîé òàêèì îáðàçîì ïàìÿòè áóäåò àññîöèèðîâàíàìåòêà fibon.×èñëà ìîæíî çàäàâàòü íå òîëüêî â äåñÿòè÷íîì âèäå, íî è â øåñòíàäöàòåðè÷íîì, âîñüìåðè÷íîì è äâîè÷íîì. Øåñòíàäöàòåðè÷íîå ÷èñëî â àññåìáëåðå NASM ìîæíî çàäàòü òðåìÿ ñïîñîáàìè: ïðèáàâèâ â êîíöå ÷èñëàáóêâó h (íàïðèìåð, 2af3h), ëèáî íàïèñàâ ïåðåä ÷èñëîì ñèìâîë $ ($2af3),4 Íàïîìíèì, ÷òî òàêàÿ òåðìèíîëîãèÿ íå ñîâñåì êîððåêòíà, ïîñêîëüêó òåðìèíîì¾ñëîâî¿ äîëæíà îáîçíà÷àòüñÿ ïîðöèÿ èíôîðìàöèè, îáðàáàòûâàåìàÿ ïðîöåññîðîì çàîäèí ïðè¼ì; íà÷èíàÿ ñ i386, ðàçìåð ìàøèííîãî ñëîâà íà ýòèõ ïðîöåññîðàõ ñîñòàâëÿë÷åòûðå áàéòà, à íå äâà. Èñïîëüçîâàíèå òåðìèíà word â àññåìáëåðàõ äëÿ îáîçíà÷åíèÿäâóõáàéòîâûõ çíà÷åíèé ïåðåæèòîê òåõ âðåì¼í, êîãäà ìàøèííîå ñëîâî ñîñòàâëÿëîäâà áàéòà.41ëèáî ïîñòàâèâ ïåðåä ÷èñëîì ñèìâîëû 0x, êàê â ÿçûêå Ñè (0x2af3). Ïðèèñïîëüçîâàíèè ñèìâîëà $ íåîáõîäèìî ñëåäèòü, ÷òîáû ñðàçó ïîñëå $ ñòîÿëà öèôðà, à íå áóêâà, òàê ÷òî åñëè ÷èñëî íà÷èíàåòñÿ ñ áóêâû, íåîáõîäèìî äîáàâèòü 0 (íàïðèìåð, $0f9 âìåñòî ïðîñòî $f9).
Àíàëîãè÷íî íóæíîñëåäèòü çà ïåðâûì ñèìâîëîì è ïðè èñïîëüçîâàíèè áóêâû h: íàïðèìåð,a21h àññåìáëåð âîñïðèìåò êàê èäåíòèôèêàòîð, à íå êàê ÷èñëî. ×òîáûèçáåæàòü ïðîáëåìû, ñëåäóåò íàïèñàòü 0a21h. Ñ äðóãîé ñòîðîíû, ñ ÷èñëîì 2fah òàêîé ïðîáëåìû èçíà÷àëüíî íå âîçíèêàåò, ïîñêîëüêó ïåðâûéñèìâîë â åãî çàïèñè ÿâëÿåòñÿ öèôðîé. Âîñüìåðè÷íîå ÷èñëî îáîçíà÷àåòñÿäîáàâëåíèåì ïîñëå ÷èñëà áóêâû o èëè q (íàïðèìåð, 634o, 754q). Íàêîíåö,äâîè÷íîå ÷èñëî îáîçíà÷àåòñÿ áóêâîé b (10011011b).Îòäåëüíîãî óïîìèíàíèÿ çàñëóæèâàþò êîäû ñèìâîëîâ è òåêñòîâûåñòðîêè.
Äëÿ ðàáîòû ñ òåêñòîâûìè äàííûìè êàæäîìó ñèìâîëó ïðèïèñûâàåòñÿ êîä ñèìâîëà íåáîëüøîå öåëîå ïîëîæèòåëüíîå ÷èñëî. Òàáëèöà,ñòàâÿùàÿ êàæäîìó ñèìâîëó â ñîîòâåòñòâèå åãî êîä, íàçûâàåòñÿ êîäèðîâêîé ñèìâîëîâ. Âñå ñîâðåìåííûå êîìïüþòåðíûå ñèñòåìû èñïîëüçóþò êîäèðîâêó ASCII äëÿ ïðåäñòàâëåíèÿ ëàòèíñêèõ áóêâ, à òàêæå öèôð,çíàêîâ ïðåïèíàíèÿ è íåêîòîðûõ äðóãèõ ñèìâîëîâ. Íàïðèìåð, êîä çàãëàâíîé ëàòèíñêîé áóêâû ¾A¿ â êîäèðîâêå ASCII ðàâåí 65, êîä öèôðû ¾0¿(íîëü) ÷èñëî 48, êîä çíàêà ¾+¿ (ïëþñ) 43, à êîä ïðîáåëà 32.
Òåêñòîâûå äàííûå ìîãóò ñîäåðæàòü òàêæå ¾ñïåöèàëüíûå ñèìâîëû¿, êîòîðûåíå îòîáðàæàþòñÿ â âèäå ñèìâîëîâ, à îáîçíà÷àþò ñâîéñòâà òåêñòà; íàïðèìåð, ñèìâîë ñ êîäîì 10 îáîçíà÷àåò ïåðåâîä ñòðîêè, òî åñòü ïðè åãî âûâîäåíà ýêðàí êóðñîð íà ýêðàíå ïåðåéä¼ò íà ñëåäóþùóþ ñòðîêó. ÊîäèðîâêàASCII èñïîëüçóåò ÷èñëà îò 1 äî 127, òàê ÷òî äëÿ õðàíåíèÿ îäíîãî ñèìâîëàîêàçûâàåòñÿ çàâåäîìî äîñòàòî÷íî îäíîé îäíîáàéòîâîé ÿ÷åéêè ïàìÿòè5 .Äëÿ õðàíåíèÿ ñòðîê ñèìâîëîâ îáû÷íî èñïîëüçóþòñÿ ìàññèâû îäíîáàéòîâûõ ÿ÷ååê, â êàæäîé èç êîòîðûõ ñîäåðæèòñÿ êîä î÷åðåäíîãî ñèìâîëà.×òîáû ïðîãðàììèñòó íå íóæíî áûëî çàïîìèíàòü êîäû, ñîîòâåòñòâóþùèå ïå÷àòíûì ñèìâîëàì (áóêâàì, öèôðàì è ò.
ï.), âìåñòî êîäà ìîæíîíàïèñàòü ñàì ñèìâîë, âçÿâ åãî â àïîñòðîôû èëè äâîéíûå êàâû÷êè. Òàê,äèðåêòèâàfig7db '7'5 Îòìåòèì, ÷òî â òàáëèöó ASCII íå âõîäÿò áóêâû íèêàêèõ àëôàâèòîâ, êðîìå ëàòèíñêîãî íè ðóññêèå (êèðèëëè÷åñêèå) áóêâû, íè ãðå÷åñêèå, íè äàæå ëàòèíñêèå áóêâû ñäèàêðèòè÷åñêèìè çíàêàìè, òàêèå êàê íåìåöêàÿ ¾a¿ èëè øâåäñêàÿ a, íå èìåþò ñâîåãîêîäà â ASCII-òàáëèöå. Ê ïðåäñòàâëåíèþ ñèìâîëîâ, íå âîøåäøèõ â ASCII, âîçìîæíîìíîãî ðàçëè÷íûõ ïîäõîäîâ: èíîãäà èõ êîäèðóþò ÷èñëàìè îò 128 äî 255, ÷òî ïîçâîëÿåò ïî-ïðåæíåìó óìåñòèòü êàæäûé ñèìâîë â îäèí áàéò, íî íå ïîçâîëÿåò ñî÷åòàòüíåñêîëüêî ðàçíûõ àëôàâèòîâ (íàïðèìåð, êèðèëëèöà âìåñòå ñ ãðå÷åñêèìè áóêâàìè âîòâåä¼ííîå ïðîñòðàíñòâî êîäîâ íå ïîìåñòÿòñÿ, íå ãîâîðÿ óæå îá èåðîãëèôàõ); èíîãäà(îñîáåííî â ïîñëåäíèå ãîäû) èñïîëüçóþò ìíîãîáàéòíûå êîäèðîâêè, â êîòîðûõ îäèíñèìâîë ìîæåò çàíèìàòü äâà, òðè èëè ÷åòûðå áàéòà.42ðàçìåñòèò â ïàìÿòè áàéò, ñîäåðæàùèé ÷èñëî 55 êîä ñèìâîëà ¾ñåì¼ðêè¿,à àäðåñ ýòîé ÿ÷åéêè ñâÿæåò ñ ìåòêîé fig7.
Ìû ìîæåì íàïèñàòü è ñðàçóöåëóþ ñòðîêó, íàïðèìåð, âîò òàê:welmsgdb 'Welcome to Cyberspace!' ýòîì ñëó÷àå ïî àäðåñó welmsg áóäåò ðàñïîëàãàòüñÿ ñòðîêà èç 16 ñèìâîëîâ (òî åñòü ìàññèâ îäíîáàéòîâûõ ÿ÷ååê, ñîäåðæàùèõ êîäû ñîîòâåòñòâóþùèõ ñèìâîëîâ). Êàê óæå áûëî ñêàçàíî, êàâû÷êè ìîæíî èñïîëüçîâàòüêàê îäèíàðíûå (àïîñòðîôû), òàê è äâîéíûå, òàê ÷òî ñëåäóþùàÿ ñòðîêàïîëíîñòüþ àíàëîãè÷íà ïðåäûäóùåé:welmsgdb "Welcome to Cyberspace!"Âíóòðè äâîéíûõ êàâû÷åê àïîñòðîôû ðàññìàòðèâàþòñÿ êàê îáû÷íûéñèìâîë; òî æå ñàìîå ìîæíî ñêàçàòü è î ñèìâîëå äâîéíûõ êàâû÷åê âíóòðè îäèíàðíûõ. Íàïðèìåð, ôðàçó ¾So I say: "Don't panic!"¿ ìîæíîçàäàòü ñëåäóþùèì îáðàçîì:panicdb 'So I say: "Don', "'", 't panic"'Çäåñü ìû ñíà÷àëà âîñïîëüçîâàëèñü àïîñòðîôîì â êà÷åñòâå ñèìâîëà îäèíàðíûõ êàâû÷åê, òàê ÷òî ñèìâîë äâîéíûõ êàâû÷åê, îáîçíà÷àþùèé ïðÿìóþ ðå÷ü, âîøåë â íàøó ñòðîêó êàê îáû÷íûé ñèìâîë.
Çàòåì, êîãäà íàìâ ñòðîêå ïîòðåáîâàëñÿ àïîñòðîô, ìû çàêðûëè îäèíàðíûå êàâû÷êè è âîñïîëüçîâàëèñü äâîéíûìè, ÷òîáû íàáðàòü ñèìâîë àïîñòðîôà. Íàêîíåö, ìûñíîâà âîñïîëüçîâàëèñü àïîñòðîôàìè, ÷òîáû çàäàòü îñòàòîê íàøåé ôðàçû, âêëþ÷àÿ è çàêàí÷èâàþùèé ïðÿìóþ ðå÷ü ñèìâîë äâîéíûõ êàâû÷åê.Îòìåòèì, ÷òî ñòðîêàìè â îäèíàðíûõ è äâîéíûõ êàâû÷êàõ ìîæíî ïîëüçîâàòüñÿíå òîëüêî ñ äèðåêòèâîé db, íî è ñ äèðåêòèâàìè dw è dd, îäíàêî ïðè ýòîì íåîáõîäèìî ó÷èòûâàòü íåêîòîðûå òîíêîñòè, êîòîðûå ìû ðàññìàòðèâàòü íå áóäåì.Ïðè íàïèñàíèè ïðîãðàìì îáû÷íî äèðåêòèâû çàäàíèÿ èñõîäíûõ äàííûõ ðàñïîëàãàþò â ñåêöèè .data (òî åñòü ïåðåä îïèñàíèåì äàííûõ ñòàâÿòäèðåêòèâó section .data), à äèðåêòèâû ðåçåðâèðîâàíèÿ ïàìÿòè âûäåëÿþò â ñåêöèþ .bss.
Ýòî îáóñëîâëåíî óæå óïîìèíàâøèìñÿ ðàçëè÷èåìâ èõ ïðèðîäå: èíèöèàëèçèðîâàííûå äàííûå íóæíî õðàíèòü â èñïîëíÿåìîì ôàéëå, òîãäà êàê äëÿ íåèíèöèàëèçèðîâàííûõ äîñòàòî÷íî óêàçàòü èõîáùåå êîëè÷åñòâî. Ñåêöèÿ .bss, êàê ìû ïîìíèì, êàê ðàç è îòëè÷àåòñÿîò .data òåì, ÷òî â èñïîëíÿåìîì ôàéëå îò íå¼ õðàíèòñÿ òîëüêî óêàçàíèå ðàçìåðà; èíà÷å ãîâîðÿ, ðàçìåð èñïîëíÿåìîãî ôàéëà íå çàâèñèò îòðàçìåðà ñåêöèè .bss. Òàê, åñëè ìû äîáàâèì â ñåêöèþ .data äèðåêòèâódb "This is a string"òî ðàçìåð èñïîëíÿåìîãî ôàéëà óâåëè÷èòñÿ íà 16 áàéò (íàäî æå ãäå-òîõðàíèòü ñòðîêó "This is a string"), òîãäà êàê åñëè ìû äîáàâèì â ñåêöèþ .bss äèðåêòèâó43resd 16ðàçìåð èñïîëíÿåìîãî ôàéëà âîîáùå íèêàê íå èçìåíèòñÿ, íåñìîòðÿ íà òî,÷òî ïàìÿòè âûäåëÿåòñÿ ðîâíî ñòîëüêî æå.Ðàñïîëîæèòü äèðåêòèâû çàäàíèÿ èñõîäíûõ äàííûõ ìû ìîæåì è â ñåêöèè êîäà(ñåêöèè .text), íóæíî òîëüêî ïîìíèòü, ÷òî òîãäà ýòè äàííûå íåëüçÿ áóäåò èçìåíèòü âî âðåìÿ ðàáîòû ïðîãðàììû.