А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 41
Текст из файла (страница 41)
6.2. Ðàçðÿäû ðåãèñòðîâ CR, SR è TWfclex èç ïðåäûäóùåãî ïàðàãðàôà: ýòî îáîçíà÷åíèå ñîîòâåòñòâóåò ìàøèííûì êîìàíäàì wait è fnclex. 6.7.3. Ðåãèñòðû CR, SR è TWÊàê óæå ãîâîðèëîñü, óïðàâëåíèå ðåæèìîì ðàáîòû ñîïðîöåññîðà îñóùåñòâëÿåòñÿ óñòàíîâêîé ñîäåðæèìîãî ðåãèñòðà CR (Control Register ), à ïîðåçóëüòàòàì âûïîëíåíèÿ îïåðàöèé ïðîöåññîð óñòàíàâëèâàåò ñîäåðæèìîåðåãèñòðà SR (Status Register ), êîòîðîå ìîæíî ïðîàíàëèçèðîâàòü.
Íàêîíåö,òåêóùåå ñîñòîÿíèå ðåãèñòðîâ, ñîñòàâëÿþùèõ ñòåê, îòðàæåíî â ðåãèñòðåTW (Tag Word ). Íàçíà÷åíèå ðàçðÿäîâ, ñîñòàâëÿþùèõ ðåãèñòð óïðàâëåíèÿ CR, ðåãèñòð ñîñòîÿíèÿ SR è ðåãèñòð ìåòîê TW, ïîêàçàíî íà ðèñ. 6.2.Áîëüøàÿ ÷àñòü ýòèõ ðàçðÿäîâ íàì óæå èçâåñòíà; òàê, ìëàäøèå øåñòü áèòâ ðåãèñòðàõ CR è SR ïðåäñòàâëÿþò ñîáîé ñîîòâåòñòâåííî ìàñêè è ôëàãè äëÿ øåñòè òèïîâ èñêëþ÷èòåëüíûõ ñèòóàöèé (ñì. 6.7.1). Áèòû IC èIEM ðåãèñòðà CR â ñîâðåìåííûõ ïðîöåññîðàõ íå èñïîëüçóþòñÿ.
Áèòû RC(Rounding Control ) óïðàâëÿþò ðåæèìîì îêðóãëåíèÿ: 00 ê áëèæàéøåìó÷èñëó, 01 â ñòîðîíó óìåíüøåíèÿ, 10 â ñòîðîíó óâåëè÷åíèÿ, 11 âñòîðîíó íóëÿ. Áèòû PC (Precision Control ) çàäàþò òî÷íîñòü âûïîëíÿåìûõîïåðàöèé: 00 32-áèòíûå ÷èñëà, 10 64-áèòíûå ÷èñëà, 11 80-áèòíûå÷èñëà (ïî óìîë÷àíèþ èñïîëüçóåòñÿ èìåííî ýòîò ðåæèì, è íåîáõîäèìîñòüåãî èçìåíèòü âîçíèêàåò êðàéíå ðåäêî). ðåãèñòðå SR ôëàãè C3, C2 è C0 îáû÷íî èñïîëüçóþòñÿ êàê ïðèçíàêðåçóëüòàòà îïåðàöèè ñðàâíåíèÿ (ñì. 6.6); ôëàã C1 îáû÷íî íå èñïîëüçóåòñÿ; ôëàã SF óêàçûâàåò íà ïðîèñøåäøóþ îøèáêó ñòåêà. Ôëàã IR (InterruptRequest ) óêàçûâàåò íà âîçíèêíîâåíèå íåçàìàñêèðîâàííîé èñêëþ÷èòåëüíîé ñèòóàöèè, â ðåçóëüòàòå ÷åãî èíèöèèðîâàíî âíóòðåííåå ïðåðûâàíèå;óâèäåòü ýòîò ôëàã óñòàíîâëåííûì ìîæíî òîëüêî â îáðàáîò÷èêå ïðåðûâàíèÿ âíóòðè îïåðàöèîííîé ñèñòåìû, òàê ÷òî íàñ îí íå êàñàåòñÿ.
Çíà÷å179íèå TOP, êàê óæå ãîâîðèëîñü, çàäà¼ò òåêóùóþ ïîçèöèþ âåðøèíû ñòåêà(ñì. 6.2). Íàêîíåö, áèò B (Busy ) îçíà÷àåò, ÷òî ñîïðîöåññîð â íàñòîÿùèéìîìåíò çàíÿò àñèíõðîííûì âûïîëíåíèåì êîìàíäû. Íàäî ñêàçàòü, ÷òî âñîâðåìåííûõ ïðîöåññîðàõ ýòîò áèò òîæå íåâîçìîæíî óâèäåòü óñòàíîâëåííûì èíà÷å êàê â îáðàáîò÷èêå ïðåðûâàíèÿ.Ðåãèñòð TW ìû óæå ðàññìàòðèâàëè íà ñòð. 170.Äëÿ ðàáîòû ñ ðåãèñòðîì CR ïðåäóñìîòðåíû êîìàíäû fstcw, fnstcw èfldcw.
Êîìàíäà fstcw, êàê îáû÷íî, îçíà÷àåò äâå ìàøèííûå èíñòðóêöèèwait è fnstcw. Âñå òðè êîìàíäû èìåþò îäèí îïåðàíä, â êà÷åñòâå êîòîðîãîìîæåò âûñòóïàòü òîëüêî îïåðàíä òèïà ¾ïàìÿòü¿ ðàçìåðîì word. Ïåðâûåäâå êîìàíäû çàïèñûâàþò ñîäåðæèìîå ðåãèñòðà CR â çàäàííîå ìåñòî âïàìÿòè, ïîñëåäíÿÿ êîìàíäà, íàîáîðîò, çàãðóæàåò ñîäåðæèìîå ðåãèñòðàCR èç ïàìÿòè. Íàïðèìåð, ñëåäóþùèìè êîìàíäàìè ìû ìîæåì óñòàíîâèòüðåæèì îêðóãëåíèÿ ¾â ñòîðîíó íóëÿ¿ âìåñòî èñïîëüçóåìîãî ïî óìîë÷àíèþðåæèìà ¾ê áëèæàéøåìó¿:sub esp, 2; âûäåëÿåì ïàìÿòü â ñòåêåfstcw [esp]; ïîëó÷àåì â íå¼ ñîäåðæèìîå CRor word [esp], 0000110000000000b; ïðèíóäèòåëüíî óñòàíàâëèâàåì áèòû 11 è 10fldcw [esp]; çàãðóæàåì ïîëó÷åííîå îáðàòíî â CRadd esp, 2; îñâîáîæäàåì ïàìÿòüÑîäåðæèìîå ðåãèñòðà SR ìîæíî ïîëó÷èòü óæå çíàêîìîé íàì êîìàíäîé fstsw, îïåðàíä êîòîðîé ìîæåò áûòü ëèáî ðåãèñòðîì AX (è áîëüøåíèêàêèì), ëèáî òèïà ¾ïàìÿòü¿ ðàçìåðîì word.
Èìååòñÿ òàêæå êîìàíäà fnstsw, ïðè÷¼ì fstsw ïðåäñòàâëÿåò ñîáîé îáîçíà÷åíèå äëÿ äâóõ ìàøèííûõ èíñòðóêöèé wait è fnstsw. Îòìåòèì, ÷òî îáðàòíàÿ îïåðàöèÿ(çàãðóçêà çíà÷åíèÿ) äëÿ SR íå ïðåäóñìîòðåíà, ÷òî âïîëíå ëîãè÷íî: ýòîòðåãèñòð íóæåí, ÷òîáû àíàëèçèðîâàòü ïðîèñõîäÿùåå. Òåì íå ìåíåå, íåêîòîðûå êîìàíäû âîçäåéñòâóþò íà ýòîò ðåãèñòð íàïðÿìóþ.
Òàê, çíà÷åíèåTOP ìîæíî óâåëè÷èòü íà åäèíèöó êîìàíäîé fincstp è óìåíüøèòü íàåäèíèöó êîìàíäîé fdecstp (îáå êîìàíäû íå èìåþò îïåðàíäîâ). Èñïîëüçîâàòü ýòè êîìàíäû ñëåäóåò îñòîðîæíî, ïîñêîëüêó ñòàòóñ ¾çàíÿòîñòè¿ðåãèñòðîâ ñòåêà îíè íå ìåíÿþò; èíà÷å ãîâîðÿ, fdecstp ïðèâîäèò ê òîìó,÷òî ðåãèñòðîì ST0 ñòàíîâèòñÿ ¾ïóñòîé¿ ðåãèñòð, à fincstp ïðèâîäèò ê òîìó, ÷òî ST7 îêàçûâàåòñÿ ¾çàíÿò¿ (ïîñêîëüêó ýòî áûâøèé ST0). Åù¼ îäíîàêòèâíîå äåéñòâèå ñ ðåãèñòðîì SR, êîòîðîå ìîæåò âûïîëíèòü ïðîãðàììèñò ýòî î÷èñòêà ôëàãîâ èñêëþ÷èòåëüíûõ ñèòóàöèé.
Òàêàÿ î÷èñòêàïðîèçâîäèòñÿ êîìàíäàìè fclex (Clear Exceptions ) è fnclex, êîòîðûå ìûóæå óïîìèíàëè â ïðåäûäóùåì ïàðàãðàôå.Ïåðåä êîìàíäîé fldcw ðåêîìåíäóåòñÿ âñåãäà âûïîëíÿòü êîìàíäó fclex, èíà÷åìîæåò ñëó÷èòüñÿ òàê, ÷òî çàïèñü ðåãèñòðà CR ¾äåìàñêèðóåò¿ êàêîå-íèáóäü èç èñêëþ÷åíèé, ôëàã êîòîðîãî óæå âçâåä¼í, â ðåçóëüòàòå ÷åãî ïðîèçîéä¼ò ïðåðûâàíèå.180Ðåãèñòð TW íå ìîæåò áûòü íàïðÿìóþ íè ñ÷èòàí, íè çàïèñàí, íî îäíàêîìàíäà, íàïðÿìóþ âîçäåéñòâóþùàÿ íà íåãî, âñ¼ æå åñòü.
Îíà íàçûâàåòñÿ ffree, èìååò îäèí îïåðàíä ðåãèñòð STn, à å¼ äåéñòâèå ïîìåòèòüçàäàííûé ðåãèñòð êàê ¾ñâîáîäíûé¿ (èëè ¾ïóñòîé¿).  ÷àñòíîñòè, ñëåäóþùèå êîìàíäû óáèðàþò ÷èñëî ñ âåðøèíû ñòåêà ¾â íèêóäà¿:ffree st0fincstp 6.7.4. Èíèöèàëèçàöèÿ, ñîõðàíåíèå è âîññòàíîâëåíèåÅñëè íà ìîìåíò íà÷àëà âû÷èñëåíèé âàì íå èçâåñòíî (èëè âûçûâàåò ñîìíåíèÿ) ñîñòîÿíèå àðèôìåòè÷åñêîãî ñîïðîöåññîðà, íî ïðè ýòîì âûòî÷íî çíàåòå, ÷òî íèêàêîé ïîëåçíîé äëÿ âàñ èíôîðìàöèè åãî ðåãèñòðûíå ñîäåðæàò, ìîæíî ïðèâåñòè åãî ¾â èñõîäíîå ñîñòîÿíèå¿ ñ ïîìîùüþêîìàíäû finit èëè fninit (finit ïðåäñòàâëÿåò ñîáîé îáîçíà÷åíèå äëÿwait fninit, ñì.
6.7.2). Ïðè ýòîì â ðåãèñòð CR çàíîñèòñÿ çíà÷åíèå 037Fh(îêðóãëåíèå â áëèæíþþ ñòîðîíó, íàèáîëüøàÿ âîçìîæíàÿ òî÷íîñòü, âñåèñêëþ÷åíèÿ çàìàñêèðîâàíû); ðåãèñòð SR îáíóëÿåòñÿ, ÷òî îçíà÷àåò TOP=0,âñå ôëàãè ñáðîøåíû, âêëþ÷àÿ ôëàãè èñêëþ÷èòåëüíûõ ñèòóàöèé; ðåãèñòðû FIP, FDP, TW òàêæå îáíóëÿþòñÿ; ðåãèñòðû, ñîñòàâëÿþùèå ñòåê, íèêàêíå èçìåíÿþòñÿ, íî ïîñêîëüêó TW îáíóë¼í, âñå îíè ñ÷èòàþòñÿ ñâîáîäíûìè(íå ñîäåðæàùèìè ÷èñåë).Ñ ïîìîùüþ êîìàíäû fsave ìîæíî ñîõðàíèòü âñ¼ ñîñòîÿíèå ñîïðîöåññîðà, òî åñòü ñîäåðæèìîå âñåõ åãî ðåãèñòðîâ, â îáëàñòè ïàìÿòè, ÷òîáûïîòîì âîññòàíîâèòü åãî.
Ýòî ïîëåçíî, åñëè íóæíî âðåìåííî ïðåêðàòèòüíåêèé âû÷èñëèòåëüíûé ïðîöåññ, âûïîëíèòü êàêèå-òî âñïîìîãàòåëüíûåâû÷èñëåíèÿ, çàòåì âåðíóòüñÿ ê îòëîæåííîìó ïðîöåññó âû÷èñëåíèé. Äëÿñîõðàíåíèÿ âàì ïîòðåáóåòñÿ îáëàñòü ïàìÿòè äëèíîé 108 áàéò; êîìàíäàfsave èìååò îäèí îïåðàíä, ýòî îïåðàíä òèïà ¾ïàìÿòü¿, ïðè÷¼ì óêàçûâàòü åãî ðàçìåð íå íóæíî. Ìíåìîíèêà fsave íà ñàìîì äåëå îáîçíà÷àåòäâå ìàøèííûå êîìàíäû wait è fnsave. Ïîñëå ñîõðàíåíèÿ ñîñòîÿíèÿâ ïàìÿòè ñîïðîöåññîð ïðèâîäèòñÿ ¾â èñõîäíîå ñîñòîÿíèå¿ òî÷íî òàê æå,êàê ïðè êîìàíäå finit (ñì. âûøå), òàê ÷òî ïîñëå fsave îòäåëüíî äàâàòüêîìàíäó finit íå íóæíî.
Âîññòàíîâèòü ñîõðàí¼ííîå ðàíåå ñîñòîÿíèå ñîïðîöåññîðà ìîæíî êîìàíäîé frstor; êàê è fsave, ýòà êîìàíäà èìååò îäèíîïåðàíä òèïà ¾ïàìÿòü¿, äëÿ êîòîðîãî íå íóæíî óêàçûâàòü ðàçìåð, ïîñêîëüêó èñïîëüçóåòñÿ îáëàñòü ïàìÿòè ðàçìåðîì 108 áàéò.Èíîãäà âîçíèêàåò ïîòðåáíîñòü ñîõðàíèòü èëè âîññòàíîâèòü òîëüêî âñïîìîãàòåëüíûå ðåãèñòðû ñîïðîöåññîðà.
Ýòî äåëàåòñÿ êîìàíäàìè fsetenv, fnsetenv èfldenv ñ èñïîëüçîâàíèåì îáëàñòè ïàìÿòè äëèíîé 28 áàéò; ïîäðîáíîå îïèñàíèåýòèõ êîìàíä îñòàâëÿåì çà ðàìêàìè ïîñîáèÿ. çàâåðøåíèå ðàçãîâîðà î ñîïðîöåññîðå óïîìÿíåì êîìàíäó fnop. Êàêìîæíî äîãàäàòüñÿ, ýòî î÷åíü âàæíàÿ êîìàíäà: îíà íå äåëàåò íè÷åãî.181Ïðèëîæåíèå: òåêñò ôàéëàstud_io.incÂåðñèÿ äëÿ ÎÑ Linux;; system dependend part ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; generic 3-param syscall%macro _syscall_3 4push edxpush ecxpush ebxpush %1push %2push %3push %4pop edxpop ecxpop ebxpop eaxint 0x80pop ebxpop ecxpop edx%endmacro; syscall_exit is the only syscall we use that has 1 parameter%macro _syscall_exit 1mov ebx, %1; exit codemov eax, 1; 1 = sys_exitint 0x80%endmacro;; system dependent part ends here ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %1: descriptor%2: buffer addr; output: eax: read bytes%macro _syscall_read 3_syscall_3 3,%1,%2,%3%endmacro%3: buffer length; %1: descriptor%2: buffer addr; output: eax: written bytes%macro _syscall_write 3_syscall_3 4,%1,%2,%3%endmacro%3: buffer length%macroPRINT 1pushapushfjmp %%astr182%%str db%1, 0%%strln equ$-%%str%%astr: _syscall_write 1, %%str, %%strlnpopfpopa%endmacro%macroPUTCHAR 1pushapushf%ifstr %1moval, %1%elifnum %1moval, %1%elifidni %1,alnop%elifidni %1,ahmoval, ah%elifidni %1,blmoval, bl%elifidni %1,bhmoval, bh%elifidni %1,clmoval, cl%elifidni %1,chmoval, ch%elifidni %1,dlmoval, dl%elifidni %1,dhmoval, dh%elsemoval, %1 ; memory location such as [var]%endifsubesp, 2 ; reserve memory for buffermovedi, espmov[edi], al_syscall_write 1, edi, 1addesp, 2popfpopa%endmacro%macroGETCHARpushfpushsubmov0ediesp, 2edi, esp183_syscall_read 0, edi, 1cmpeax, 1jne%%eof_reachedxoreax,eaxmoval, [edi]jmp%%gcquit%%eof_reached:xoreax, eaxnoteax; eax := -1%%gcquit:addesp, 2popedipopf%endmacro%macro FINISH 0-1 0_syscall_exit %1%endmacroÂåðñèÿ äëÿ FreeBSDÝòà âåðñèÿ îòëè÷àåòñÿ îò ïðåäûäóùåé òîëüêî îïðåäåëåíèåì ìàêðîñîâè _syscall_exit, ïîýòîìó öåëèêîì ìû å¼ íå ïðèâîäèì.
×òîáû ïîëó÷èòü ðàáî÷èé ôàéë äëÿ ÎÑ FreeBSD, âîçüìèòå âûøåïðèâåä¼ííûé òåêñò äëÿÎÑ Linux è çàìåíèòå îïðåäåëåíèÿ ýòèõ ìàêðîñîâ íà ñëåäóþùèå:_syscall3;; freebsd-specific things ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%macro _syscall_3 4push%4push%3push%2moveax, %1pusheaxint0x80jnc%%oknegeax%%ok: addesp, 16%endmacro%macro _syscall_exit 1push%1; exit codemoveax, 1 ; 1 = sys_exitpusheaxint0x80; no cleanup - this will never return anyway%endmacro;; system dependent part ends here ;;;;;;;;;;;;;;;;;;;;;;;;;;;;184Ëèòåðàòóðà[1] Ý. Òàííåíáàóì.