<HTML> <HEAD><TITLE>Äîêóìåíòàöèÿ íà C--</TITLE></HEAD> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td width="1"></td> <td width="1"></td> <td width="100%"> <div align="center"> <center> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr><td bgcolor="#000000"><img src="images/-.gif" width="1" height="1"></td></tr> <tr><td><img src="images/-.gif" width="1" height="1"></td></tr> <tr><td bgcolor="#000000"><img src="images/-.gif" width="1" height="1"></td></tr> <tr><td align="middle" bgcolor="#008080"> <font color="#FFFFFF" face="Times New Roman" size=3> <strong><em>Äîêóìåíòàöèÿ íà C--.</em></strong></font> </td></tr> <tr><td bgcolor="#000000"><img src="images/-.gif" width="1" height="1"></td></tr> <tr><td><img src="images/-.gif" width="1" height="1"></td></tr> <tr><td bgcolor="#000000"><img src="images/-.gif" width="1" height="1"></td></tr> <td width="100%"> <BODY LINK="#0000ff" VLINK="#800080" background="images/sphinx6.jpg" bgproperties="fixed"> <A name=contents> <p align="center"><font color="#F000F0" face="Times New Roman" size=5><strong> Ñîäåðæàíèå. </strong></font></p></a> <pre> <B><FONT FACE="Courier" COLOR="#ff0000"> <A href="#intro" style="TEXT-DECORATION: none">1 Ââåäåíèå. 1.1 Èñòîðèÿ ñîçäàíèÿ è ðàçâèòèÿ.</A> <A href="#1.2" style="TEXT-DECORATION: none">1.2 ×òî òàêîå C--?</a> <A href="#1.3" style="TEXT-DECORATION: none">1.3 Êàê óñòàíîâèòü C--.</a> <A name=contents2> <A href="#2.1" style="TEXT-DECORATION: none">2. Óïðàâëåíèå êîìïèëÿöèåé. 2.1 Ïàðàìåòðû êîìàíäíîé ñòðîêè êîìïèëÿòîðà C--.</a> <A href="#2.1.1" style="TEXT-DECORATION: none">2.1.1 /ON - Îïòèìèçàöèÿ ÷èñëîâûõ âûðàæåíèé.</a> <A href="#2.1.2" style="TEXT-DECORATION: none">2.1.2 /DE - Âðåìåííîå ðàñøèðåíèå ðàçðÿäíîñòè ïåðåìåííîé.</a> <A href="#2.1.3" style="TEXT-DECORATION: none">2.1.3 /ARGC - Àëüòåðíàòèâíûé îáðàáîò÷èê êîìàíäíîé ñòðîêè.</a> <A href="#2.1.4" style="TEXT-DECORATION: none">2.1.4 /OST - ñëèÿíèå îäèíàêîâûõ ñòðîêîâûõ êîíñòàíò.</a> <A href="#2.1.5" style="TEXT-DECORATION: none">2.1.5 /D - óñòàíîâêà èäåíòèôèêàòîðà â TRUE èç êîìàíäíîé ñòðîêè.</a> <A href="#2.1.6" style="TEXT-DECORATION: none">2.1.6 /IA - óïðîùåííûé ââîä àññåìáëåðíûõ èíñòðóêöèé.</a> <A href="#2.1.7" style="TEXT-DECORATION: none">2.1.7 /CRI - ïðîïóñê ïîâòîðíî âêëþ÷àåìîãî ôàéëà.</a> <A href="#2.1.8" style="TEXT-DECORATION: none">2.1.8 /IND - èìïîðò èìåí ïðîöåäóð èç DLL.</a> <A href="#2.1.9" style="TEXT-DECORATION: none">2.1.9 /WS - çàäàòü èìÿ stub ôàéëà äëÿ ïðîãðàìì ïîä windows.</a> <A href="#2.1.10" style="TEXT-DECORATION: none">2.1.10 /WBSS - ðàçìåñòèòü íå èíèöèàëèçèðîâàííûå äàííûå â îòäåëüíîé ñåêöèè.</a> <A href="#2.1.11" style="TEXT-DECORATION: none">2.1.11 /DBG - ñîçäàíèå îòëàäî÷íîé èíôîðìàöèè.</a> <A href="#2.1.12" style="TEXT-DECORATION: none">2.1.12 /J0 /J1 /J2.</a> <A href="#2.1.13" style="TEXT-DECORATION: none">2.1.13 /LST - Ñîçäàíèå àññåìáëåðíîãî ëèñòèíãà.</a> <A href="#2.1.14" style="TEXT-DECORATION: none">2.1.14 /ENV - Ñîõðàíåíèå àäðåñà ïåðåìåííûõ îêðóæåíèÿ.</a> <A href="#2.1.15" style="TEXT-DECORATION: none">2.1.15 /CPA - Î÷èñòêà post-îáëàñòè äàííûõ.</a> <A href="#2.1.16" style="TEXT-DECORATION: none">2.1.16 /W - âûâîä ïðåäóïðåæäåíèé.</a> <A href="#2.1.17" style="TEXT-DECORATION: none">2.1.17 /NW - Âûáîðî÷íîå îòêëþ÷åíèå òèïîâ ïðåäóïðåæäåíèé.</a> <A href="#2.1.18" style="TEXT-DECORATION: none">2.1.18 /WSI - êîðîòêàÿ òàáëèöà èìïîðòà.</a> <A href="#2.2" style="TEXT-DECORATION: none">2.2 Äèðåêòèâû òðàíñëÿòîðà.</a> <A href="#2.2.1" style="TEXT-DECORATION: none">2.2.1 ?ifdef/?ifndef</a> <A href="#2.2.2" style="TEXT-DECORATION: none">2.2.2 ?initallvar</a> <A href="#2.2.3" style="TEXT-DECORATION: none">2.2.3 ?usestartup</a> <A href="#2.2.4" style="TEXT-DECORATION: none">2.2.4 ?startusevar</a> <A href="#2.2.5" style="TEXT-DECORATION: none">2.2.5 ?atexit</a> <A href="#2.2.6" style="TEXT-DECORATION: none">2.2.6 ?startuptomain</a> <A href="#2.2.7" style="TEXT-DECORATION: none">2.2.7 ?undef</a> <A href="#2.2.8" style="TEXT-DECORATION: none">2.2.8 ?align è ?aligncode</a> <A href="#2.2.9" style="TEXT-DECORATION: none">2.2.9 ?pragma</a> <A name=contents3> <A href="#3.1" style="TEXT-DECORATION: none">3. Êîíñòàíòû. 3.1 ×èñëîâûå êîíñòàíòû.</a> <A href="#3.2" style="TEXT-DECORATION: none">3.2 Ñèìâîëüíûå êîíñòàíòû.</a> <A href="#3.3" style="TEXT-DECORATION: none">3.3 Ñòðîêîâûå êîíñòàíòû.</a> <A href="#3.4" style="TEXT-DECORATION: none">3.4 Ïîñòîÿííûå âûðàæåíèÿ.</a> <A name=contents4> <A href="#4.1" style="TEXT-DECORATION: none">4. Âûðàæåíèÿ. 4.1 Òèïû âûðàæåíèé.</a> <A href="#4.2" style="TEXT-DECORATION: none">4.2 Âûðàæåíèÿ òèïà EAX/AX/AL.</a> <A href="#4.3" style="TEXT-DECORATION: none">4.3 Âûðàæåíèÿ èñïîëüçóþùèå ïîëó÷àòåëü ïðè âû÷èñëåíèè âûðàæåíèÿ.</a> <A href="#4.4" style="TEXT-DECORATION: none">4.4 Íå - EAX/AX/AL âûðàæåíèÿ.</a> <A href="#4.5" style="TEXT-DECORATION: none">4.5 Óñëîâíûå âûðàæåíèÿ.</a> <A href="#4.5.1" style="TEXT-DECORATION: none">4.5.1 Ïðîñòûå óñëîâíûå âûðàæåíèÿ.</a> <A href="#4.5.2" style="TEXT-DECORATION: none">4.5.2 Ñëîæíûå óñëîâíûå âûðàæåíèÿ.</a> <A href="#4.6" style="TEXT-DECORATION: none">4.6 Èçìåíåíèå òèïà âûðàæåíèÿ ïðè ïðèñâàèâàíèè.</a> <A href="#4.7" style="TEXT-DECORATION: none">4.7 Âû÷èñëåíèå â ðåãèñòðû EAX/AX/AL ñî çíàêîì.</a> <A name=contents5> <A href="#5.1" style="TEXT-DECORATION: none">5. Èäåíòèôèêàòîðû. 5.1 Ôîðìàò èäåíòèôèêàòîðà.</a> <A href="#5.2" style="TEXT-DECORATION: none">5.2 Çàðåçåðâèðîâàííûå èäåíòèôèêàòîðû.</a> <A href="#5.3" style="TEXT-DECORATION: none">5.3 Óíèâåðñàëüíûå ðåãèñòðû äëÿ 16 è 32-áèòíîãî ðåæèìà.</a> <A href="#5.4" style="TEXT-DECORATION: none">5.4 Ïðåäîïðåäåëåííûå èäåíòèôèêàòîðû.</a> <A name=contents6> <A href="#6.1" style="TEXT-DECORATION: none">6. Ïåðåìåííûå. 6.1 Òèïû ïåðåìåííûõ.</a> <A href="#6.2" style="TEXT-DECORATION: none">6.2 Îáúÿâëåíèå ïåðåìåííûõ.</a> <A href="#6.3" style="TEXT-DECORATION: none">6.3 Ãëîáàëüíûå ïåðåìåííûå.</a> <A href="#6.4" style="TEXT-DECORATION: none">6.4 Ëîêàëüíûå ïåðåìåííûå.</a> <A href="#6.5" style="TEXT-DECORATION: none">6.5 Äèíàìè÷åñêèå ïåðåìåííûå è ñòðóêòóðû.</a> <A href="#6.6" style="TEXT-DECORATION: none">6.6 Ïðèñâàèâàíèå îäíîãî çíà÷åíèÿ íåñêîëüêèì ïåðåìåííûì.</a> <A href="#6.7.1" style="TEXT-DECORATION: none">6.7 Ïåðåìåííûå òèïà float. 6.7.1 Ôîðìàò ïåðåìåííûõ òèïà float.</a> <A href="#6.7.2" style="TEXT-DECORATION: none">6.7.2 Êîíñòàíòû ñ ïëàâàþùåé òî÷êîé.</a> <A href="#6.7.3" style="TEXT-DECORATION: none">6.7.3 Äèàïàçîí äîïóñòèìûõ çíà÷åíèé.</a> <A href="#6.7.4" style="TEXT-DECORATION: none">6.7.4 Ìàòåìàòè÷åñêèå îïåðàöèè.</a> <A href="#6.7.5" style="TEXT-DECORATION: none">6.7.5 Ïðåîáðàçîâàíèÿ òèïîâ.</a> <A href="#6.7.6" style="TEXT-DECORATION: none">6.7.6 Îïåðàöèè ñðàâíåíèÿ.</a> <A href="#6.7.7" style="TEXT-DECORATION: none">6.7.7 Ñðàâíåíèå ïåðåìåííûõ òèïà float ñ 32-áèòíûì ðåãèñòðîì.</a> <A href="#6.8" style="TEXT-DECORATION: none">6.8 Óêàçàòåëè.</a> <A name=contents7> <A href="#7.1" style="TEXT-DECORATION: none">7. Àäðåñàöèÿ. 7.1 Îòíîñèòåëüíàÿ àäðåñàöèÿ.</a> <A href="#7.2" style="TEXT-DECORATION: none">7.2 Àáñîëþòíàÿ àäðåñàöèÿ.</a> <A name=contents8> <A href="#8.1.1" style="TEXT-DECORATION: none">8. Ðàáîòà ñ áëîêàìè äàííûõ. 8.1 Ñòðóêòóðû. 8.1.1 ×òî òàêîå ñòðóêòóðû.</a> <A href="#8.1.2" style="TEXT-DECORATION: none">8.1.2 Ñèíòàêñèñ.</a> <A href="#8.1.3" style="TEXT-DECORATION: none">8.1.3 Èíèöèàëèçàöèÿ ñòðóêòóð ïðè îáúÿâëåíèè.</a> <A href="#8.1.4" style="TEXT-DECORATION: none">8.1.4 Èíèöèàëèçàöèÿ ñòðóêòóðû ïðè âûïîëíåíèè ïðîãðàììû.</a> <A href="#8.1.5" style="TEXT-DECORATION: none">8.1.5 Îïåðàöèè ñ ýëåìåíòàìè ñòðóêòóð.</a> <A href="#8.1.6" style="TEXT-DECORATION: none">8.1.6 Âëîæåííûå ñòðóêòóðû.</a> <A href="#8.1.7" style="TEXT-DECORATION: none">8.1.7 Îòîáðàæåíèå òåãà ñòðóêòóðû íà áëîê ïàìÿòè.</a> <A href="#8.1.8" style="TEXT-DECORATION: none">8.1.8 Áèòîâûå ïîëÿ ñòðóêòóð.</a> <A href="#8.2" style="TEXT-DECORATION: none">8.2 Îáúåäèíåíèÿ.</a> <A href="#8.3" style="TEXT-DECORATION: none">8.3 Êîìàíäû FROM è EXTRACT.</a> <A name=contents9> <A href="#9.1" style="TEXT-DECORATION: none">9. Îïåðàòîðû. 9.1 Óñëîâíûå èíñòðóêöèè.</a> <A href="#9.2" style="TEXT-DECORATION: none">9.2 Öèêëû do{} while.</a> <A href="#9.3" style="TEXT-DECORATION: none">9.3 Öèêëû loop, LOOPNZ, loopnz.</a> <A href="#9.4" style="TEXT-DECORATION: none">9.4 Öèêë while, WHILE.</a> <A href="#9.5" style="TEXT-DECORATION: none">9.5 Öèêë for, FOR.</a> <A href="#9.6" style="TEXT-DECORATION: none">9.6 Îïåðàòîð ïåðåêëþ÷àòåëü switch.</a> <A href="#9.7" style="TEXT-DECORATION: none">9.7 Îïåðàòîð ïåðåõîäà goto, GOTO.</a> <A href="#9.8" style="TEXT-DECORATION: none">9.8 Îïåðàòîð ðàçðûâà break, BREAK.</a> <A href="#9.9" style="TEXT-DECORATION: none">9.9 Îïåðàòîð ïðîäîëæåíèÿ continue, CONTINUE.</a> <A href="#9.10" style="TEXT-DECORATION: none">9.10 Ëîãè÷åñêîå îáúåäèíåíèå óñëîâèé.</a> <A href="#9.11" style="TEXT-DECORATION: none">9.11 Ïåðåõîä ÷åðåç öèêëû.</a> <A href="#9.12" style="TEXT-DECORATION: none">9.12 Èíâåðòèðîâàíèå ôëàãà ïðîâåðêè óñëîâèé.</a> <A href="#9.13" style="TEXT-DECORATION: none">9.13 Âû÷èñëåíèå âûðàæåíèÿ, à çàòåì ïðîâåðêà óñëîâèÿ.</a> <A href="#9.14" style="TEXT-DECORATION: none">9.14 Ïðîâåðêà áèòîâ ïðè îïåðàöèè ñðàâíåíèÿ.</a> <A href="#9.15" style="TEXT-DECORATION: none">9.15 Îïåðàòîð ïåðåñòàíîâêè.</a> <A href="#9.16" style="TEXT-DECORATION: none">9.16 Îïåðàòîð îòðèöàíèÿ.</a> <A href="#9.17" style="TEXT-DECORATION: none">9.17 Îïåðàòîð èíâåðñèè.</a> <A href="#9.18" style="TEXT-DECORATION: none">9.18 Ñïåöèàëüíûå óñëîâíûå âûðàæåíèÿ.</a> <A href="#9.19" style="TEXT-DECORATION: none">9.19 Ñèìâîë $ - âñòàâëÿåò òåêóùèé àäðåñ ïðîãðàììû.</a> <A href="#9.20" style="TEXT-DECORATION: none">9.20 Êëþ÷åâîå ñëîâî static è îïåðàòîð ::.</a> <A href="#9.21" style="TEXT-DECORATION: none">9.21 Îïåðàòîð sizeof.</a> <A href="#9.22" style="TEXT-DECORATION: none">9.22 Ìåòêè ïåðåõîäà.</a> <A name=contents10> <A href="#10.1" style="TEXT-DECORATION: none">10. Àññåìáëåð. 10.1 Ïîääåðæêà êîìàíä àññåìáëåðà.</a> <A href="#10.2" style="TEXT-DECORATION: none">10.2 Êëþ÷åâîå ñëîâî asm.</a> <A href="#10.3" style="TEXT-DECORATION: none">10.3 Ïðåôèêñ dup - ïîâòîðåíèå èíñòðóêöèé DB/DW/DD.</a> <A href="#10.4" style="TEXT-DECORATION: none">10.4 Èíñòðóêöèè ïðîöåññîðà Pentium III.</a> <A name=contents11> <A href="#11.1" style="TEXT-DECORATION: none">11. Ïðîöåäóðû. 11.1 Òèïû ïðîöåäóð, ôóíêöèé è ìàêðîêîìàíä.</a> <A href="#11.2" style="TEXT-DECORATION: none">11.2 Ñòåêîâûå ïðîöåäóðû.</a> <A href="#11.3" style="TEXT-DECORATION: none">11.3 Ðåãèñòðîâûå ïðîöåäóðû.</a> <A href="#11.4" style="TEXT-DECORATION: none">11.4 Äèíàìè÷åñêèå ïðîöåäóðû.</a> <A href="#11.4.1" style="TEXT-DECORATION: none">11.4.1 Óñòàíîâêà äèíàìè÷åñêîé ïðîöåäóðû â îïðåäåëåííîå ìåñòî ïðîãðàììû.</a> <A href="#11.5" style="TEXT-DECORATION: none">11.5 inline-ïðîöåäóðû.</a> <A href="#11.5.1" style="TEXT-DECORATION: none">11.5.1 Äðóãîå ïðèìåíåíèå inline.</a> <A href="#11.6" style="TEXT-DECORATION: none">11.6 Ïðîöåäóðû îáðàáîòêè ïðåðûâàíèé.</a> <A href="#11.7" style="TEXT-DECORATION: none">11.7 Çàìåíà return íà goto.</a> <A href="#11.8" style="TEXT-DECORATION: none">11.8 Âîçâðàùàåìûå çíà÷åíèÿ.</a> <A href="#11.9" style="TEXT-DECORATION: none">11.9 Îáúÿâëåíèå ïàðàìåòðîâ â ðåãèñòðîâûõ ïðîöåäóðàõ.</a> <A href="#11.10" style="TEXT-DECORATION: none">11.10 Îáúÿâëåíèå ïàðàìåòðîâ â ñòåêîâûõ ïðîöåäóðàõ.</a> <A href="#11.11" style="TEXT-DECORATION: none">11.11 Èñïîëüçîâàíèå ìàêðîêîìàíä.</a> <A href="#11.12" style="TEXT-DECORATION: none">11.12 Ïåðåäà÷à ïàðàìåòðîâ â ñòåêîâûå ïðîöåäóðû ÷åðåç ðåãèñòðû.</a> <A href="#11.13" style="TEXT-DECORATION: none">11.13 Âûçîâ ïðîöåäóð ñ àäðåñîì â ðåãèñòðå.</a> <A href="#11.14" style="TEXT-DECORATION: none">11.14 Âñòîåííûå â êîìïèëÿòîð ïðîöåäóðû.</a> <A href="#11.14.1" style="TEXT-DECORATION: none">11.14.1 Ïðîöåäóðû ABORT, ATEXIT è EXIT.</a> <A href="#11.14.2" style="TEXT-DECORATION: none">11.14.2 Ïðîöåäóðû inp/inportb, inport, inportd, outp/outportb, outport è outportd.</a> <A href="#11.14.3" style="TEXT-DECORATION: none">11.14.3 Ïðîöåäóðû äëÿ ðàáîòû ñ âåùåñòâåííûìè ÷èñëàìè.</a> <A href="#11.15.1" style="TEXT-DECORATION: none">11.15 Êëàññû. 11.15.1 Îáúÿâëåíèå ïðîöåäóð â ñòðóêòóðàõ.</a> <A href="#11.15.2" style="TEXT-DECORATION: none">11.15.2 Íàñëåäîâàíèå.</a> <A href="#11.15.3" style="TEXT-DECORATION: none">11.15.3 Íàñëåäîâàíèå ïðîöåäóð.</a> <A name=contents12> <A href="#12.1" style="TEXT-DECORATION: none">12. Òèïû âûõîäíûõ ôàéëîâ. 12.1 Âûõîäíûå ôàéëû òèïà COM.</a> <A href="#12.2" style="TEXT-DECORATION: none">12.2 Âûõîäíûå ôàéëû òèïà EXE.</a> <A href="#12.3" style="TEXT-DECORATION: none">12.3 Âûõîäíîé ôàéë *.EXE ñ ìîäåëüþ ïàìÿòè tiny.</a> <A href="#12.4" style="TEXT-DECORATION: none">12.4 Îáúåêòíûé âûõîäíîé ôàéë OBJ.</a> <A href="#12.5.1" style="TEXT-DECORATION: none">12.5 COM ôàéë symbiosis. 12.5.1 ÑÈÌÁÈÎÇ - ÷òî ýòî òàêîå?</a> <A href="#12.5.2" style="TEXT-DECORATION: none">12.5.2 Êàê ýòî äåëàòü.</a> <A href="#12.5.3" style="TEXT-DECORATION: none">12.5.3 Èñïîëüçîâàíèå.</a> <A href="#12.5.4" style="TEXT-DECORATION: none">12.5.4 Çëîóïîòðåáëåíèÿ.</a> <A href="#12.6" style="TEXT-DECORATION: none">12.6 SYS - äðàéâåðû óñòðîéñòâ.</a> <A href="#12.7" style="TEXT-DECORATION: none">12.7 Êîìïèëÿöèÿ êîäà ðàñøèðèòåëåé ROM-BIOS.</a> <A href="#12.8.1" style="TEXT-DECORATION: none">12.8 32-áèòíûå ôàéëû. 12.8.1 32-áèòíûé êîä ïîä DOS.</a> <A href="#12.8.2" style="TEXT-DECORATION: none">12.8.2 32-áèòíûé êîä ïîä Windows.</a> <A href="#12.8.3" style="TEXT-DECORATION: none">12.8.3 Âûçîâ API ïðîöåäóð ïî îðäèíàëàì.</a> <A href="#12.8.4" style="TEXT-DECORATION: none">12.8.4 Ñîçäàíèå DLL ïîä Windows.</a> <A href="#12.8.5" style="TEXT-DECORATION: none">12.8.5 Èíèöèàëèçàöèÿ DLL ïðè çàãðóçêå.</a> <A href="#12.8.6" style="TEXT-DECORATION: none">12.8.6 Êîìïèëÿöèÿ ðåñóðñîâ.</a> <A href="#12.9" style="TEXT-DECORATION: none">12.9 Âûõîäíûå ôàéëû äëÿ MeOS.</a> <A name=contents13> <A href="#13.1" style="TEXT-DECORATION: none">13. Ïðèëîæåíèÿ. 13.1 Ïîèñê âêëþ÷àåìûõ ôàéëîâ.</a> <A href="#13.2" style="TEXT-DECORATION: none">13.2 Ðåãèñòðû, êîòîðûå äîëæíû áûòü ñîõðàíåíû.</a> <A href="#13.3" style="TEXT-DECORATION: none">13.3 C--.ini ôàéë.</a> <A href="#13.4" style="TEXT-DECORATION: none">13.4 startup.h-- ôàéë.</a> <A href="#13.5" style="TEXT-DECORATION: none">13.5 mainlib.ldp ôàéë.</a> <A href="#13.6" style="TEXT-DECORATION: none">13.6 C-- ñèìâîëû.</a> </FONT></B> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=intro>1. Âñòóïëåíèå. 1.1 Èñòîðèÿ ñîçäàíèÿ è ðàçâèòèÿ. </A></B></FONT><FONT FACE="Courier"> Àâòîðîì ÿçûêà SPHINX C-- ÿâëÿåòñÿ Peter Cellik (CANADA). Ïîñëåäíÿÿ àâòîðñêàÿ âåðñèÿ SPHINX C-- v0.203 îò 28.Oct.96. Ê ñîæàëåíèþ àâòîð îòêàçàëñÿ îò äàëüíåéøåãî ðàçâèòèÿ ÿçûêà. Ñ 1998 ãîäà, óæå ïî÷òè óìåðøèé ïðîåêò, ïîäõâàòèë Ìèõàèë Øåêåð (Ðîññèÿ). Èçíà÷àëüíî êîìïèëÿòîð áûë freeware (è äàæå greenware, êàê åãî íàçûâàë Peter Cellik). Òàêèì ñòàòóñ êîìïèëÿòîðà îñòàëñÿ è ïîíûíå. Ïåðâîíà÷àëüíî êîìïèëÿòîð ìîã ñîçäàâàòü òîëüêî *.com ôàéëû è áûë ðàññ÷èòàí íà ñîçäàíèå íåáîëüøèõ demo-ïðîãðàìì è ðåçèäåíòîâ (TSR).  äàëüíåéøåì âîçìîæíîñòè êîìïèëÿòîðà ðàñøèðÿëèñü, òàê êàê ýòîãî òðåáîâàëî íàøå áóðíîå âðåìÿ. Ïðè ðàçâèòèè êîìïèëÿòîðà, áûëî ñòðåìëåíèå ïðèäåðæèâàòüñÿ ñëåäóþùèõ ïðèíöèïîâ: 1. Ìàêñèìàëüíî âîçìîæíàÿ ñîâìåñòèìîñòü ñèíòàêñèñà ñ ïîñëåäíåé âåðñèåé êîìïèëÿòîðà íàïèñàííîãî Peter Cellik. Ýòî äàâàëî âîçìîæíîñòü ñ ìèíèìàëüíûìè çàòðàòàìè (à ÷àùå âñåãî áåç âñÿêèõ çàòðàò) àäàïòèðîâàòü ïðîãðàììû, íàïèñàííûå äëÿ 0.203 âåðñèè êîìïèëÿòîðà, ê ïîñëåäíåé íà ýòîò ìîìåíò âåðñèè êîìïèëÿòîðà. 2. Ñáëèçèòü ñèíòàêñèñ êîìïèëÿòîðà ñî ñòàíäàðòíûì ÿçûêîì C. Ýòî ìîãëî çíà÷èòåëüíî îáëåã÷èòü ïåðåíîñ ïðîãðàìì íàïèñàííûõ íà C. 3. Òàêæå ïðèëàãàëèñü óñèëèÿ, äëÿ òîãî, ÷òîáû ÷åëîâåê çíàþùèé òîëüêî àññåìáëåð ìîã áû ñ ìèíèìàëüíûìè çàòðàòàìè îñâîèòü C--. Âîò ýòè, çà÷àñòóþ ïðîòèâîðå÷àùèå äðóã äðóãó ïðèíöèïû, âëèÿëè íà âûáîð ðåàëèçàöèè âîçìîæíîñòåé êîìïèëÿòîðà. Íàñêîëüêî ýòî óäàëîñü - ñóäèòü Âàì. Åñëè ó Âàñ åñòü ïðåäëîæåíèÿ è èäåè ïî óëó÷øåíèþ êîìïèëÿòîðà - ïèøèòå. Ìîé e-mail <a href="mailto:sheker@mail.ru">sheker@mail.ru</a> . ß ñ óäîâîëüñòâèåì âûñëóøàþ Âàøè ïðåäëîæåíèÿ, íî íå ãàðàíòèðóþ, ÷òî âñå îíè áóäóò ðåàëèçîâàíû. Åñëè ðåàëèçîâûâàòü âñå ïîñòóïàþùèå ïðåäëîæåíèÿ, òî êîìïèëÿòîð ïðåâðàòèòñÿ â ñâàëêó. Íî åñëè Âàøå ïðåäëîæåíèå áóäåò öåííûì (íà ìîé âçãëÿä, òàê ÷òî Âàì ïðèäåòñÿ ñâîå ïðåäëîæåíèå õîðîøî àðãóìåíòèðîâàòü) è åãî áóäåò âîçìîæíûì ðåàëèçîâàòü, îíî áåç ñîìíåíèÿ íàéäåò ìåñòî â êîìïèëÿòîðå. <A href="#contents" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=1.2> 1.2 ×òî òàêîå C--? </A></B></FONT><FONT FACE="Courier"> C-- áûë ðàçðàáîòàí, äëÿ òîãî ÷òîáû ñòðîèòü ìàëåíüêèå è áûñòðûå ïðîãðàììû. Ýòî íàèáîëåå ïîäõîäèò äëÿ ñîçäàíèÿ ðåçèäåíòíûõ ïðîãðàìì (TSR), ïðîãðàìì, òðåáóþùèõ îáðàáîòêó ïðåðûâàíèé èëè ïðîãðàìì ó êîòîðûõ îãðàíè÷åíû ðåñóðñû. C-- çàíèìàåò ïðîìåæóòî÷íîå ïîëîæåíèå ìåæäó ñè è àññåìáëåðîì.  ñâÿçè ñ ýòèì ïðîìåæóòî÷íûì ïîëîæåíèåì, Âàì, äëÿ òîãî ÷òîáû ïèñàòü ïðîãðàììû íà C--, íåîáõîäèìî çíàòü è àññåìáëåð è ñè. Åñëè Âàì íàäîåëî âîçèòüñÿ ñ îãðîìíûìè àññåìáëåðíûìè ëèñòèíãàìè, à èçëèøíÿÿ ñòðîãîñòü ÿçûêà C Âàñ óãíåòàåò, òî ýòîò ÿçûê äëÿ ÂÀÑ. Ñåé÷àñ êîìïèëÿòîð C-- ìîæåò ñîçäàâàòü 32-áèòíûå ïðîãðàììû ïîä Windows (EXE-ôàéëû ôîðìàòà PE) è 32-áèòíûå ïðîãðàììû ïîä DOS (LE-ôîðìàò). Èìååò âñòðîåííûé êîìïèëÿòîð ðåñóðñîâ è äèçàññåìáëåð äëÿ ãåíåðàöèè ëèñòèíãà îòêîìïèëèðîâàííîãî ôàéëà. Ïîääåðæèâàåò àññåìáëåðíûå èíñòðóêöèè ïðîöåññîðà Pentium III è àññåìáëåðíûå èíñòðóêöèè FPU. Êîìïèëÿòîð ìîæåò ãåíåðèðîâàòü îòëàäî÷íóþ èíôîðìàöèþ ñîâìåñòèìóþ ñ îòëàä÷èêàìè ôèðìû Borland. Êîìïèëÿòîð ìîæåò ñîçäàâàòü îáúåêòíûå ôàéëû (obj), íî òîëüêî äëÿ DOS ïðîãðàìì. C-- ðàçðàáîòàí òîëüêî äëÿ èñïîëüçîâàíèÿ íà êîìïüþòåðàõ ñ ïðîöåññîðàìè ñîâìåñòèìûìè ñ ñåìåéñòâîì 80x86. Êîìïèëÿòîð ìîæåò ðàáîòàòü òîëüêî ñ îïåðàöèîííûìè ñèñòåìàìè DOS è ñåìåéñòâîì Windows. <A href="#contents" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=1.3> 1.3 Êàê óñòàíîâèòü C--. </A></B></FONT><FONT FACE="Courier"> Êîìïèëÿòîðó C-- äëÿ ðàáîòû íóæíû ñîâñåì íåçíà÷èòåëüíûå ðåñóðñû: ïðîöåññîð 386 èëè ëó÷øå, ÷óòü áîëåå 1 Ìá äèñêîâîãî ïðîñòðàíñòâà è 4Ìá îïåðàòèâíîé ïàìÿòè. Êîìïèëÿòîð ìîæåò áûòü óñòàíîâëåí íà êîìïüþòåðû ñ îïåðàöèîííîé ñèñòåìîé Windows 95 èëè ëó÷øå. Êîìïèëÿòîð òàêæå ìîæåò ðàáîòàòü â ñðåäå ÷èñòîãî DOS.  îñíîâíîì ïàêåòå êîìïèëÿòîðà íàõîäèòñÿ 32-áèòíàÿ DOS âåðñèÿ êîìïèëÿòîðà. Íà ñàéòå <a href="http://sheker.chat.ru">http://sheker.chat.ru</a> èëè <a href="http://c--sphinx.narod.ru">http://c--sphinx.narod.ru</a> ìîæíî íàéòè è êîíñîëüíóþ âåðñèþ êîìïèëÿòîðà. Êîíñîëüíàÿ âåðñèÿ êîìïèëÿòîðà ìîæåò ðàáîòàòü òîëüêî â ñðåäå Windows, íî îíà, â îòëè÷èå îò DOS âåðñèè, ìîæåò ðàáîòàòü ñ äëèííûìè èìåíàìè èñõîäíûõ ôàéëîâ. Óñòàíîâèòü êîìïèëÿòîð C-- íà Âàø êîìïüþòåð î÷åíü ïðîñòî. Ïðåäïîëîæèì, ÷òî Âû ðåøèëè óñòàíîâèòü C-- íà äèñê C. Ñîçäàéòå íà äèñêå C äèðåêòîðèþ (ïàïêó) ñ èìåíåì <b>C--</b> èëè ñ äðóãèì, óäîáíûì è ïîíÿòíûì äëÿ Âàñ èìåíåì (íàïðèìåð, ÄÎÑîâñêîé êîìàíäîé: <b>MD C--</b> èëè äðóãèì äîñòóïíûì Âàì ñïîñîáîì). Çàòåì ñ ñàéòà <a href="http://sheker.chat.ru">http://sheker.chat.ru</a> èëè <a href="http://c--sphinx.narod.ru">http://c--sphinx.narod.ru</a> ñêà÷àéòå ôàéëû full_c--.zip è ful_c--2.zip è ðàçàðõèâèðóéòå èõ â ýòîé äèðåêòîðèè. Çàòåì â ôàéëå autoexec.bat ìîæíî ïðîïèñàòü ïóòü ê äèðåêòîðèè ñ êîìïèëÿòîðîì. È âñå. Êîìïèëÿòîð ãîòîâ ê ðàáîòå. Åñëè Âû äîáàâëÿëè ïóòü ê êîìïèëÿòîðó â ôàéë autoexec.bat, òî Âàì ïðèäåòñÿ ïåðåãðóçèòü îïåðàöèîííóþ ñèñòåìó. Ïåðåìåííàÿ îêðóæåíèÿ äëÿ êîìïèëÿòîðà C-- çàäàåòñÿ ëèáî èç êîìàíäíîé ñòðîêè ëèáî èç êîìàíäíîãî ôàéëà (ëó÷øå âñåãî åå ïðîïèñàòü â autoexec.bat). Ýòà ïåðåìåííàÿ äîëæíà óêàçûâàòü êîìïèëÿòîðó, ãäå íàõîäÿòñÿ åãî áèáëèîòå÷íûå ôàéëû. Ïðèìåð: <b>set C--=c:\c--\lib</b> Áîëüøîé íåîáõîäèìîñòè â ïåðåìåííîé îêðóæåíèÿ äëÿ ñåãîäíÿøíåé âåðñèè êîìïèëÿòîðà íåò. Ñóùåñòâóåò íåñêîëüêî äðóãèõ ñïîñîáîâ, óêàçàòü êîìïèëÿòîðó ìåñòî ðàñïîëîæåíèÿ áèáëèîòåê. Ïîýòîìó îïðåäåëÿòü èëè íå îïðåäåëÿòü ïåðåìåííóþ îêðóæåíèÿ äåëî âàøåãî âêóñà è ïðèâû÷åê. <A href="#contents" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1> 2. Óïðàâëåíèå êîìïèëÿöèåé. 2.1 Ïàðàìåòðû êîìàíäíîé ñòðîêè êîìïèëÿòîðà C--. </A></B></FONT><FONT FACE="Courier"> Ôîðìàò êîìàíäíîé ñòðîêè âûçîâà êîìïèëÿòîðà C--: C-- [Ïàðàìåòðû] [ÈÌß INI ÔÀÉËÀ] [ÈÌß ÈÑÕÎÄÍÎÃÎ ÔÀÉËÀ] Èìÿ èñõîäíîãî ôàéëà ìîæíî çàäàâàòü áåç ðàñøèðåíèÿ. Êîìïèëÿòîð èùåò ôàéë ñ ðàñøèðåíèåì <b>c--, cmm, c</b>. Ïàðàìåòðû âûäåëÿþòñÿ ïðåäøåñòâóþùèì ñèìâîëîì <b>/</b> èëè <b>-</b>. Èíâåðòèðîâàòü ôóíêöèþ îïöèè ìîæíî çàâåðøàþùèì ñèìâîëîì <b>-</b>. Ñïèñîê ïîääåðæèâàåìûõ ïàðàìåòðîâ: <b>/0</b> èñïîëüçîâàòü òîëüêî êîìàíäû 8086/8088 ïðîöåññîðà (óñòàíîâëåíî ïî óìîë÷àíèþ ïðè êîìïèëÿöèè 16-áèòíûõ ïðîãðàìì). <b>/1</b> èñïîëüçîâàòü êîìàíäû 80186 ïðîöåññîðà. <b>/2</b> èñïîëüçîâàòü êîìàíäû è îïòèìèçàöèþ äëÿ 80286 ïðîöåññîðà. <b>/3</b> èñïîëüçîâàòü êîìàíäû è îïòèìèçàöèþ äëÿ 80386 ïðîöåññîðà. (óñòàíîâëåíî ïî óìîë÷àíèþ äëÿ 32-áèòíûõ ïðîãðàìì). <b>/4</b> èñïîëüçîâàòü êîìàíäû è îïòèìèçàöèþ äëÿ 80486 ïðîöåññîðà. <b>/5</b> èñïîëüçîâàòü êîìàíäû è îïòèìèçàöèþ äëÿ Pentium ïðîöåññîðà. <b>/6</b> èñïîëüçîâàòü êîìàíäû è îïòèìèçàöèþ äëÿ Pentium MMX ïðîöåññîðà. <b>/7</b> èñïîëüçîâàòü êîìàíäû è îïòèìèçàöèþ äëÿ Pentium Pro ïðîöåññîðà. <b>/8</b> èñïîëüçîâàòü êîìàíäû è îïòèìèçàöèþ äëÿ Pentium II ïðîöåññîðà. <b>/9</b> èñïîëüçîâàòü êîìàíäû è îïòèìèçàöèþ äëÿ Pentium III ïðîöåññîðà (ïîêà íå ðåàëèçîâàíî èç-çà îòñóòñòâèè èíôîðìàöèè). <b>/A</b> âûðàâíèâàíèå äàííûõ íà ÷åòíûé àäðåñ ïî óìîë÷àíèþ ðàçðåøåíî, ïîääåðæèâàåò èíâåðñèþ <b>/AC</b> âûðàâíèâàíèå àäðåñà íà÷àëà öèêëîâ ïî óìîë÷àíèþ îòêëþ÷åíî, ïîääåðæèâàåò èíâåðñèþ èìååò ñìûñë òîëüêî íà ïðîöåññîðàõ Pentium+ <b>/AL</b>=## óñòàíîâèòü çíà÷åíèå áàéòà çàïîëíåíèÿ ïðè âûðàâíèâàíèè äàííûõ ïî óìîë÷àíèþ 0. <b>/AP</b> âûðàâíèâàíèå àäðåñà íà÷àëà ïðîöåäóð. ïî óìîë÷àíèþ îòêëþ÷åíî, ïîääåðæèâàåò èíâåðñèþ èìååò ñìûñë òîëüêî íà ïðîöåññîðàõ Pentium è ëó÷øå <b>/ARGC</b> âñòàâèòü áëîê ðàçáîðà êîìàíäíîé ñòðîêè ïî óìîë÷àíèþ îòêëþ÷åíî, ïîääåðæèâàåò èíâåðñèþ <b>/AS</b> âûðàâíèâàíèå â ñòðóêòóðàõ. ïî óìîë÷àíèþ îòêëþ÷åíî, ïîääåðæèâàåò èíâåðñèþ <b>/AT</b> âñòàâèòü áëîê ïîääåðæêè <b>ATEXIT</b> ïðîöåäóðû ïî óìîë÷àíèþ îòêëþ÷åíî, ïîääåðæèâàåò èíâåðñèþ <b>/C</b> âñòàâèòü áëîê èãíîðèðîâàíèÿ <b>CTRL-C</b> ïî óìîë÷àíèþ îòêëþ÷åí, ïîääåðæèâàåò èíâåðñèþ èìååò ñìûñë òîëüêî ïîä DOS ïðîãðàììû <b>/CRI</b> ïðîâåðÿòü âêëþ÷àåìûå ôàéëû íà ïîâòîðíóþ çàãðóçêó ïî óìîë÷àíèþ âêëþ÷åíî, ïîääåðæèâàåò èíâåðñèþ <b>/CPA</b> î÷èñòêà post-îáëàñòè äàííûõ <b>/D32</b> ñîçäàòü EXE ôàéë (32 áèòíûé êîä ïîä DOS) ïî óìîë÷àíèþ COM <b>/D</b>=idname îïðåäåëèòü èäåíòèôèêàòîð äëÿ óñëîâíîé êîìïèëÿöèè ïî óìîë÷àíèþ íåò <b>/DBG</b> ãåíåðèðîâàòü îòëàäî÷íóþ èíôîðìàöèþ ïî óìîë÷àíèþ íåò <b>/DE</b> âðåìåííîå ðàñøèðåíèå ðàçðÿäíîñòè ïîñëå óìíîæåíèÿ ïî óìîë÷àíèþ îòêëþ÷åíî, ïîääåðæèâàåò èíâåðñèþ <b>/DLL</b> ñîçäàòü DLL äëÿ Windows32 ïî óìîë÷àíèþ COM <b>/ENV</b> ñîõðàíåíèå àäðåñà ïåðåìåííûõ îêðóæåíèÿ <b>/EXE</b> ñîçäàòü EXE ôàéë äëÿ DOS (ìîäåëü SMALL) ïî óìîë÷àíèþ COM <b>/HELP /H /?</b> ñïðàâêà, ýòà èíôîðìàöèÿ <b>/IA</b> èìåíà àññåìáëåðíûõ èíñòðóêöèé ÿâëÿþòñÿ èäåíòèôèêàòîðàìè ïî óìîë÷àíèþ îòêëþ÷åíî, ïîääåðæèâàåò èíâåðñèþ <b>/IND</b>=name èìïîðò èìåí èç ôàéëà <b>name</b>. <b>/IP</b>=path çàäàòü ïóòü ïîèñêà âêëþ÷àåìûõ ôàéëîâ ïî óìîë÷àíèþ íåò <b>/IV</b> èíèöèàëèçèðîâàòü âñå ïåðåìåííûå ïî óìîë÷àíèþ îòêëþ÷åíî, ïîääåðæèâàåò èíâåðñèþ <b>/J0</b> íå äåëàòü íà÷àëüíûé jump íà main() ïî óìîë÷àíèþ îòêëþ÷åíî, ïîääåðæèâàåò èíâåðñèþ  COM-ôàéëàõ íå ñîçäàåò jmp íà main.  îñòàëüíûõ íå ñîçäàåòñÿ áëîê íà÷àëüíîé èíèöèàëèçàöèè ïðîãðàììû, à óïðàâëåíèå ïåðåäàåòñÿ ñðàçó íà main. <b>/J1</b> äåëàòü êîðîòêèé jump íà main() ïî óìîë÷àíèþ íåò èìååò ñìûñë òîëüêî â COM-ôàéëàõ <b>/J2</b> äåëàòü jump íà main() ïî óìîë÷àíèþ äà, ïîääåðæèâàåò èíâåðñèþ èìååò ñìûñë òîëüêî â COM-ôàéëàõ <b>/LAI</b> ñïèñîê ïîääåðæèâàåìûõ àññåìáëåðíûõ èíñòðóêöèé <b>/LRS</b> çàãðóæàòü ÷èñëîâûå êîíñòàíòû ÷åðåç ñòåê. ïî óìîë÷àíèþ äà, ïîääåðæèâàåò èíâåðñèþ <b>/LST</b> ñîçäàòü àññåìáëåðíûé ëèñòèíã <b>/ME</b> ïîêàçàòü ìîé àäðåñ è èìÿ <b>/MEOS</b> ñîçäàòü èñïîëíÿåìûé ôàéë äëÿ MeOS ïî óìîë÷àíèþ COM <b>/MER</b>=## óñòàíîâèòü ìàêñèìàëüíîå ÷èñëî îøèáîê ïî óìîë÷àíèþ 16 <b>/MIF</b>=file îïðåäåëèòü èìÿ ãëàâíîãî êîìïèëèðóåìîãî ôàéëà <b>/NS</b> çàïðåòèòü ïîäêëþ÷àòü stub ôàéëîâ ïî óìîë÷àíèþ íåò, ïîääåðæèâàåò èíâåðñèþ <b>/NW</b>=## âûáîðî÷íîå îòêëþ÷åíèå ïðåäóïðåæäåíèé <b>/OBJ</b> ñîçäàòü OBJ ôàéë òîëüêî 16 áèòíûé êîä. ïî óìîë÷àíèþ COM <b>/OC</b> îïòèìèçèðîâàòü ïî ðàçìåðó êîäà ïî óìîë÷àíèþ íåò, ïîääåðæèâàåò èíâåðñèþ <b>/ON</b> îïòèìèçàöèÿ ÷èñåë ïî óìîë÷àíèþ íåò, ïîääåðæèâàåò èíâåðñèþ <b>/OS</b> îïòèìèçàöèÿ ïî ñêîðîñòè âûïîëíåíèÿ ïî óìîë÷àíèþ äà, ïîääåðæèâàåò èíâåðñèþ <b>/OST</b> îïòèìèçàöèÿ ñòðîêîâûõ èäåíòèôèêàòîðîâ ïî óìîë÷àíèþ îòêëþ÷åíî, ïîääåðæèâàåò èíâåðñèþ <b>/P</b> âñòàâèòü áëîê ðàçáîðêè êîìàíäíîé ñòðîêè ïî óìîë÷àíèþ íåò, ïîääåðæèâàåò èíâåðñèþ <b>/R</b> âñòàâèòü áëîê óìåíüøàþùèé ðàçìåð äîñòóïíîé ïàìÿòè. ïî óìîë÷àíèþ äà, ïîääåðæèâàåò èíâåðñèþ èìååò ñìûñë òîëüêî â DOS-ôàéëàõ <b>/S</b>=##### óñòàíîâèòü ðàçìåð ñòåêà ïî óìîë÷àíèþ 2048 <b>/SA</b>=#### íà÷àëüíîå ñìåùåíèå àäðåñà çàïóñêà ïðîãðàììû èìååò ñìûñë òîëüêî â COM-ôàéëàõ, ïî óìîë÷àíèþ 0x100 <b>/SOBJ</b> ñîçäàòü âåäîìûé OBJ ôàéë ïî óìîë÷àíèþ COM <b>/STM</b> ïåðåíåñòè áëîê startup êîäà â ïðîöåäóðó main ïî óìîë÷àíèþ íåò, ïîääåðæèâàåò èíâåðñèþ èìååò ñìûñë òîëüêî â COM-ôàéëàõ <b>/SUV</b>=#### íà÷àëüíûé àäðåñ íå èíèöèàëèçèðîâàííûõ ïåðåìåííûõ, ïðè èñïîëüçîâàíèè èìè startup êîäà. èìååò ñìûñë òîëüêî â COM-ôàéëàõ, ïî óìîë÷àíèþ ðàâåí /SA <b>/SYM</b> íàäñòðîéêà äëÿ COM ôàéëà ïî óìîë÷àíèþ COM <b>/SYS</b> ñîçäàòü äðàéâåð óñòðîéñòâ (SYS) ïî óìîë÷àíèþ COM <b>/TEXE</b> ñîçäàòü EXE ôàéë äëÿ DOS (ìîäåëü TINY) ïî óìîë÷àíèþ COM <b>/UL</b> èñïîëüçîâàòü lea ïðè îïòèìèçàöèè ñëîæåíèÿ ðåãèñòðîâ. ïî óìîë÷àíèþ äà, ïîääåðæèâàåò èíâåðñèþ <b>/UST</b> èñïîëüçîâàòü startup êîä äëÿ ïåðåìåííûõ. èìååò ñìûñë òîëüêî â COM-ôàéëàõ ïî óìîë÷àíèþ íåò, ïîääåðæèâàåò èíâåðñèþ <b>/W</b> ðàçðåøèòü ïðåäóïðåæäåíèÿ ïî óìîë÷àíèþ íåò, ïîääåðæèâàåò èíâåðñèþ <b>/W32</b> ñîçäàòü EXE ôàéë äëÿ Windows32 GUI ïî óìîë÷àíèþ COM <b>/W32C</b> ñîçäàòü EXE ôàéë äëÿ Windows32 console ïî óìîë÷àíèþ COM <b>/WBSS</b> ïîìåùàòü íå èíèöèàëèçèðîâàííûå äàííûå â îòäåëüíóþ ñåêöèþ. ïî óìîë÷àíèþ äëÿ /w32 ðàçðåøåíî, äëÿ îñòàëüíûõ çàïðåùåíî. ïîääåðæèâàåò èíâåðñèþ <b>/WF</b>=file ïåðåíàïðàâèòü âûâîä ïðåäóïðåæäåíèé â ôàéë. ïî óìîë÷àíèþ íåò <b>/WFA</b> èñïîëüçîâàòü áûñòðûå âûçîâû API ïðîöåäóð ïî óìîë÷àíèþ äà, ïîääåðæèâàåò èíâåðñèþ òîëüêî ïîä windows <b>/WFU</b> ñîçäàâàòü òàáëèöó ïåðåìåùåíèé (äëÿ Windows32) ïî óìîë÷àíèþ íåò, ïîääåðæèâàåò èíâåðñèþ òîëüêî ïîä windows äëÿ DLL óñòàíàâëèâàåòñÿ â äà <b>/WIB</b>=##### óñòàíîâèòü àäðåñ image base ïî óìîë÷àíèþ 0x400000 <b>/WMB</b> ñîçäàâàòü Windows-ôàéë ñ åäèíûì áëîêîì ïî óìîë÷àíèþ äà, ïîääåðæèâàåò èíâåðñèþ òîëüêî ïîä windows äëÿ DLL óñòàíàâëèâàåòñÿ â íåò <b>/WORDS</b> âûäàòü ñïèñîê çàðåçåðâèðîâàííûõ èäåíòèôèêàòîðîâ <b>/WS</b>=name óêàçûâàåò èìÿ ôàéëà èñïîëüçóåìîãî â êà÷åñòâå <b>stub</b> ïîä windows. <b>/X</b> çàïðåòèòü âñòàâëÿòü â êîä <b>SPHINXC--</b> ñèãíàòóðó ïî óìîë÷àíèþ ðàçðåøåíî, ïîääåðæèâàåò èíâåðñèþ îòêëþ÷àåòñÿ åñëè åñòü <b>J0</b> Ïðèìå÷àíèå: âûðàæåíèå <i>ïîääåðæèâàåò èíâåðñèþ</i> îçíà÷àåò, ÷òî äëÿ äàííîé îïöèè ìîæíî èñïîëüçîâàòü è ïðîòèâîïîëîæíîå çíà÷åíèå ñ ïîìîùüþ ñèìâîëà <b>-</b> ïîñëå îïöèè. Ïðèìåð: <b>/WFA-</b> Ïàðàìåòðû êîìàíäíîé ñòðîêè ìîæíî ïèñàòü êàê áîëüøèìè, òàê è ìàëåíüêèìè áóêâàìè. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.1> 2.1.1 /ON - Îïòèìèçàöèÿ ÷èñëîâûõ âûðàæåíèé. </A></B></FONT><FONT FACE="Courier"> Ïðè âêëþ÷åíèè â êîìàíäíóþ ñòðîêó îïöèè <b>/ON</b> èëè â ôàéë C--.INI ñòðî÷êè <b>ON</b>, êîìïèëÿòîð áóäåò àíàëèçèðîâàòü îïåðàöèè íàä ÷èñëàìè è ãäå ýòî ìîæíî, ñîêðàùàòü ÷èñëî îïåðàöèé. Íàïðèìåð: Ñòðîêà äî îïòèìèçàöèè | Ïîñëå îïòèìèçàöèè ----------------------------------------------- AX = var + 7 - 3; | AX = var + 4; AX = var * 2 * 5; | AX = var * 10; AX = var * 2 / 4; | AX = var / 2; AX = var * 10 / 2; | AX = var * 5; AX = var / 2 / 3; | AX = var / 6; AX = var / 4 * 8; | AX = var * 2; AX = var / 16 * 16; | AX = var; Âîçìîæíûå îòðèöàòåëüíûå ïîñëåäñòâèÿ: Ïðèìåíåíèå ýòîé îïòèìèçàöèè ìîæåò èìåòü è íåãàòèâíûå ïîñëåäñòâèÿ. Íàïðèìåð, åñëè Âàì íóæíî âûðîâíÿòü çíà÷åíèå ïåðåìåííîé íà ãðàíèöó ïàðàãðàôà, Âû íàïèøèòå ñòðîêó: var = var / 16 * 16; íî ïîñëå îïòèìèçàöèè áóäåò var = var; ò.å. âûðàâíèâàíèå íå áóäåò ïðîèçâåäåíî. Ýòîãî ìîæíî èçáåæàòü, åñëè ðàçáèòü ýòî âûðàæåíèå íà äâà: var = var / 16; var = var * 16; òîãäà îïòèìèçàöèÿ íå áóäåò ïðîèçâåäåíà. Íî äëÿ ïîëó÷åíèÿ áîëåå êîìïàêòíîãî êîäà ëó÷øå áóäåò çàïèñàòü òàê: AX = var; AX = AX / 16; AX = AX * 16; var = AX; <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.2> 2.1.2 /DE - Âðåìåííîå ðàñøèðåíèå ðàçðÿäíîñòè ïåðåìåííîé. </A></B></FONT><FONT FACE="Courier"> Êàê èçâåñòíî, ïîñëå óìíîæåíèÿ ìîæåò ïðîèçîéòè ïåðåïîëíåíèå, ò.å ðàçðÿäíîñòü ðåçóëüòàòà ìîæåò ïðåâûñèòü ðàçðÿäíîñòü èñõîäíûõ îïåðàíäîâ è ïðîèçîéäåò èñêàæåíèå ðåçóëüòàòà. ×àñòè÷íî ðåøèòü ýòó ïðîáëåìó Âàì ïîìîæåò îïöèÿ êîìàíäíîé ñòðîêè <b>/DE</b> èëè ñòðîêà <b>DE</b> â ôàéëå C--.INI. Ïîñëå êîìàíäû óìíîæåíèÿ êîìïèëÿòîð áóäåò ïðîñìàòðèâàòü îñòàòîê ñòðîêè è åñëè îáíàðóæèò, ÷òî ðàñøèðåíèå ðàçðÿäíîñòè ìîæåò áûòü âîñòðåáîâàíî (âîñòðåáîâàòü ðàñøèðåííóþ ðàçðÿäíîñòü ìîãóò îïåðàöèè äåëåíèÿ è âû÷èñëåíèÿ îñòàòêà), òî áóäóò ïðèíÿòû ìåðû ïî åå ñîõðàíåíèþ. Íàïðèìåð: a = b*c+d/e; //çäåñü áóäåò âêëþ÷åíà ïîääåðæêà ðàñøèðåíèÿ ðàçðÿäíîñòè a = b*c+d*e; //çäåñü ïîääåðæêè ðàñøèðåíèÿ ðàçðÿäíîñòè íå áóäåò. Îäíàêî ïðèìåíåíèå ýòîé îïöèè ìîæåò èìåòü è íåãàòèâíûå ïîñëåäñòâèÿ. Ïîêàæó ýòî íà ïðèìåðå: ïóñòü èìååòñÿ âûðàæåíèå a = b * c / d; åñëè çíà÷åíèÿ ïåðåìåííûõ b = 0xC000, c = 0x1000, d=0x10, ïîñëå çàïóñêà òàêàÿ ïðîãðàììà çàâèñíåò ñ ñîîáùåíèåì î òîì, ÷òî ïðîèçîøëî ïåðåïîëíåíèå ïðè äåëåíèè. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.3> 2.1.3 /ARGC - Àëüòåðíàòèâíûé îáðàáîò÷èê êîìàíäíîé ñòðîêè. </A></B></FONT><FONT FACE="Courier"> Îòëè÷èå ýòîãî îáðàáîò÷èêà êîìàíäíîé ñòðîêè îò <b>parsecommandline</b> çàêëþ÷àåòñÿ â òîì, ÷òî ïðè âûçîâå <b>PARAMSTR(0)</b>; Âû ïîëó÷èòå àäðåñ ñòðîêè â êîòîðîé óêàçàí ïóòü è èìÿ çàïóùåííîé ïðîãðàììû. Ñëåäóþùèå âûçîâû ýòîé ïðîöåäóðû ñ óâåëè÷èâàþùèìñÿ ïàðàìåòðîì áóäóò âîçâðàùàòü àäðåñà ñëîâ êîìàíäíîé ñòðîêè. À âûçîâ ïðîöåäóðû <b>PARAMCOUNT</b> âåðíåò Âàì ÷èñëî ñëîâ â êîìàíäíîé ñòðîêå ïëþñ îäèí. Àëüòåðíàòèâíûé îáðàáîò÷èê êîìàíäíîé ñòðîêè âêëþ÷àåòñÿ äèðåêòèâîé <b>?argc TRUE</b> èëè èç êîìàíäíîé ñòðîêè êîìïèëÿòîðà êëþ÷îì <b>/argc</b> èëè ñòðî÷êîé <b>argc</b> â ôàéëå C--.INI. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.4> 2.1.4 /OST - ñëèÿíèå îäèíàêîâûõ ñòðîêîâûõ êîíñòàíò. </A></B></FONT><FONT FACE="Courier"> Åñëè ýòîò ðåæèì îïòèìèçàöèè áóäåò àêòèâèçèðîâàí, òî êîìïèëÿòîð áóäåò çàïîìèíàòü âñå ñòðîêîâûå êîíñòàíòû è ïðè îáíàðóæåíèè îäèíàêîâûõ â êîä ôàéëà íå áóäåò âñòàâëåíà ïîâòîðíàÿ ñòðîêîâàÿ êîíñòàíòà, à áóäåò ñäåëàíà ññûëêà íà ïåðâóþ, îáíàðóæåííóþ ðàíåå ñòðîêîâóþ êîíñòàíòó.  îïòèìèçàöèè ó÷àñòâóþò òîëüêî íåèìåíîâàííûå ñòðîêîâûå êîíñòàíòû. Ò.å. åñëè ìàññèâ èëè ñòðóêòóðà áóäåò èíèöèàëèçèðîâàíû ñòðîêîé, òî òàêàÿ ñòðîêà íå áóäåò ó÷àñòâîâàòü â ïðîöåññå èíèöèàëèçàöèè, òàê ýòà ñòðîêà ìîæåò áûòü èçìåíåíà â ïðîöåññå ðàáîòû ïðîãðàììû. Ïðèìåð: char var="test"; //ýòà ñòðîêà íå áóäåò ó÷àñòâîâàòü â ïðîöåññå //îïòèìèçàöèè. void proc(){ WRITESTR("test"); // ýòà ñòðîêà áóäåò ó÷àñòâîâàòü â îïòèìèçàöèè. AX="test"; // ïåðåìåííîé AX áóäåò ïðèñâîåí àäðåñ ñòðîêè, // êîòîðàÿ áûëà âñòàâëåíà â êîä ïðîãðàììû â // ïðåäûäóùåé ñòðîêå. } Îáî âñåõ ñëó÷àÿõ îáíàðóæåíèÿ ïîâòîðíîé ñòðîêè êîìïèëÿòîð áóäåò âûäàâàòü ïðåäóïðåæäåíèÿ. Âêëþ÷àåòñÿ ýòîò ðåæèì îïòèìèçàöèè ëèáî ñ êîìàíäíîé ñòðîêè <b>/ost</b>, ëèáî äèðåêòèâîé <b>#pragma option ost</b>, ëèáî ñòðîêîé â ôàéëå c--.ini - <b>ost</b>. Îòêëþ÷èòü, âêëþ÷åííûé ðàíåå, ýòîò ðåæèì ìîæíî äèðåêòèâîé <b>#pragma option ost-</b>. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.5> 2.1.5 /D - óñòàíîâêà èäåíòèôèêàòîðà â TRUE èç êîìàíäíîé ñòðîêè. </A></B></FONT><FONT FACE="Courier"> Åñëè Âû íàïèñàëè ïðîãðàììó, êîòîðàÿ ìîæåò êîìïèëèðîâàòüñÿ ïî ðàçíîìó, â çàâèñèìîñòè îò ñîñòîÿíèÿ íåêîòîðûõ èäåíòèôèêàòîðîâ (èñïîëüçóåòñÿ ðåæèì óñëîâíîé êîìïèëÿöèè), òî Âàì î÷åíü ìîæåò ïðèãîäèòñÿ ýòà îïöèÿ. Óñòàíàâëèâàÿ ñ êîìàíäíîé ñòðîêè ðàçëè÷íûå èäåíòèôèêàòîðû, Âû ìîæåòå ïîëó÷àòü ðàçëè÷íûå âàðèàíòû ïðîãðàììû, íå ðåäàêòèðóÿ èñõîäíûé òåêñò ïðîãðàììû. Èäåíòèôèêàòîð ââîäèòñÿ ñ êîìàíäíîé ñòðîêè êëþ÷îì <b>/d=idname</b>. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.6> 2.1.6 /IA - óïðîùåííûé ââîä àññåìáëåðíûõ èíñòðóêöèé. </A></B></FONT><FONT FACE="Courier"> Ñòàëî âîçìîæíûì èñïîëüçîâàòü àññåìáëåðíûå èíñòðóêöèè áåç ïðåôèêñà <b>$</b> è âíå áëîêà <b>asm</b>. Ýòîò ðåæèì âêëþ÷àåòñÿ: ñ êîìàíäíîé ñòðîêè îïöèåé <b>/ia</b>; â ôàéëå êîíôèãóðàöèè ñòðîêîé <b>ia</b> èëè äèðåêòèâîé <b>#pragma option ia</b>. Êîãäà ýòîò ðåæèì âêëþ÷åí, âñå èìåíà àññåìáëåðíûõ èíñòðóêöèé ñòàíîâÿòñÿ çàðåçåðâèðîâàííûìè ñëîâàìè, ò.å. Âû íå ñìîæåòå ýòè èìåíà èñïîëüçîâàòü â êà÷åñòâå èìåí ïåðåìåííûõ èëè ïðîöåäóð. Àññåìáëåðíûå èíñòðóêöèè êîìïèëÿòîð ðàñïîçíàåò íåçàâèñèìî îò òîãî, íàïèñàíû îíè ìàëåíüêèìè èëè áîëüøèìè áóêâàìè. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.7> 2.1.7 /CRI - ïðîïóñê ïîâòîðíî âêëþ÷àåìîãî ôàéëà. </A></B></FONT><FONT FACE="Courier"> ×àùå âñåãî, ïîâòîðíî âêëþ÷àòü ôàéë â êîìïèëèðóåìûé ïðîåêò, íåò íåîáõîäèìîñòè, íî ýòî èíîãäà ïðîèñõîäèò èç-çà òîãî, ÷òî íåêîòîðûå âêëþ÷àåìûå ôàéëû ñàìè âêëþ÷àþò äðóãèå ôàéëû. ×òîáû ýòîãî íå ïðîèñõîäèëî ïðèõîäèòñÿ äåëàòü ïðîâåðêó íà ïîâòîðíóþ çàãðóçêó ôàéëà. Òåïåðü ýòó ôóíêöèþ áåðåò íà ñåáÿ êîìïèëÿòîð è ó Âàñ îòïàäàåò íåîáõîäèìîñòü äåëàòü ýòó ïðîâåðêó. Íî èíîãäà (î÷åíü ðåäêî) âîçíèêàåò ïîòðåáíîñòü ñäåëàòü ïîâòîðíîå âêëþ÷åíèå ôàéëà. Äëÿ ýòîãî â êîìïèëÿòîðå åñòü îïöèÿ êîìàíäíîé ñòðîêè <b>/cri-</b>, êîòîðàÿ çàïðåùàåò êîìïèëÿòîðó äåëàòü ïðîâåðêó íà ïîâòîðíîå âêëþ÷åíèå. Ñîîòâåòñòâåííî, äëÿ c--.ini ôàéëà, ýòî ìîæíî ñäåëàòü ñòðîêîé <b>cri-</b> èëè äèðåêòèâîé â êîìïèëèðóåìîì ôàéëå - <b>#pragma option cri-</b>. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.8> 2.1.8 /IND - èìïîðò èìåí ïðîöåäóð èç DLL. </A></B></FONT><FONT FACE="Courier"> Åñëè Âû õîòèòå â ñâîåé ïðîãðàììå èñïîëüçîâàòü DLL, äëÿ êîòîðîé íåò çàãîëîâî÷íîãî ôàéëà ñ îïèñàíèåì ïðîöåäóð, òî êîìïèëÿòîð ìîæåò èìïîðòèðîâàòü èìåíà èç ýòîé DLL. Äëÿ ýòîãî Âàì íàäî óêàçàòü èìÿ ýòîé áèáëèîòåêè ëèáî ÷åðåç îïöèþ êîìàíäíîé ñòðîêè <b>/ind=name.dll</b>, ëèáî â ôàéëå INI ñòðîêîé 'ind=name.dll', ëèáî ÷åðåç äèðåêòèâó '#pragma option ind=name.dll'. Ê íåäîñòàòêîì òàêîãî ñïîñîáà ïîëó÷åíèÿ èìåí ìîæíî îòíåñòè òî, ÷òî ïðè êîìïèëÿöèè ïðîãðàììû áèáëèîòåêà, èç êîòîðîé èìïîðòèðóþòñÿ èìåíà, îáÿçàòåëüíî äîëæíà ïðèñóòñòâîâàòü â êîìïüþòåðå. Òàêæå, åñëè èìåíà â áèáëèîòåêå íàïèñàíû áåç ñóôôèêñà '@number', êîìïèëÿòîð íå áóäåò êîíòðîëèðîâàòü ÷èñëî ïàðàìåòðîâ ïåðåäàâàåìûõ ïðîöåäóðå. È, ê ñîæàëåíèþ, êîìïèëÿòîð óìååò èìïîðòèðîâàòü èìåíà èç áèáëèîòåê èìåþùèõ òîëüêî ôîðìàò PE-ôàéëà. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.9> 2.1.9 /WS - çàäàòü èìÿ stub ôàéëà äëÿ ïðîãðàìì ïîä windows. </A></B></FONT><FONT FACE="Courier"> Êàê èçâåñòíî, â ïðîãðàììàõ ïîä windows åñòü DOS çàãëóøêà, íàçûâàåìàÿ stub, êîòîðîé ïåðåäàåòñÿ óïðàâëåíèå ïðè çàïóñêå òàêîé ïðîãðàììû â ÷èñòîì DOS-å. Îáû÷íî òàêàÿ çàãëóøêà âûâîäèò íà ýêðàí ñîîáùåíèå î òîì, ÷òî ýòó ïðîãðàììó íàäî çàïóñêàòü â ñðåäå windows. Âû ìîæåòå âìåñòî ñòàíäàðòíîãî stub èñïîëüçîâàòü ñâîé. Äëÿ ýòîãî Âàì íåîáõîäèìî óêàçàòü èìÿ 16-áèòíîãî EXE-ôàéëà ëèáî ÷åðåç îïöèþ êîìàíäíîé ñòðîêè <b>/ws=filename</b>, ëèáî ñòðîêîé â INI-ôàéëå <b>ws=filename</b>, ëèáî äèðåêòèâîé <b>#pragma option ws=filename</b>. Òàêèì îáðàçîì, ó Âàñ ïîÿâèëàñü âîçìîæíîñòü ñîçäàâàòü ïðîãðàììû, ðàáîòàþùèå è ïîä DOS è ïîä windows. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.10> 2.1.10 /WBSS - ðàçìåñòèòü íå èíèöèàëèçèðîâàííûå äàííûå â îòäåëüíîé ñåêöèè. </A></B></FONT><FONT FACE="Courier"> Ñåêöèÿ <b>.bss</b> ñîçäàåòñÿ àâòîìàòè÷åñêè ïðè êîìïèëÿöèè ïðîãðàìì ñ êëþ÷îì <b>/w32</b>. Åñëè Âû õîòèòå èìåòü ýòó ñåêöèþ è ïðè êîìïèëÿöèè ïðîãðàìì ñ êëþ÷àìè <b>/w32c</b> èëè <b>/dll</b> Âàì íåîáõîäèìî äîáàâèòü ëèáî â êîìàíäíîé ñòðîêå îïöèþ <b>/wbss</b>, ëèáî ñòðîêó <b>wbss</b> â INI-ôàéëå, ëèáî äèðåêòèâó <b>#pragma option wbss</b>. Èñïîëüçîâàíèå ñåêöèè <b>.bss</b> ïðàêòè÷åñêè íå âëèÿåò íà ðàçìåð ïîëó÷àåìîãî ôàéëà. Òåîðåòè÷åñêè, äëÿ ïðîöåññîðîâ, ó êîòîðûõ åñòü îòäåëüíûé êýø äëÿ äàííûõ, èñïîëüçîâàíèå ñåêöèè <b>.bss</b>, äîëæíî ïîâûøàòü ñêîðîñòü ðàáîòû ïðîãðàììû. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.11> 2.1.11 /DBG - ñîçäàíèå îòëàäî÷íîé èíôîðìàöèè. </A></B></FONT><FONT FACE="Courier"> Åñëè ïðè êîìïèëÿöèè ïðîãðàììû â êîìàíäíóþ ñòðîêó äîáàâèòü êëþ÷ <b>/dbg</b>, èëè â ôàéë êîíôèãóðàöèè c--.ini äîáàâèòü ñòðîêó <b>dbg</b>, òî êîìïèëÿòîð ïîñëå îêîí÷àíèÿ êîìïèëÿöèè ñîçäàñò ôàéë ñ îòëàäî÷íîé èíôîðìàöèåé. Ýòîò ôàéë èìååò èìÿ ãëàâíîãî ìîäóëÿ è èìååò ðàñøèðåíèå *.tds. Îòëàäî÷íàÿ èíôîðìàöèÿ ñîçäàâàåìàÿ êîìïèëÿòîðîì C-- ñîâìåñòèìà ñ îòëàäî÷íîé èíôîðìàöèåé ñîçäàâàåìîé êîìïèëÿòîðàìè ôèðìû Borland. Íî, ïîêà, ýòà èíôîðìàöèÿ ðåàëèçîâàíà åùå íå â ïîëíîì îáúåìå. Ñîçäàâàåìîé ñåé÷àñ îòëàäî÷íîé èíôîðìàöèè äîñòàòî÷íî äëÿ ïðîâåäåíèÿ ïðîñòåéøåé îòëàäêè ïðîãðàììû. Äëÿ 16-áèòíûõ ïðîãðàìì ïîä DOS äëÿ îòëàäêè íàäî èñïîëüçîâàòü Turbo Debugger èç ïàêåòà Borland C v4.5 èëè ëó÷øå (ôàéë td.exe). Äëÿ ïðîãðàìì ïîä Windows íàäî èñïîëüçîâàòü 32-áèòíûé îòëàä÷èê èç ýòîãî æå ïàêåòà (ôàéë td32.exe). Äëÿ 32-áèòíûõ ïðîãðàìì, èñïîëüçóþùèõ ðàñøèðèòåëü DOS ïðèìåíÿòü äëÿ îòëàäêè Turbo Debugger íåâîçìîæíî. Íî, ìîæåò áûòü ÿ íå çíàþ, êàê ýòî äåëàòü. Åñëè Âû çíàåòå, êàê ñîçäàâàòü 32-áèòíûå ïðîãðàììû ñ DOS-ðàñøèðèòåëåì êîìïèëÿòîðàìè ôèðìû Borland ñ âêëþ÷åíèåì â íèõ îòëàäî÷íîé èíôîðìàöèè, òî ðàññêàæèòå ìíå. À ÿ ïîïðîáóþ ïðèìåíèòü ýòî äëÿ C--. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.12> 2.1.12 /J0 /J1 /J2 </A></B></FONT><FONT FACE="Courier"> Ñèíîíèìîì êëþ÷åé <b>/J0 /J1 /J2</b> ÿâëÿåòñÿ äèðåêòèâà <b>#jumptomain</b> ñ ïàðàìåòðàìè <b>NONE, SHORT è NEAR</b> ñîîòâåòñòâåííî. Äèðåêòèâà <b>#jumptomain</b> âûïîëíÿåò íåìíîãî ðàçëè÷íûå ôóíêöèè â çàâèñèìîñòè îò òèïà âûõîäíîãî ôàéëà. Êîìïèëÿöèÿ ôàéëà òèïà <b>*.com</b> è <b>*.exe</b> ìîäåëü ïàìÿòè <b>tiny</b>: <b>#jumptomain NONE (-j0)</b> - â ýòîì ñëó÷àå ïî îêîí÷àíèè êîäà íà÷àëüíîé èíèöèàëèçàöèè ïðîãðàììû íå ãåíåðèðóåòñÿ jmp íà ïðîöåäóðó main. Ýòó äèðåêòèâó ñëåäóåò èñïîëüçîâàòü â ñëó÷àå, åñëè äî ïðîöåäóðû main íåò äðóãèõ íå äèíàìè÷åñêèõ ïðîöåäóð è èíèöèàëèçèðîâàííûõ ïåðåìåííûõ. <b>#jumptomain SHORT (-j1)</b> - â ýòîì ñëó÷àå ïî îêîí÷àíèè êîäà íà÷àëüíîé èíèöèàëèçàöèè ãåíåðèðóåòñÿ êîðîòêèé jmp íà ïðîöåäóðó main. Ýòó äèðåêòèâó ñëåäóåò èñïîëüçîâàòü, åñëè äî ïðîöåäóðû main íàõîäèòñÿ íå áîëåå 128 áàéò êîäà è äàííûõ. <b>#jumptomain NEAR (-j2)</b> - ýòî ñîñòîÿíèå óñòàíàâëèâàåòñÿ ïî óìîë÷àíèþ. Ïðè ýòîì ãåíåðèðóåòñÿ áëèçêèé jmp íà ïðîöåäóðó main. Êîìïèëÿöèÿ ôàéëîâ <b>*.exe</b> (êëþ÷è <b>-exe -d32 -w32 -w32c</b>): <b>#jumptomain NONE (-j0)</b> - â ýòîì ñëó÷àå êîä íà÷àëüíîé èíèöèàëèçàöèè ïðîãðàììû íå ãåíåðèðóåòñÿ è óïðàâëåíèå ïðè çàïóñêå ïåðåäàåòñÿ ñðàçó íà ïðîöåäóðó main. Âî âñåõ îñòàëüíûõ ñëó÷àÿõ ãåíåðèðóåòñÿ êîä íà÷àëüíîé èíèöèàëèçàöèè è óïðàâëåíèå íà ïðîöåäóðó main ïåðåäàåòñÿ èíñòðóêöèåé call. Êîìïèëÿöèÿ ôàéëîâ <b>*.dll</b>: <b>#jumptomain NONE (-j0)</b> - â ýòîì ñëó÷àå êîä íà÷àëüíîé èíèöèàëèçàöèè ïðîãðàììû íå ãåíåðèðóåòñÿ è óïðàâëåíèå ïðè çàïóñêå ïåðåäàåòñÿ ñðàçó íà ïðîöåäóðó <b>main</b>. Âî âñåõ îñòàëüíûõ ñëó÷àÿõ ãåíåðèðóåòñÿ êîä çàãëóøêè è óïðàâëåíèå íà ïðîöåäóðó <b>main</b> íå ïåðåäàåòñÿ. Ôàêòè÷åñêè ïðîöåäóðà <b>main</b> â ýòîì ñëó÷àå íå íóæíà. Ïðîöåäóðà <b>main</b> ïðè ñîçäàíèè ôàéëîâ <b>DLL</b> äîëæíà âûãëÿäåòü íåìíîãî èíà÷å, ÷åì â äðóãèõ ñëó÷àÿõ: dword main ( dword hInstDLL, reason, reserv ) { ... } <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.13> 2.1.13 /LST - Ñîçäàíèå àññåìáëåðíîãî ëèñòèíãà. </A></B></FONT><FONT FACE="Courier"> Ñ ïîìîùüþ äîïîëíèòåëüíîé îïöèè êîìàíäíîé ñòðîêè <b>-lst</b> Âû ìîæåòå ïîëó÷èòü âìåñòå ñ èñïîëíèòåëüíûì ôàéëîì è åãî àññåìáëåðíûé ëèñòèíã. Ëèñòèíã áóäåò ïîìåùåí â ôàéë îäíîèìåííûé ñ èñïîëíèòåëüíûì ôàéëîì è èìåþùèì ðàñøèðåíèå *.lst. Àññåìáëåðíûé ëèñòèíã ñîçäàåòñÿ íåçàâèñèìîé îò êîìïèëÿòîðà ÷àñòüþ êîäà ñ èñïîëüçîâàíèåì èíôîðìàöèè íàêàïëèâàåìîé ïðè êîìïèëÿöèè ïðîãðàììû. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.14> 2.1.14 /ENV - Ñîõðàíåíèå àäðåñà ïåðåìåííûõ îêðóæåíèÿ. </A></B></FONT><FONT FACE="Courier"> Åñëè ïðè êîìïèëÿöèè ïðîãðàììû Âû â êîìàíäíóþ ñòðîêó äîáàâèòå îïöèþ <b>-ENV</b> èëè â ôàéë c--.ini ñòðîêà <b>ENV</b>, òî êîìïèëÿòîð äîáàâèò â âàøó ïðîãðàììó ïåðåìåííóþ <b>environ</b>, â êîòîðîé ïðè çàãðóçêå áóäåò ñîõðàíÿòñÿ àäðåñ ïåðåìåííûõ îêðóæåíèÿ çàïóñêàåìîé ïðîãðàììû. Äëÿ ïðîãðàìì ïîä Windows ýòî áóäåò ïîëíûé àäðåñ, à äëÿ îñòàëüíûõ â ýòîé ïåðåìåííîé áóäåò ñîõðàíÿòüñÿ òîëüêî àäðåñ ñåãìåíòà. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.15> 2.1.15 /CPA - Î÷èñòêà post-îáëàñòè äàííûõ. </A></B></FONT><FONT FACE="Courier"> Ïåðåìåííûå, êîòîðûì â òåëå ïðîãðàììû íå áûëî ïðèñâîåíî íèêàêîå çíà÷åíèå, íå âêëþ÷àþòñÿ â òåëî ñêîìïèëèðîâàííîé ïðîãðàììû. Äëÿ íèõ ðåçåðâèðóåòñÿ ïàìÿòü çà ïðåäåëàìè ïðîãðàììû. Íî ýòà ïàìÿòü ìîæåò áûòü çàïîëíåíà ïðîèçâîëüíîé èíôîðìàöèåé. Åñëè Âàì íåîáõîäèìî, ÷òîáû íåèíèöèàëèçèðîâàííûå ïåðåìåííûå ïðè çàãðóçêå ïðîãðàììû âñåãäà ñîäåðæàëè îäíî è òîæå çíà÷åíèå (íîëü) - âêëþ÷èòå â êîìàíäíóþ ñòðîêó îïöèþ <b>-CPA</b>. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.16> 2.1.16 /W - âûâîä ïðåäóïðåæäåíèé. </A></B></FONT><FONT FACE="Courier"> Ïî óìîë÷àíèþ êîìïèëÿòîð íå âûâîäèò ïðåäóïðåæäåíèÿ è ìíîãèå äàæå íå ïîäîçðåâàþò î ñóùåñòâîâàíèè òàêîé ïîëåçíîé îïöèè.  C-- ïðåäóïðåæäåíèÿ ôàêòè÷åñêè ÿâëÿþòñÿ ïîäñêàçêàìè äëÿ ñîçäàíèÿ îïòèìàëüíûõ ïðîãðàìì è çà÷àñòóþ îáëåã÷àþò îòëàäêó ïðîãðàìì.  ïðåäóïðåæäåíèÿõ êîìïèëÿòîð ìîæåò ñîîáùèòü Âàì î òîì, â êàêîì ìåñòå ìîæíî èñïîëüçîâàòü êîðîòêèå ôîðìû îïåðàòîðîâ IF, WHILE, FOR... Î òîì, êàêèå ïðîöåäóðû, ïåðåìåííûå è ñòðóêòóðû îïðåäåëåííûå â âàøåé ïðîãðàììå íå áûëè èñïîëüçîâàíû. Î òîì êàêèå ðåãèñòðû êîìïèëÿòîð èñïîëüçîâàë áåç âàøåãî âåäîìà è ìíîãî äðóãîé ïîëåçíîé èíôîðìàöèè. Ïî óìîë÷àíèþ ïðåäóïðåæäåíèÿ âûâîäÿòñÿ íà ýêðàí. Íî èõ áûâàåò òàê ìíîãî, ÷òî îíè ìîãóò íå ïîìåñòèòüñÿ íà ýêðàíå. Ïîýòîìó â êîìïèëÿòîðå åñòü îïöèÿ, ïî êîòîðîé âñå ïðåäóïðåæäåíèÿ âûâîäÿòñÿ â ôàéë. Èìÿ ýòîãî ôàéëà çàäàåòñÿ â òîé æå îïöèè. Ïîìåñòèâ â ñâîé c--.ini ôàéë ïàðó âîò ýòèõ ñòðîê: w wf=warning Âû áóäåòå ïîëó÷àòü â ôàéëå <b>warning</b> ïðåäóïðåæäåíèÿ. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.17> 2.1.17 /NW - Âûáîðî÷íîå îòêëþ÷åíèå òèïîâ ïðåäóïðåæäåíèé. </A></B></FONT><FONT FACE="Courier"> Ñåé÷àñ êîìïèëÿòîð ìîæåò âûäàâàòü 12 òèïîâ ïðåäóïðåæäåíèé è, èíîãäà èõ áûâàåò òàê ìíîãî, ÷òî ñòàíîâèòñÿ òðóäíî â íèõ îðèåíòèðîâàòüñÿ. Òåïåðü ìîæíî âûáîðî÷íî çàïðåùàòü âûäà÷ó ïðåäóïðåæäåíèé. Äëÿ ýòîãî â êîìàíäíîé ñòðîêå (èëè â ôàéëå C--.INI) ìîæíî óñòàíîâèòü îïöèþ <b>/nw=number</b>, ãäå number - ÷èñëî îò 1 äî 12. Ýòèì öèôðàì ñîîòâåòñòâóþò ñëåäóþùèå òèïû ïðåäóïðåæäåíèé: 1 - Optimize numerical expressions 2 - Compiler used register ..." 3 - Short operator '...' may be used 4 - String '...' repeated 5 - Expansion variable 6 - Signed value returned 7 - '...' defined above, therefore skipped. 8 - Variable/structure/procedure '...' possible not used 9 - Non-initialized variable may have been used 10 - Return flag was destroyed 11 - Code may not be executable 12 - Don't use local/parametric values in inline procedures <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.1.18> 2.1.18 /WSI - êîðîòêàÿ òàáëèöà èìïîðòà. </A></B></FONT><FONT FACE="Courier"> Òàáëèöà èìïîðòà îáû÷íî ñîñòîèò â ñâîþ î÷åðåäü èç ÷åòûðåõ òàáëèö. Äâå òàáëèöû <b>LookUp Table</b> è <b>Import Address Table</b> àáñîëþòíî îäèíàêîâû. Îïöèåé êîìàíäíîé ñòðîêè <b>/WSI</b> Âû ìîæåòå çàñòàâèòü êîìïèëÿòîð ãåíåðèðîâàòü òîëüêî îäíó èç ýòèõ äâóõ îäèíàêîâûõ òàáëèö (ãåíåðèðóåòñÿ òîëüêî <b>Import Address Table</b>). Òåì ñàìûì ó Âàñ ïîëó÷èòñÿ áîëåå êîìïàêòíàÿ òàáëèöà èìïîðòà, ÷òî ïðèâåäåò, â íåêîòîðûõ ñëó÷àÿõ, ê ñîçäàíèþ áîëåå êîìïàêòíîãî âûõîäíîãî ôàéëà. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.2> 2.2 Äèðåêòèâû òðàíñëÿòîðà. </A></B></FONT><FONT FACE="Courier"> C-- íå ñîäåðæèò ïðåïðîöåññîð. Òåì íå ìåíåå, åñòü íåñêîëüêî ôóíêöèé î÷åíü ïîõîæèõ íà ôóíêöèè C ïðåïðîöåññîðà. Îíè äàþòñÿ êàê äèðåêòèâû òðàíñëÿòîðà. Âñå äèðåêòèâû òðàíñëÿòîðà íà÷èíàþòñÿ ñ âîïðîñèòåëüíîãî çíàêà <b>?</b> ëèáî ñ ñèìâîëà <b>#</b>. Âîò ñïèñîê èìåþùèõñÿ äèðåêòèâ è èõ íàçíà÷åíèå: <b>? align</b> [val] Âûðîâíÿòü äàííûå ïðîãðàììû íà ÷åòíûé ïî óìîë÷àíèþ èëè íà àäðåñ êðàòíûé âåëè÷èíå val. <b>? aligncode</b> [val] Âûðîâíÿòü êîä ïðîãðàììû íà ÷åòíûé ïî óìîë÷àíèþ èëè íà àäðåñ êðàòíûé âåëè÷èíå <b>val</b>. Çàïîëíåíèå ïðîèçâîäèòñÿ êîäîì 0x90. <b>? aligner</b> (aligner value) îïðåäåëèòü çíà÷åíèå áàéòà âñòàâêè. <b>? alignword</b> (TRUE or FALSE) ðàçðåøàåò èëè çàïðåùàåò âûðàâíèâàíèå íà ÷åòíûé àäðåñ ïåðåìåííûõ òèïà word è int, çíà÷åíèå ïî óìîë÷àíèþ TRUE. <b>? argc</b> (TRUE or FALSE) Âêëþ÷èòü èëè îòêëþ÷èòü àëüòåðíàòèâíûé îáðàáîò÷èê êîìàíäíîé ñòðîêè. <b>? atexit</b> Âñòàâëÿåò â startup êîä ïîääåðæêè ïðîöåäóðû ATEXIT(). <b>? code32</b> (TRUE/FALSE) ðàçðåøàåò/çàïðåùàåò ãåíåðàöèþ 32-áèòíîãî êîäà. <b>? codesize</b> îïòèìèçàöèÿ ðàçìåðà êîäà (â óùåðá ñêîðîñòè). <b>? compilerversion</b> min-vers óêàçûâàåò, êîìïèëÿòîð êàêîé âåðñèè íåîáõîäèì äëÿ êîìïèëÿöèè äàííîé ïðîãðàììû. <b>? ctrl_c</b> (TRUE or FALSE ) ðàçðåøàåò èëè çàïðåùàåò èãíîðèðîâàíèå íàæàòèÿ CTRL-C. <b>? dataseg</b> (value) óêàçûâàåò êîìïèëÿòîðó ñåãìåíòíûé àäðåñ ÎÇÓ äëÿ ïåðåìåííûõ ïðè êîìïèëÿöèè ROM-BIOS. <b>? define</b> (identifier) (token) îïðåäåëÿåò èäåíòèôèêàòîð. <b>? DOSrequired</b> (íîìåð) óñòàíàâëèâàåò ìèíèìàëüíóþ òðåáóåìóþ âåðñèþ DOS: ñòàðøèé áàéò - íîìåð âåðñèè, ìëàäøèé áàéò - íîìåð ìîäèôèêàöèè: 0x0101 äëÿ âåðñèè 1.1 DOS 0x0315 äëÿ âåðñèè 3.21 DOS 0x0303 äëÿ âåðñèè 3.3 DOS 0x0600 äëÿ âåðñèè 6.0 DOS 0x0602 äëÿ âåðñèè 6.2 DOS è ò.ä. <b>? dosstring</b> (TRUE/FALSE) óêàçûâàåò êîìïèëÿòîðó, ÷òî â êà÷åñòâå òåðìèíàòîðà ñòðîêè íàäî èñïîëüçîâàòü ñèìâîë <b>$</b> <b>? else</b> ãåíåðèðóåò àëüòåðíàòèâíûé êîä åñëè <b>?ifdef</b> èëè <b>?ifndef</b> ïðèíèìàþò çíà÷åíèå FALSE (ïðèìåð èñïîëüçîâàíèÿ ñìîòðèòå â ôàéëå FPU.H--) <b>? endif</b> óêàçûâàåò íà êîíåö äåéñòâèÿ äèðåêòèâ <b>ifdef</b> è <b>ifndef</b> <b>? fastcallapi</b> (FALSE/TRUE) çàïðåòèòü/ðàçðåøèòü ãåíåðàöèþ áûñòðîãî âûçîâà API-ïðîöåäóð (ïî óìîë÷àíèþ ðàçðåøåíî). Äèðåêòèâà ðàáîòàåò ïðè êîìïèëÿöèè ïðîãðàìì ïîä Windows. <b>? fixuptable</b> (TRUE/FALSE) ðàçðåøèòü/çàïðåòèòü ñîçäàíèå FixUp òàáëèöû (ïî óìîë÷àíèþ çàïðåùåíî). Äèðåêòèâà ðàáîòàåò ïðè êîìïèëÿöèè ïðîãðàìì ïîä Windows. <b>? ifdef</b> (identifier) åñëè èäåíòèôèêàòîð îïðåäåëåí, òî âîçâðàùàåò TRUE èíà÷å FALSE <b>? imagebase</b> value çàäàåò àäðåñ Image Base. Ïî óìîë÷àíèþ ýòîò àäðåñ ðàâåí 0x400000. Äèðåêòèâà ðàáîòàåò ïðè êîìïèëÿöèè ïðîãðàìì ïîä Windows. <b>? ifndef</b> (identifier) åñëè èäåíòèôèêàòîð îïðåäåëåí, òî âîçâðàùàåò FALSE èíà÷å TRUE <b>? include</b> ("filename") âêëþ÷àåò äðóãîé ôàéë. <b>? includepath</b> ("path") óêàçàíèå êîìïèëÿòîðó, â êàêîé äèðåêòîðèè íàäî èñêàòü âêëþ÷àåìûå ôàéëû <b>? initallvar</b> èíèöèàëèçèðóåò 0 âñå íåèíèöèàëèçèðîâàííûå ïåðåìåííûå. <b>? jumptomain</b> (NONE, SHORT, NEAR or FALSE) óñòàíàâëèâàåò òèï ïåðåõîäà ê main(), çíà÷åíèå ïî óìîë÷àíèþ - NEAR. <b>? maxerrors</b> (number) ìàêñèìàëüíîå êîëè÷åñòâî íàéäåííûõ îøèáîê, ïðåâûñèâ êîòîðîå òðàíñëÿòîð ïðåêðàùàåò ðàáîòó, çíà÷åíèå ïî óìîë÷àíèþ - 16. <b>? movedatarom</b> (TRUE/FALSE) óêàçûâàåò êîìïèëÿòîðó î íåîáõîäèìîñòè ïåðåíîñà äàííûõ èç ÏÇÓ â ÎÇÓ. <b>? parsecommandline</b> (TRUE or FALSE) âêëþ÷àåò â ïðîãðàììó áëîê êîäà äëÿ ñèíòàêñè÷åñêîãî àíàëèçà êîìàíäíîé ñòðîêè çíà÷åíèå ïî óìîë÷àíèþ FALSE. <b>? pragma</b> ìîæåò îáúÿâëÿòü íåñêîëüêî äðóãèõ äèðåêòèâ <b>? print</b> (number or string) âûâîäèò íà ýêðàí ñòðîêó èëè ÷èñëî. <b>? printhex</b> (number) âûâîäèò íà ýêðàí ÷èñëî â øåñòíàäöàòåðè÷íîì êîäå. <b>? randombyte</b> âñòàâëÿåò â êîä ïðîãðàììû áàéò ñëó÷àéíîãî çíà÷åíèÿ. <b>? resize</b> (TRUE or FALSE) âêëþ÷àåò ôóíêöèþ èçìåíåíèÿ ïîñëå çàïóñêà ðàçìåðà âûäåëåííîãî ïðîãðàììå áëîêà ïàìÿòè íà ìèíèìàëüíî òðåáóåìûé îáúåì, çíà÷åíèå ïî óìîë÷àíèþ TRUE. <b>? resizemessage</b> (string) ñîîáùåíèå, âûâîäèìîå íà ýêðàí ïåðåä àâàðèéíûì ïðåðûâàíèåì âûïîëíåíèÿ ïðîãðàììû, åñëè èçìåíåíèå ðàçìåðà âûäåëåííîãî ïðîãðàììå áëîêà ïàìÿòè íå âûïîëíåíî. <b>? setdinproc</b> ïî ýòîé äèðåêòèâå êîìïèëÿòîð íåìåäëåííî âñòàâëÿåò â êîä êîìïèëèðóåìîé ïðîãðàììû âñå âûçûâàâøèåñÿ ðàíåå äèíàìè÷åñêèå ïðîöåäóðû. <b>? sizerom</b> (value) óêàçûâàåò êîìïèëÿòîðó ðàçìåð ÏÇÓ. <b>? speed</b> îïòèìèçàöèÿ áûñòðîäåéñòâèÿ (çíà÷åíèå ïî óìîë÷àíèþ) â óùåðá ðàçìåðó êîäà. <b>? stack</b> (number) îïðåäåëÿåò ðàçìåð ñòåêà ïðîãðàììû â áàéòàõ. <b>? startaddress</b> (number) óñòàíàâëèâàåò ñòàðòîâûé àäðåñ íà÷àëà êîäà, çíà÷åíèå ïî óìîë÷àíèþ 0x100. <b>? startuptomain</b> â com-ôàéëàõ ðàçìåùàåò <b>startup-</b>êîä â ïðîöåäóðå <b>main()</b>. <b>? startusevar</b> (number) óêàçûâàåò àäðåñ, ñ êîòîðîãî ðàçðåøåíî èñïîëüçîâàòü ÿ÷åéêè ïàìÿòè ïîä íåèíèöèàëèçèðîâàííûå ïåðåìåííûå. <b>? sysattribute</b> (çíà÷åíèå) ýòà äèðåêòèâà ïåðåäàåò êîìïèëÿòîðó àòðèáóò ñîçäàâàåìîãî äðàéâåðà. Ïî óìîë÷àíèþ óñòàíàâëèâàåòñÿ çíà÷åíèå 0x2000. Äåéñòâóåò òîëüêî ñ êëþ÷îì <b>/SYS</b>. <b>? sysname</b> <òåêñòîâàÿ ñòðîêà> ýòà äèðåêòèâà ïåðåäàåò êîìïèëÿòîðó èìÿ áóäóùåãî äðàéâåðà. Ïî óìîë÷àíèþ ïðèñâàèâàåòñÿ èìÿ <b>NO_NAME</b>. Äëèíà èìåíè íå áîëåå 8 ñèìâîëîâ. Äåéñòâóåò òîëüêî ñ êëþ÷îì <b>/SYS</b>. <b>? syscommand</b> <command_0>,<command_1>, ...<command_n>; - ýòà äèðåêòèâà ÿâëÿåòñÿ îáÿçàòåëüíîé ïðè ñîçäàíèè äðàéâåðîâ. Ïî ýòîé äèðåêòèâå êîìïèëÿòîðó ïåðåäàåòñÿ ñïèñîê èìåí ïðîöåäóð îáðàáîòêè êîìàíä äðàéâåðà. Äåéñòâóåò òîëüêî ñ êëþ÷îì <b>/SYS</b>. <b>? warning</b> (TRUE or FALSE) ýòà äèðåêòèâà ðàçðåøàåò èëè çàïðåùàåò âûäà÷ó ïðåäóïðåæäåíèé. Äèðåêòèâà äåéñòâóåò òîëüêî â ïðåäåëàõ òåêóùåãî ôàéëà è íå âëèÿåò íà âêëþ÷àåìûå ôàéëû. <b>? winmonoblock</b> FALSE çàïðåùàåò ðàçìåùåíèå òàáëèö ôàéëà ôîðìàòà PE â îäíó ñåêöèþ. <b>? undef</b> óíè÷òîæàåò êîíñòàíòû îáúÿâëåííûå äèðåêòèâîé <b>? define</b> <b>? use8086</b> îãðàíè÷èâàåòñÿ ïðè ãåíåðàöèè îáúåêòíîãî êîäà êîìàíäàìè 8088/8086 (çíà÷åíèå ïî óìîë÷àíèþ). <b>? use8088</b> îãðàíè÷èâàåòñÿ ïðè ãåíåðàöèè îáúåêòíîãî êîäà êîìàíäàìè 8088/8086 (çíà÷åíèå ïî óìîë÷àíèþ). <b>? use80186</b> äîïóñêàåò ïðè ãåíåðàöèè îáúåêòíîãî êîäà êîìàíäû è îïòèìèçàöèþ äëÿ ïðîöåññîðà 80186. <b>? use80286</b> äîïóñêàåò ïðè ãåíåðàöèè îáúåêòíîãî êîäà êîìàíäû è îïòèìèçàöèþ äëÿ ïðîöåññîðà 80286. <b>? use80386</b> äîïóñêàåò ïðè ãåíåðàöèè îáúåêòíîãî êîäà êîìàíäû è îïòèìèçàöèþ äëÿ ïðîöåññîðà 80386. <b>? use80486</b> äîïóñêàåò ïðè ãåíåðàöèè îáúåêòíîãî êîäà êîìàíäû è îïòèìèçàöèþ äëÿ ïðîöåññîðà 80486. <b>? usePentium</b> äîïóñêàåò ïðè ãåíåðàöèè îáúåêòíîãî êîäà êîìàíäû è îïòèìèçàöèþ äëÿ ïðîöåññîðà Pentium. <b>? useMMX</b> äîïóñêàåò ïðè ãåíåðàöèè îáúåêòíîãî êîäà êîìàíäû è îïòèìèçàöèþ äëÿ ïðîöåññîðà Pentium MMX. <b>? usestartup</b> ðàçðåøàåò êîìïèëÿòîðó èñïîëüçîâàòü ÿ÷åéêè ïàìÿòè, çàíèìàåìûå êîäîì íà÷àëüíîé èíèöèàëèçàöèè ïðîãðàììû. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.2.1> 2.2.1 ?ifdef/?ifndef </A></B></FONT><FONT FACE="Courier"> Ðàíåå äèðåêòèâà <b>?ifdef</b> ñðàáàòûâàëà íà íàëè÷èå êîíñòàíòû íåçàâèñèìî îò çíà÷åíèÿ åå âåëè÷èíû, à äèðåêòèâà <b>?ifndef</b> ñðàáàòûâàëà íà îòñóòñòâèå êîíñòàíòû â êîìïèëèðóåìîì ôàéëå. Òåïåðü <b>?indef</b> ñðàáàòûâàåò ëèøü íà êîíñòàíòó îòëè÷íóþ îò FALSE, à <b>?ifndef</b> ñðàáàòûâàåò êàê íà îòñóòñòâèå êîíñòàíòû â êîìïèëèðóåìîì ôàéëå, òàê è íà êîíñòàíòó èìåþùóþ çíà÷åíèå FALSE. Äëÿ äèðåêòèâ <b>?ifdef/?ifndef</b> çàðåçåðâèðîâàíû êîíñòàíòû <i>codesize</i> è <i>speed</i>, êîòîðûå ïðèíèìàþò çíà÷åíèå TRUE èëè FALSE â çàâèñèìîñòè îò ðåæèìà îïòèìèçàöèè. Ýòî áóäåò ïîëåçíûì äëÿ ñîçäàíèÿ áîëåå ãèáêèõ áèáëèîòåê. Åñòü âîçìîæíîñòü ïðîâåðêè òèïà CPU äëÿ êîòîðîãî âåäåòñÿ êîìïèëÿöèÿ. Äîïóñòèìûå âàðèàíòû ñèíòàêñèñà: ?ifdef cpu > 1 //åñëè ïðîãðàììà êîìïèëèðóåòñÿ äëÿ CPU âûøå 80186 ?ifndef cpu >= 2 // -------//------------- íå áîëüøå èëè ðàâíî 80286 ?ifdef cpu == 3 // -------//------------- ðàâíî 80386 ?ifdef cpu != 0 // -------//------------- íå ðàâåí 8086 ?ifdef cpu < 3 // -------//------------- õóæå 80386 ?ifdef cpu <= 2 // -------//------------- õóæå èëè ðàâåí 80286 Ýòà äèðåêòèâà ïîçâîëèò Âàì ïèñàòü îäíó ïðîöåäóðó äëÿ ðàçëè÷íûõ òèïîâ CPU. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.2.2> 2.2.2 ?initallvar </A></B></FONT><FONT FACE="Courier"> Äèðåêòèâîé <b>?initallvar TRUE</b> âêëþ÷àåòñÿ ðåæèì ïðè êîòîðîì âñåì íåèíèöèàëèçèðîâàííûì ïåðåìåííûì áóäåò ïðèñâîåíî íóëåâîå çíà÷åíèå è îíè áóäóò ðàñïîëàãàòüñÿ â òîì ìåñòå, ãäå áûëè îáúÿâëåíû. Ò.å. ïðàêòè÷åñêè èñ÷åçíóò íåèíèöèàëèçèðîâàííûå ïåðåìåííûå. Ýòî ìîæåò áûòü ïîëåçíûì ïðè íàïèñàíèè äðàéâåðîâ è ðåçèäåíòíûõ ïðîãðàìì. Ïàðàìåòð FALSE ýòîé äèðåêòèâû îòêëþ÷àåò ýòîò ðåæèì. Ïî óìîë÷àíèþ ýòà äèðåêòèâà óñòàíîâëåíà â FALSE. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.2.3> 2.2.3 ?usestartup </A></B></FONT><FONT FACE="Courier"> Äèðåêòèâà <b>?usestartup</b> ðàçðåøàåò êîìïèëÿòîðó èñïîëüçîâàòü ÿ÷åéêè êîäà íà÷àëüíîé èíèöèàëèçàöèè ïðîãðàììû (startup) äëÿ ïîñëåäóþùåãî ðàçìåùåíèÿ â íèõ íåèíèöèàëèçèðîâàííûõ ïåðåìåííûõ. Ýòî ìîæåò áûòü ïîëåçíûì äëÿ ïîëó÷åíèÿ áîëåå êîìïàêòíîãî êîäà, êàê îáû÷íûõ ïðîãðàìì, òàê è â îñîáåííîñòè ðåçèäåíòíûõ. Ýòó äèðåêòèâó ïðèìåíÿþò òîëüêî äëÿ ãåíåðàöèè *.COM ôàéëîâ. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.2.4> 2.2.4 ?startusevar </A></B></FONT><FONT FACE="Courier"> Äèðåêòèâîé <b>?startusevar</b> ìîæíî óêàçàòü íà÷àëüíûé àäðåñ ñ êîòîðîãî êîìïèëÿòîð áóäåò ðàñïðåäåëÿòü ïàìÿòü äëÿ íåèíèöèàëèçèðîâàííûõ ïåðåìåííûõ. Íàïðèìåð, ïîëó÷èâ äèðåêòèâó <b>?startusevar 0x53</b> êîìïèëÿòîð áóäåò ðàñïîëàãàòü íåèíèöèàëèçèðîâàííûå ïåðåìåííûå, íà÷èíàÿ ñ àäðåñà 0x53. Ýòî ìîæåò áûòü ïîëåçíûì äëÿ ïîëó÷åíèÿ áîëåå êîìïàêòíîãî êîäà êàê äëÿ ðåçèäåíòíûõ, òàê è äëÿ îáû÷íûõ ïðîãðàìì. Ýòó äèðåêòèâó ïðèìåíÿþò òîëüêî äëÿ ãåíåðàöèè *.COM ôàéëîâ. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.2.5> 2.2.5 ?atexit </A></B></FONT><FONT FACE="Courier"> Äèðåêòèâà <b>?atexit</b> äîáàâëÿåò â startup ïðîãðàììû êîä ïîääåðæêè ïðîöåäóðû <b>ATEXIT</b>, ðåçåðâèðóåò ìåñòî äëÿ õðàíåíèÿ 16 àäðåñîâ ïðîöåäóð è èçìåíÿåò êîä ïðîöåäóð <b>ABORT</b> è <b>EXIT</b>. Ïðîöåäóðà <b>ATEXIT</b> ðåãèñòðèðóåò ïðîöåäóðó, àäðåñ êîòîðîé ïåðåäàåòñÿ åé â êà÷åñòâå ïàðàìåòðà, êàê ïðîöåäóðó çàâåðøåíèÿ ïðîãðàììû. Ýòà ïðîöåäóðà áóäåò âûçâàíà â ìîìåíò çàâåðøåíèÿ ïðîãðàììû ïðîöåäóðàìè <b>ABORT</b> èëè <b>EXIT</b> èëè èíñòðóêöèåé <b>RET</b> èç <b>main</b>. Âñåãî ìîæíî çàðåãèñòðèðîâàòü äî 16 ïðîöåäóð. Ïðîöåäóðû âûçûâàþòñÿ â ïîðÿäêå îáðàòíîì ïîðÿäêó èõ ðåãèñòðàöèè. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.2.6> 2.2.6 ?startuptomain </A></B></FONT><FONT FACE="Courier"> Ïî ýòîé äèðåêòèâå êîìïèëÿòîð â íà÷àëå ôàéëà äåëàåò <b>jmp</b> íà íà÷àëî ïðîöåäóðû main(). Ïåðåä íà÷àëîì êîìïèëÿöèè ýòîé ïðîöåäóðû êîìïèëÿòîð íà÷íåò êîìïèëÿöèþ startup êîäà è ëèøü çàòåì áóäåò ïðîäîëæåíà êîìïèëÿöèÿ ïðîöåäóðû main(). Òåì ñàìûì <b>startup êîä</b> îêàæåòñÿ íå â íà÷àëå ôàéëà, êàê ýòî ïðîèñõîäèò îáû÷íî, à â òåëå ïðîöåäóðû main(). Ýòî áóäåò ïîëåçíûì ïðè êîìïèëÿöèè ðåçèäåíòíûõ ïðîãðàìì (TSR). Äèðåêòèâà ?startuptomain ðàáîòàåò òîëüêî ïðè êîìïèëÿöèè com-ôàéëîâ. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.2.7> 2.2.7 ?undef </A></B></FONT><FONT FACE="Courier"> Ýòà äèðåêòèâà óíè÷òîæàåò êîíñòàíòû îáúÿâëåííûå äèðåêòèâîé <b>?define</b>. Åå ìîæíî ïðèìåíÿòü äëÿ èçìåíåíèÿ â ïðîöåññå êîìïèëÿöèè çíà÷åíèÿ êàêîé-íèáóäü êîíñòàíòû. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.2.8> 2.2.8 ?align è ?aligncode </A></B></FONT><FONT FACE="Courier">  C-- ñóùåñòâóåò äèðåêòèâà <b>?align</b>, êîòîðàÿ äåëàåò îäíîêðàòíîå âûðàâíèâàíèå äàííûõ íà ÷åòíûé àäðåñ. Íî åñëè ê ýòîé äèðåêòèâå äîáàâèòü ÷èñëî, òî âûðàâíèâàíèå áóäåò ïðîèçâåäåíî íà àäðåñ êðàòíûé ýòîìó ÷èñëó. Íàïðèìåð äèðåêòèâà <b>?align 4</b> äîïîëíèò ñåãìåíò äàííûõ äî àäðåñà êðàòíîãî 4. Ïðè âûðàâíèâàíèè áóäóò âñòàâëÿòüñÿ áàéòû, çíà÷åíèÿ êîòîðûõ îïðåäåëÿþòñÿ äèðåêòèâîé <b>?aligner</b>, ïî óìîë÷àíèþ ýòî çíà÷åíèå ðàâíî íóëþ. Äèðåêòèâà <b>?align</b> ïðîèçâîäèò âûðàâíèâàíèå òîëüêî â ñåãìåíòå äàííûõ.  òåõ ìîäåëÿõ ïàìÿòè, â êîòîðûõ ñåãìåíò äàííûõ è êîäà ñîâïàäàþò ýòó äèðåêòèâó ìîæíî ïðèìåíÿòü è äëÿ âûðàâíèâàíèÿ íà÷àëà ïðîöåäóð. Äèðåêòèâà <b>?aligncode [value]</b> äåëàåò âûðàâíèâàíèå â ñåãìåíòå êîäà íà àäðåñ êðàòíûé çíà÷åíèþ <b>value</b>, ïî óìîë÷àíèþ íà ÷åòíûé àäðåñ. Çíà÷åíèå áàéòà çàïîëíåíèÿ â ýòîé äèðåêòèâå ÿâëÿåòñÿ ÷èñëî 0x90 - êîä èíñòðóêöèè NOP. Çíà÷åíèå áàéòà çàïîëíåíèÿ äëÿ ýòîé äèðåêòèâû èçìåíèòü íåëüçÿ. Ò.î. ýòó äèðåêòèâó ìîæíî ïðèìåíÿòü è âíóòðè èñïîëíÿåìîãî êîäà. Íàïðèìåð, åñëè Âû õîòèòå ïîëó÷èòü áûñòðûé êîä íà 486 ïðîöåññîðå, òî ðåêîìåíäóåòñÿ äåëàòü âûðàâíèâàíèå íà÷àëà ïðîöåäóð è öèêëîâ íà àäðåñ êðàòíûé 16. <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=2.2.9> 2.2.9 ?pragma </A></B></FONT><FONT FACE="Courier"> Äèðåêòèâà <b>#pragma</b> ýòî ìíîãîôóíêöèîíàëüíàëüíàÿ äèðåêòèâà, êîòîðàÿ â ñâîþ î÷åðåäü èìååò ñâîè äèðåêòèâû: <b>option</b> Äèðåêòèâà <b>option</b> ïîçâîëÿåò âêëþ÷èòü â Âàø êîä îïöèè êîìàíäíîé ñòðîêè êîìïèëÿòîðà. Íåêîòîðûå îïöèè íå ìîãóò áûòü èñïîëüçîâàíû â ýòîé äèðåêòèâå; äðóãèå äîëæíû ïîìåùàòüñÿ â ñàìîì íà÷àëå èñõîäíîãî òåêñòà. Ïðèìåð: #pragma option w32c Ýòà äèðåêòèâà îáúÿâëÿåò êîìïèëÿòîðó, ÷òî íàäî ñîçäàòü êîíñîëüíûé 32-áèòíûé ôàéë ïîä windows. <b>startup</b> Äèðåêòèâîé <b>startup</b> ìîæíî óêàçàòü ôóíêöèþ, êîòîðàÿ áóäåò âûïîëíåíà ïåðåä çàïóñêîì ïðîöåäóðû <b>main</b>. Ýòà äèðåêòèâà èìååò òàêîé ôîðìàò: #pragma startup procname Êîëè÷åñòâî ðàç, êîòîðîå ìîæíî ïðèìåíÿòü ýòó äèðåêòèâó â îäíîé ïðîãðàììå íå îãðàíè÷åíî, íî ðåàëüíî ìîæíî èñïîëüçîâàòü ëèøü íåñêîëüêî òûñÿ÷ ðàç. <b>line</b> Äèðåêòèâà <b>line</b> âûâîäèò íà ýêðàí íîìåð òåêóùåé ñòðîêè è èìÿ ôàéëà. Äîïîëíèòåëüíî ìîæåò âûâîäèòüñÿ ñîäåðæèìîå ñòðîêè íàõîäÿùååñÿ ïîñëå ñëîâà <b>line</b>. Ïðèìåð: #pragma line information Âñòðåòèâ ýòó äèðåêòèâó, êîìïèëÿòîð âûâåäåò íà ýêðàí íîìåð ñòðîêè è èìÿ ôàéëà. Òàêæå áóäåò âûâåäåíî ñîîáùåíèå ñïðàâà îò ñëîâà <b>line</b>, åñëè îíî åñòü. <b>resource</b> Ýòà äèðåêòèâà ìîæåò ïðèíèìàòü çíà÷åíèÿ <b>start</b> è <b>end</b>. Ýòè äâà çíà÷åíèÿ âûäåëÿþò íà÷àëî è êîíåö áëîêà ðåñóðñîâ, åñëè âû èñïîëüçóåòå åãî íåïîñðåäñòâåííî â èñõîäíîì êîäå ôàéëà, à íå â îòäåëüíîì ôàéëå. Ïðèìåð: #pragma resource start MyMenu MENU DISCARDABLE BEGIN POPUP "Files",HELP BEGIN MENUITEM "Open", ID_OPEN MENUITEM "Save", ID_SAVE MENUITEM SEPARATOR MENUITEM "Exit", ID_EXIT END MENUITEM "Other", 65535 END #pragma resource end <A href="#contents2" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=3.1> 3. Êîíñòàíòû. 3.1 ×èñëîâûå êîíñòàíòû. </A></B></FONT><FONT FACE="Courier"> Ïðåäñòàâëåíèå ÷èñëîâûõ êîíñòàíò â âèäå äåñÿòè÷íûõ ÷èñåë (÷èñåë ñ îñíîâàíèåì 10) è øåñòíàäöàòåðè÷íûõ ÷èñåë (îñíîâàíèå ñ÷èñëåíèÿ 16) ïîëíîñòüþ àíàëîãè÷íî ÿçûêó <b>C</b>. Ïðè äâîè÷íîì ïðåäñòàâëåíèè ÷èñåë (îñíîâàíèå 2) ÷èñëî äîëæíî íà÷èíàòüñÿ ñ ñèìâîëîâ <b>0b</b>, çà êîòîðûìè áåç ïðîáåëà èäåò ïîñëåäîâàòåëüíîñòü íóëåé è åäèíèö. Ïðè âîñüìåðè÷íîì ïðåäñòàâëåíèè ÷èñåë (îñíîâàíèå 8) ÷èñëî äîëæíî íà÷èíàòüñÿ ñ ñèìâîëîâ <b>0o</b>, çà êîòîðûìè áåç ïðîáåëà èäåò ïîñëåäîâàòåëüíîñòü öèôð. Âåùåñòâåííîå ÷èñëî îòëè÷àåòñÿ îò öåëîãî ïî íàëè÷èþ â íåì òî÷êè. Íà÷èíàòüñÿ âåùåñòâåííîå ÷èñëî äîëæíî ëèáî öèôðîé îò 0 äî 9, ëèáî çíàêîì ìèíóñ. Íåîáÿçàòåëüíîé ÷àñòüþ âåùåñòâåííîãî ÷èñëà ÿâëÿåòñÿ ïîêàçàòåëü ñòåïåíè. Ïîêàçàòåëü ñòåïåíè îòäåëÿåòñÿ îò ÷èñëà ñèìâîëîì <b>e</b> èëè <b>E</b>. Ïðîáåëû íåäîïóñòèìû. Ïðèìåðû: 0b11111111 // äâîè÷íîå ïðåäñòàâëåíèå ÷èñëà 255 0x00F // øåñòíàäöàòåðè÷íîå ïðåäñòàâëåíèå ÷èñëà 15 0o10 // âîñüìåðè÷íîå ïðåäñòàâëåíèå ÷èñëà 8 1.234567E-20 // âåùåñòâåííîå ÷èñëî C-- âìåñòå ñ òðàäèöèîííûì <b>C-</b>ñòèëåì øåñòíàäöàòåðè÷íûõ ÷èñåë ïîíèìàåò è ÷èñëà çàïèñàííûå â ñòèëå àññåìáëåðà. Äëÿ òåõ, êòî âäðóã íå çíàåò, ñîîáùàþ, ÷òî øåñòíàäöàòåðè÷íûå ÷èñëà â àññåìáëåðå èìåþò íà êîíöå ñèìâîë <b>h</b> èëè <b>H</b>. Åñëè ïåðâûé ñèìâîë øåñòíàäöàòåðè÷íîãî ÷èñëà áîëüøå <b>9</b>, òî ïåðåä íèì îáÿçàòåëüíî äîëæåí áûòü çàïèñàí ñèìâîë <b>0</b>. Ïðèìåðû: 1234h 0A000H Ê ÷èñëîâûì êîíñòàíòàì ìîæíî ïèñàòü ñóôôèêñû <b>L, U è F</b>. Ôàêòè÷åñêè ýòè ñóôôèêñû â C-- íå èãðàþò íèêàêîé ðîëè, êîìïèëÿòîð èõ ïðîñòî ïðîãëàòûâàåò. Ïðèìåð: #define DEF 1L #define DEF2 2Lu #define DEF3 3.0F Ýòè ñóôôèêñû íå çàâèñÿò îò ðåãèñòðà, ò.å. èõ ìîæíî ïèñàòü êàê ìàëåíüêèìè, òàê è áîëüøèìè áóêâàìè. <A href="#contents3" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=3.2> 3.2 Ñèìâîëüíûå êîíñòàíòû. </A></B></FONT><FONT FACE="Courier"> Îäèíî÷íûå ñèìâîëüíûå êîíñòàíòû, êàê è â <b>C</b>, äîëæíû çàêëþ÷àòüñÿ â îäèíî÷íûå êàâû÷êè <b>'</b>. Òàêæå êàê è â <b>C</b>, äëÿ îáîçíà÷åíèÿ ñïåöèàëüíûõ ñèìâîëîâ ñëóæèò îáðàòíàÿ íàêëîííàÿ ÷åðòà âïðàâî <b>\</b> ñ ïîñëåäóþùèì çà íåé êëþ÷åâûì ñèìâîëîì (èëè íåñêîëüêèìè ñèìâîëàìè). Ïîääåðæèâàþòñÿ ñëåäóþùèå ñïåöèàëüíûå ñèìâîëû: \a /* çâóêîâîé ñèãíàë */ \b /* çàáîé */ \f /* ïåðåâîä ñòðàíèöû */ \l /* ïåðåâîä ñòðîêè */ \n /* âîçâðàò êàðåòêè*/ \r /* âîçâðàò êàðåòêè*/ \t /* òàáóëÿöèÿ */ \x?? /* ñèìâîë ASCII, ñîîòâåòñòâóþùèé áàéòîâîìó ïðåäñòàâëåíèþ, ñîñòîÿùåìó èç äâóõ øåñòíàäöàòåðè÷íûõ öèôð, ðàñïîëîæåííûõ íà ìåñòå çíàêîâ âîïðîñà */ \??? /* ñèìâîë ASCII, ñîîòâåòñòâóþùèé áàéòîâîìó ïðåäñòàâëåíèþ, ñîñòîÿùåìó èç òðåõ äåñÿòè÷íûõ öèôð, ðàñïîëîæåííûõ íà ìåñòå çíàêîâ âîïðîñà */ Ëþáîé äðóãîé ñèìâîë ïîñëå îáðàòíîé íàêëîííîé ÷åðòû âïðàâî áóäåò ïðèíÿò êàê ïðîñòîé ñèìâîë. Ñèìâîë "Îäèíî÷íàÿ êàâû÷êà" <b>'</b> ìîæåò áûòü ââåäåí ïðè ïîìîùè êîíñòðóêöèè <b>\'</b> Ñèìâîë NULL ìîæåò áûòü ââåäåí êàê ''  C-- ïîääåðæèâàþòñÿ è ìíîãîáóêâåííûå ñèìâîëüíûå êîíñòàíòû. Ïðèìåðû ìíîãîáóêâåííûõ ñèìâîëüíûõ êîíñòàíò: 'ab' 'the' 'this is large' Íèêàêîãî îãðàíè÷åíèÿ íà ÷èñëî ñèìâîëîâ â ñèìâîëüíîé êîíñòàíòå íå íàêëàäûâàåòñÿ, íî ðàçëè÷àþòñÿ òîëüêî ïîñëåäíèå 4 ñèìâîëà. Ýòî - ìàêñèìóì, êîòîðûé ìîæåò áûòü ñîõðàíåí â 32-ðàçðÿäíîé ïåðåìåííîé. Íàïðèìåð, êîíñòàíòû <b>this is large</b> è <b>arge</b> - îäèíàêîâû. C-- îáðàáàòûâàåò âñå ñèìâîëüíûå êîíñòàíòû êàê ÷èñëîâûå çíà÷åíèÿ ASCII ñèìâîëîâ. Äëÿ ìíîãîáóêâåííûõ ñèìâîëüíûõ êîíñòàíò ïåðâûé ñèìâîë ñîîòâåòñòâóåò ñòàðøèì ðàçðÿäàì, òàêèì îáðàçîì, çíà÷åíèå äëÿ <b>ab</b> áóäåò çàêîäèðîâàíî êàê <b>a*256+b</b>. <A href="#contents3" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=3.3> 3.3 Ñòðîêîâûå êîíñòàíòû. </A></B></FONT><FONT FACE="Courier"> Ñòðîêîâûå êîíñòàíòû, êàê è â C, çàêëþ÷àþòñÿ â äâîéíûå êàâû÷êè ("). Ñïåöèàëüíûå ñèìâîëû âíóòðè ñòðîê îáîçíà÷àþòñÿ òàê æå, êàê è â ñèìâîëüíûõ êîíñòàíòàõ. Âñå ñïåöèàëüíûå ñèìâîëû èìåþò òî æå çíà÷åíèå, ÷òî è â ñèìâîëüíûõ êîíñòàíòàõ çà èñêëþ÷åíèåì <b>\n</b>, êîòîðûé èìååò çíà÷åíèå <b>íîâàÿ ñòðîêà</b> è çàìåíÿåò ñîáîé ïàðó ñèìâîëîâ <b>âîçâðàò êàðåòêè</b> è <b>ïåðåâîä ñòðîêè</b>.  íàñòîÿùåå âðåìÿ íàèáîëüøàÿ äëèíà ñòðîêîâîé êîíñòàíòû - 2048 ñèìâîëîâ, âêëþ÷àÿ ñèìâîë-îãðàíè÷èòåëü 0, òàêèì îáðàçîì, ìàêñèìóì 2047 çíà÷àùèõ ñèìâîëîâ. <A href="#contents3" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=3.4> 3.4 Ïîñòîÿííûå âûðàæåíèÿ. </A></B></FONT><FONT FACE="Courier"> Ïîñòîÿííîå âûðàæåíèå - îäèíî÷íàÿ ÷èñëîâàÿ êîíñòàíòà èëè íåñêîëüêî ÷èñëîâûõ êîíñòàíò, ñâÿçàííûõ ìåæäó ñîáîé îïåðàòîðàìè. ×èñëîâîå çíà÷åíèå âûðàæåíèÿ âû÷èñëÿåòñÿ îäèí ðàç âî âðåìÿ êîìïèëÿöèè è äàëåå èñïîëüçóåòñÿ òîëüêî åãî ïîñòîÿííîå çíà÷åíèå. Ïîäîáíî âñåì âûðàæåíèÿì â C--, ïîñòîÿííûå âûðàæåíèÿ âñåãäà âû÷èñëÿþòñÿ ñëåâà íàïðàâî, íåâçèðàÿ íà ïðàâèëà àðèôìåòèêè! Ýòî ñîâåðøåííî îòëè÷íî îò äðóãèõ ÿçûêîâ, è ïðè íàïèñàíèè âûðàæåíèé íàäî áûòü îñòîðîæíûì è ïîìíèòü, ÷òî 2+3*2=10 à íå 8. Íåêîòîðûå ïðèìåðû ïîñòîÿííûõ âûðàæåíèé: 45 & 1 + 3 // ðàâíÿåòñÿ 4 14 - 1 / 2 // ðàâíÿåòñÿ 6 (ïîìíèòå öåëî÷èñëåííûå çíà÷åíèÿ) 1 * 2 * 3 / 2 + 4 // ðàâíÿåòñÿ 7 Ïðèìåðû ñ ïðèìåíåíèåì âåùåñòâåííûõ ÷èñåë: 3.23*1.53+2.0E2 // ðàâíÿåòñÿ 204.9419 <A href="#contents3" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=4.1> 4. Âûðàæåíèÿ. 4.1 Òèïû âûðàæåíèé. </A></B></FONT><FONT FACE="Courier"> Èìåþòñÿ òðè òèïà âûðàæåíèé â C--, íå ñ÷èòàÿ ïîñòîÿííûõ âûðàæåíèé. Ýòî âûðàæåíèÿ òèïà <b>EAX/AX/AL</b>, âûðàæåíèÿ òèïà <b>íåEAX/AX/AL</b> è óñëîâíûå âûðàæåíèÿ. Âñå C-- âûðàæåíèÿ âû÷èñëÿþòñÿ ñëåâà íàïðàâî, íåçàâèñèìî îò ñòàðøèíñòâà âõîäÿùèõ â âûðàæåíèå ìàòåìàòè÷åñêèõ îïåðàöèé. <A href="#contents4" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=4.2> 4.2 Âûðàæåíèÿ òèïà EAX/AX/AL. </A></B></FONT><FONT FACE="Courier"> Ýòîò òèï âûðàæåíèé ïðèìåíÿåòñÿ â ñëó÷àå, êîãäà åãî ðåçóëüòàò ìîæåò áûòü ñîõðàíåí â ïåðåìåííîé â ïàìÿòè èëè â ðåãèñòðå <b>EAX</b> èëè <b>AX</b> èëè <b>AL</b>. Åñëè ðåçóëüòàò ìîæåò áûòü ñîõðàíåí â ïåðåìåííûõ òèïà <b>byte</b> èëè <b>char</b>, èñïîëüçóåòñÿ íîòàöèÿ <b>AL</b>. Åñëè ðåçóëüòàò ìîæåò áûòü ñîõðàíåí â ïåðåìåííûõ òèïà <b>word</b> èëè <b>int</b>, èñïîëüçóåòñÿ íîòàöèÿ <b>AX</b>. Åñëè ðåçóëüòàò ìîæåò áûòü ñîõðàíåí â ïåðåìåííûõ òèïà <b>dword, long</b> èëè <b>float</b>, èñïîëüçóåòñÿ íîòàöèÿ <b>EAX</b>. <A href="#contents4" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=4.3> 4.3 Âûðàæåíèÿ èñïîëüçóþùèå ïîëó÷àòåëü ïðè âû÷èñëåíèè âûðàæåíèÿ. </A></B></FONT><FONT FACE="Courier"> Åñëè â ïðàâîé ÷àñòè âûðàæåíèÿ èñïîëüçóåòñÿ ïåðåìåííàÿ ÿâëÿþùàÿñÿ îäíîâðåìåííî è ïðèåìíèêîì, òî òàêèå âûðàæåíèÿ äàþò ðàçëè÷íûå ðåçóëüòàòû â çàâèñèìîñòè îò òîãî ÿâëÿåòñÿ ïðèåìíèê ðåãèñòðîì èëè ïåðåìåííîé ïàìÿòè. Ýòî ñâÿçàíî ñ òåì, ÷òî ïðè âû÷èñëåíèè âûðàæåíèÿ â ïåðåìåííóþ ïàìÿòè, âû÷èñëåíèå ïðîèçâîäèòñÿ ñíà÷àëà â ðåãèñòð <b>EAX/AX/AL</b>, è ëèøü ïîñëå îêîí÷àíèÿ âû÷èñëåíèÿ ðåçóëüòàò áóäåò çàïèñàí â ïðèåìíèê. Åñëè æå ïðèåìíèêîì ÿâëÿåòñÿ ðåãèñòð, òî åãî çíà÷åíèå áóäåò ìåíÿòüñÿ ïîñëå êàæäîé îïåðàöèè âû÷èñëåíèÿ. Ïðèìåð: int var; var = BX = 2; var = 3 + var; // ðåçóëüòàòîì áóäåò 5 BX = 3 + BX; // ðåçóëüòàòîì áóäåò 6 <A href="#contents4" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=4.4> 4.4 Íå - EAX/AX/AL âûðàæåíèÿ. </A></B></FONT><FONT FACE="Courier"> Ýòîò òèï âûðàæåíèé ïðèìåíÿåòñÿ â ñëó÷àå, êîãäà åãî ðåçóëüòàò äîëæåí áûòü ñîõðàíåí â ëþáîì äðóãîì ðåãèñòðå, îòëè÷íîì îò àêêóìóëÿòîðà <b>EAX, AX</b> èëè <b>AL</b>.  ïðîöåññå âû÷èñëåíèÿ âûðàæåíèÿ ýòîãî òèïà ìåíÿåòñÿ òîëüêî ñîäåðæèìîå óêàçàííîãî ðåãèñòðà-ïîëó÷àòåëÿ, âñå äðóãèå ðåãèñòðû áóäóò ñîõðàíåíû. Åñëè ðåãèñòðîì-ïîëó÷àòåëåì ñëóæèò áàéòîâûé ðåãèñòð, à ïðè âû÷èñëåíèè èñïîëüçóþòñÿ âåëè÷èíû ðàçìåðîì â ñëîâî, îäíîâðåìåííî ñ çàïèñüþ â ìëàäøèé áàéò ìîæåò áûòü ðàçðóøåíî ñîäåðæèìîå ñòàðøåãî áàéòà ðåãèñòðà-ïîëó÷àòåëÿ. Ýòî îáñòîÿòåëüñòâî íàêëàäûâàåò íåêîòîðûå îãðàíè÷åíèÿ íà îïåðàöèè è îïåðàíäû, äîïóñòèìûå â âûðàæåíèÿõ òèïà <b>íå EAX/AX/AL</b>. Âíóòðè âûðàæåíèé áàéòîâîãî òèïà íå äîïóñêàåòñÿ: - äåëàòü âûçîâû ÌÀÊÐÎÊÎÌÀÍÄ, - äåëàòü âûçîâû ÐÅÃÈÑÒÐÎÂÛÕ ïðîöåäóð - äåëàòü âûçîâû ÑÒÅÊÎÂÛÕ ïðîöåäóð Ðàíåå â <b>íå-EAX/AX/AL</b> âûðàæåíèÿõ áûëî ìîæíî èñïîëüçîâàòü ëèøü îïåðàöèè: ñëîæåíèÿ, âû÷èòàíèÿ, XOR, OR, AND. Òåïåðü äëÿ 16 è 32 áèòíûõ ðåãèñòðîâ ïî÷òè âñå îãðàíè÷åíèÿ ñíÿòû. Íî åñòü åùå îãðàíè÷åíèÿ íà ðåãèñòðû. Íàïðèìåð, åñëè â âûðàæåíèè èñïîëüçóåòñÿ ñäâèã íà çíà÷åíèå ïåðåìåííîé, à ïðèåìíèêîì ÿâëÿþòñÿ ðåãèñòðû <b>CX/ECX,</b> òî òàêîå âûðàæåíèå êîìïèëÿòîð íå áóäåò êîìïèëèðîâàòü: CX = var * SI * 3 * var >> 3; //âûçîâåò ñîîáùåíèå îá îøèáêå Ïðèìå÷àíèå: äëÿ 8 áèòíûõ <b>íå-AL</b> âûðàæåíèé óìíîæàòü ìîæíî òîëüêî íà ÷èñëà: 0, 1, 2, 4, 8, 16, 32, 64 è 128. Âñå ýòè îãðàíè÷åíèÿ ñâÿçàíû ñî ñòðåìëåíèåì íå ðàçðóøàòü äðóãèå ðåãèñòðû ïðè èñïîëüçîâàíèè <b>íå-EAX/AX/AL</b> âûðàæåíèé. <A href="#contents4" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=4.5> 4.5 Óñëîâíûå âûðàæåíèÿ. </A></B></FONT><FONT FACE="Courier"> Óñëîâíûå âûðàæåíèÿ - âûðàæåíèÿ, ðåçóëüòàòîì âû÷èñëåíèÿ êîòîðûõ ÿâëÿåòñÿ ëîãè÷åñêîå çíà÷åíèå äà èëè íåò, èñïîëüçóåìîå â îïåðàòîðå <b>if</b> è öèêëàõ <b>do {}</b> <b>while, while, for</b>. Èìåþòñÿ äâà òèïà óñëîâíûõ âûðàæåíèé, ïðîñòûå è ñëîæíûå. Âîçìîæíî ëîãè÷åñêîå îáúåäèíåíèå óñëîâèé. <A href="#contents4" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=4.5.1> 4.5.1 Ïðîñòûå óñëîâíûå âûðàæåíèÿ. </A></B></FONT><FONT FACE="Courier"> Ïðîñòûå óñëîâíûå âûðàæåíèÿ - îäèíî÷íàÿ ëåêñåìà èëè âûðàæåíèå, êîòîðîå ïðèìåò çíà÷åíèå äà, åñëè ðàñ÷åòíîå çíà÷åíèå îòëè÷íî îò íóëÿ, èëè çíà÷åíèå íåò, åñëè ðàñ÷åòíîå çíà÷åíèå ðàâíî íóëþ. <A href="#contents4" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=4.5.2> 4.5.2 Ñëîæíûå óñëîâíûå âûðàæåíèÿ. </A></B></FONT><FONT FACE="Courier"> Ñëîæíûå óñëîâíûå âûðàæåíèÿ èìåþò ñëåäóþùóþ ôîðìó: (ëåâàÿ_÷àñòü îïåðàòîð_îòíîøåíèÿ ïðàâàÿ_÷àñòü) Ãäå: ëåâàÿ_÷àñòü - ëþáîå âûðàæåíèå òèïà <b>AL/AX/EAX</b> èëè ïîñòîÿííîå âûðàæåíèå. Òèï âûðàæåíèÿ îïðåäåëÿåòñÿ ïî òèïó ïåðâîé ëåêñåìû (ðåãèñòðà èëè ïåðåìåííîé); çíà÷åíèå òèïà ïî óìîë÷àíèþ - word äëÿ 16-áèòíûõ ïðîãðàìì è dword äëÿ 32-áèòíûõ. Åñëè æåëàòåëåí äðóãîé òèï, ïåðåä âûðàæåíèåì ñòàâèòñÿ ñîîòâåòñòâóþùåå êëþ÷åâîå ñëîâî, îïðåäåëÿþùåå åãî òèï: <b>byte, char, int, long, dword</b> èëè <b>float</b> îïåðàòîð_îòíîøåíèÿ - ëþáîé èç îïåðàòîðîâ îòíîøåíèÿ: <b>==, !=, <>, <, >, <=, èëè >=</b>. ïðàâàÿ_÷àñòü - ëþáîé îäèíî÷íûé ðåãèñòð, îäèíî÷íàÿ ïåðåìåííàÿ èëè ïîñòîÿííîå âûðàæåíèå. Ïðèìåðû ïðàâèëüíûõ ñëîæíûõ óñëîâíûõ âûðàæåíèé: (X + y > z) (int CX*DX < = 12*3) (byte first*second+hold == cnumber) Ïðèìåðû íåäîïóñòèìûõ ñëîæíûõ óñëîâíûõ âûðàæåíèé: (x+y >= x-y) // ïðàâàÿ ÷àñòü íå ÿâëÿåòñÿ îäèíî÷íîé ëåêñåìîé èëè ïîñòîÿííûì âûðàæåíèåì. (Z = y) // âìåñòî == îøèáî÷íî ïîñòàâëåí = <A href="#contents4" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=4.6> 4.6 Èçìåíåíèå òèïà âûðàæåíèÿ ïðè ïðèñâàèâàíèè. </A></B></FONT><FONT FACE="Courier"> Åñëè ïîñëå çíàêà ðàâåíñòâà íàïèñàòü òèï îòëè÷íûé îò òèïà âû÷èñëÿåìîé ïåðåìåííîé, òî âñå ïåðåìåííûå ó÷àñòâóþùèå â ïðîöåññå âû÷èñëåíèÿ, áóäóò ïðåîáðàçîâûâàòüñÿ ê ýòîìó íîâîìó òèïó, è ëèøü êîíå÷íûé ðåçóëüòàò áóäåò ïðåîáðàçîâàí ê òèïó âû÷èñëÿåìîé ïåðåìåííîé. Ïðèìåð: int i, a; long b; char c; i = a * b + c ; Çíà÷åíèÿ ïåðåìåííûõ a, b, è c â ýòîì ïðèìåðå ïåðåä âû÷èñëåíèåì áóäóò ïðåîáðàçîâàíû ê òèïó <b>int</b> (òèïó ïåðåìåííîé i). Íî åñëè çàïèñàòü ýòî âûðàæåíèå âîò òàê: i = long a * b + c ; òî ïåðåìåííûå a, b, è c â ýòîì ïðèìåðå ïåðåä âû÷èñëåíèåì áóäóò ïðåîáðàçîâàíû ê òèïó <b>long</b>, à êîíå÷íûé ðåçóëüòàò áóäåò ïðåîáðàçîâàí ê òèïó ïåðåìåííîé i - <b>int</b>. <A href="#contents4" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=4.7> 4.7 Âû÷èñëåíèå â ðåãèñòðû EAX/AX/AL ñî çíàêîì. </A></B></FONT><FONT FACE="Courier"> Ïî óìîë÷àíèþ âñå âû÷èñëåíèÿ â ðåãèñòðû ïðîèçâîäÿòñÿ êàê ñ áåç çíàêîâûìè âåëè÷èíàìè. Íàïðèìåð: int a,b,c; AX = a * b / c ; Ïðè ýòîì êîìïèëÿòîð ãåíåðèðîâàë áåç çíàêîâûå èíñòðóêöèè <b>div</b> è <b>mul</b>, òàê êàê ðåãèñòðû ñ÷èòàþòñÿ áåç çíàêîâûìè ïåðåìåííûìè. Åñëè íàïèñàòü âîò òàê: AX = int a * b / c ; òî êîìïèëÿòîð ñãåíåðèðóåò èíñòðóêöèè <b>idiv</b> è <b>imul</b>. Îáðàùàþ âàøå âíèìàíèå, ÷òî äëÿ ðåãèñòðà <b>AL</b> ìîæíî èñïîëüçîâàòü òîëüêî ìîäèôèêàòîð <b>char</b>, äëÿ <b>AX</b> ñîîòâåòñòâåííî òîëüêî <b>int</b>, à äëÿ <b>EAX - long</b>. Äëÿ îñòàëüíûõ ðåãèñòðîâ ïîäîáíîå äåëàòü íåëüçÿ. <A href="#contents4" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=5.1> 5. Èäåíòèôèêàòîðû. 5.1 Ôîðìàò èäåíòèôèêàòîðà. </A></B></FONT><FONT FACE="Courier"> Èäåíòèôèêàòîðû â C-- äîëæíû íà÷èíàòüñÿ èëè ñ ñèìâîëà ïîä÷åðêèâàíèÿ <b>_</b> èëè çàãëàâíûõ èëè ñòðî÷íûõ áóêâ. Ñëåäóþùèå ñèìâîëû ìîãóò áûòü ëþáîé êîìáèíàöèåé ñèìâîëîâ ïîä÷åðêèâàíèÿ, çàãëàâíûõ èëè ñòðî÷íûõ áóêâ èëè ÷èñåë (îò 0 äî 9). Îáùàÿ äëèíà èäåíòèôèêàòîðà íå ìîæåò ïðåâûøàòü 64 ñèìâîëà. Ñèìâîëû ñ êîäîì áîëüøå 0x7A (êîä ñèìâîëà <b>z</b>) íåäîïóñòèìû. Ïðèìåðû äîïóñòèìûõ èäåíòèôèêàòîðîâ: _DOG Loony12 HowdYBoys_AND_Girls WOW___ X Ïðèìåðû íåäîïóñòèìûõ èäåíòèôèêàòîðîâ: 12bogus /* íå ìîæåò íà÷èíàòüñÿ ñ ÷èñëà */ WowisthisalongidentifieryupitsureisnotOyoulengthismorethat64chars /*äëèíà èäåíòèôèêàòîðà ïðåâûøàåò 64 */ Y_es sir /* ïðîáåëû íåäîïóñòèìû */ The-end /* äåôèñû íåäîïóñòèìû */ <A href="#contents5" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=5.2> 5.2 Çàðåçåðâèðîâàííûå èäåíòèôèêàòîðû. </A></B></FONT><FONT FACE="Courier"> Ñïèñîê çàðåçåðâèðîâàííûõ â C-- èäåíòèôèêàòîðîâ, êîòîðûå íå ìîãóò èñïîëüçîâàòüñÿ êàê îáùèå èäåíòèôèêàòîðû, ïîñêîëüêó îíè óæå áûëè îïðåäåëåíû èëè çàðåçåðâèðîâàíû äëÿ äðóãèõ öåëåé: <b>BREAK CASE CONTINUE ELSE EXTRACT FALSE FOR FROM GOTO IF LOOPNZ RETURN SWITCH TRUE WHILE CARRYFLAG MINUSFLAG NOTCARRYFLAG NOTOVERFLOW NOTZEROFLAG OVERFLOW PLUSFLAG ZEROFLAG __CODEPTR__ __COMPILER__ __DATAPTR__ __DATESTR__ __DATE__ __DAY__ __HOUR__ __LINE__ __MINUTE__ __MONTH__ __POSTPTR__ __SECOND__ __TIME__ __VER1__ __VER2__ __WEEKDAY__ __YEAR__ _export asm break byte case cdecl char continue default do dword else enum extern far fastcall float for goto if inline int interrupt long loop loopnz pascal return short signed sizeof static stdcall struct switch union unsigned void while word ESCHAR ESBYTE ESINT ESWORD ESLONG ESDWORD ESFLOAT CSCHAR CSBYTE CSINT CSWORD CSLONG CSDWORD CSFLOAT SSCHAR SSBYTE SSINT SSWORD SSLONG SSDWORD SSFLOAT DSCHAR DSBYTE DSINT DSWORD DSLONG DSDWORD DSFLOAT FSCHAR FSBYTE FSINT FSWORD FSLONG FSDWORD FSFLOAT GSCHAR GSBYTE GSINT GSWORD GSLONG GSDWORD GSFLOAT AX CX DX BX SP BP SI DI EAX ECX EDX EBX ESP EBP ESI EDI AL CL DL BL AH CH DH BH ES CS SS DS FS GS ST(0) ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7) ST st(0) st(1) st(2) st(3) st(4) st(5) st(6) st(7) st </b> Ýòîò ñïèñîê ìîæåò áûòü ïîëó÷åí èç C-- òðàíñëÿòîðà â ëþáîå âðåìÿ, çàïóñêîì åãî ñ îïöèåé <b>/WORDS</b> èç êîìàíäíîé ñòðîêè. Åñëè Âû ïîëüçóåòåñü ïðè êîìïèëÿöèè îïöèåé êîìàíäíîé ñòðîêè <b>/ia</b>, êîòîðàÿ ïîçâîëÿåò èñïîëüçîâàòü àññåìáëåðíûå èíñòðóêöèè íå çàêëþ÷àÿ èõ â áëîêè <b>asm</b> è áåç ïðåôèêñà <b>$</b>, òî âñå èìåíà àññåìáëåðíûõ èíñòðóêöèé ñòàíîâÿòñÿ çàðåçåðâèðîâàííûìè ñëîâàìè. Ïðè÷åì èìåíà àññåìáëåðíûõ èíñòðóêöèé êîìïèëÿòîð ðàçëè÷àåò íåçàâèñèìî îò òîãî, íàïèñàíû îíè ìàëåíüêèìè èëè áîëüøèìè áóêâàìè. Ñïèñîê èìåí ïîääåðæèâàåìûõ êîìïèëÿòîðîì àññåìáëåðíûõ èíñòðóêöèè ìîæíî ïîëó÷èòü çàïóñòèâ êîìïèëÿòîð ñ îïöèåé <b>/LAI</b>. Êðîìå ýòîãî â àññåìáëåðíûõ èíñòðóêöèÿõ ñòàíîâÿòñÿ çàðåçåðâèðîâàííûìè ñëåäóþùèå èäåíòèôèêàòîðû: <b>ax cx dx bx sp bp si di eax ecx edx ebx esp ebp esi edi al cl dl bl ah ch dh bh es cs ss ds fs gs DR0 DR1 DR2 DR3 DR4 DR5 DR6 DR7 CR0 CR1 CR2 CR3 CR4 CR5 CR6 CR7 TR0 TR1 TR2 TR3 TR4 TR5 TR6 TR7 MM0 MM1 MM2 MM3 MM4 MM5 MM6 MM7 XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 dr0 dr1 dr2 dr3 dr4 dr5 dr6 dr7 cr0 cr1 cr2 cr3 cr4 cr5 cr6 cr7 tr0 tr1 tr2 tr3 tr4 tr5 tr6 tr7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 </b><A href="#contents5" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=5.3> 5.3 Óíèâåðñàëüíûå ðåãèñòðû äëÿ 16 è 32-áèòíîãî ðåæèìà. </A></B></FONT><FONT FACE="Courier"> Ïðè ñîçäàíèè áèáëèîòå÷íûõ ïðîöåäóð î÷åíü ÷àñòî ïðèõîäèòñÿ ïèñàòü âàðèàíòû ïðîöåäóðû äëÿ ðàáîòû â 16-áèòíîì è 32-áèòíîì ðåæèìàõ, êîòîðûå îòëè÷àþòñÿ äðóã îò äðóãà ëèøü èñïîëüçîâàíèåì â íèõ ëèáî 16-áèòíûõ ëèáî 32-áèòíûõ ðåãèñòðîâ ñîîòâåòñòâåííî. Íî ìîæíî ïèñàòü ëèøü îäíó ïðîöåäóðó, èñïîëüçóÿ â íåé íîâûé ñèíòàêñèñ ðåãèñòðîâ. Åñëè êîìïèëÿòîð âñòðåòèò âîò òàêîé ñèíòàêñèñ: (E)AX=0; òî êîìïèëÿòîð áóäåò èñïîëüçîâàòü ïðè êîìïèëÿöèè 16-áèòíîãî êîäà ðåãèñòð <b>AX</b>, à ïðè êîìïèëÿöèè 32-áèòíîãî êîäà ðåãèñòð <b>EAX</b>. Èñïîëüçîâàíèå àâòîìàòè÷åñêèõ ðåãèñòðîâ ïîçâîëèò óïðîñòèòü áèáëèîòå÷íûå ôàéëû è ñäåëàòü èõ áîëåå ïîíÿòíûìè. <A href="#contents5" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=5.4> 5.4 Ïðåäîïðåäåëåííûå èäåíòèôèêàòîðû. </A></B></FONT><FONT FACE="Courier"> Èäåíòèôèêàòîðû, îïðåäåëÿåìûå êîìïèëÿòîðîì â çàâèñèìîñòè îò ðåæèìà êîìïèëÿöèè: <b>__TLS__</b> èäåò êîìïèëÿöèÿ ïîä windows (w32, w32c, dll). <b>__DLL__</b> èäåò êîìïèëÿöèÿ dll. <b>__CONSOLE__</b> èäåò êîìïèëÿöèÿ êîíñîëüíîãî ïðèëîæåíèÿ windows <b>__WIN32__</b> èäåò êîìïèëÿöèÿ GUI-øíîãî ïðèëîæåíèÿ <b>__FLAT__</b> êîìïèëèðóåòñÿ 32-áèòíûé êîä. <b>__MSDOS__</b> êîìïèëèðóåòñÿ 16-áèòíûé êîä. <b>__TINY__</b> èñïîëüçóåòñÿ ìîäåëü ïàìÿòè tiny â 16-áèòíîì ðåæèìå <b>__SMALL__</b> èñïîëüçóåòñÿ ìîäåëü ïàìÿòè small â 16-áèòíîì ðåæèìå <b>__DOS32__</b> êîìïèëèðóåòñÿ 32-áèòíûé êîä ïîä DOS (d32) <b>__COM__</b> êîìïèëèðóåòñÿ com-ôàéë <b>__SYS__</b> êîìïèëèðóåòñÿ sys-ôàéë <b>__ROM__</b> êîìïèëèðóåòñÿ rom-ôàéë <b>__OBJ__</b> êîìïèëèðóåòñÿ obj-ôàéë <b>__TEXE__</b> êîìïèëèðóåòñÿ exe-ôàéë ìîäåëè tiny <b>__EXE__</b> êîìïèëèðóåòñÿ exe-ôàéë ìîäåëè small <b>__MEOS__</b> êîìïèëèðóåòñÿ èñïîëíÿåìûé ôàéë äëÿ MenuetOS <b>codesize</b> êîìïèëÿöèÿ âåäåòñÿ ñ îïòèìèçàöèåé íà ðàçìåð êîäà <b>speed</b> êîìïèëÿöèÿ âåäåòñÿ ñ îïòèìèçàöèåé íà áûñòðîäåéñòâèå êîäà <b>cpu</b> îïðåäåëÿåò òèï ïðîöåññîðà äëÿ êîòîðîãî âåäåòñÿ êîìïèëÿöèÿ: 0 - 8086 1 - 80186 2 - 80286 3 - 80386 4 - 80486 5 - Pentium 6 - Pentium MMX 7 - Pentium II Ýòè èäåíòèôèêàòîðû ìîãóò áûòü ïðîâåðåíû äèðåêòèâàìè <b>#ifdef</b> èëè <b>#ifndef</b>. Èäåíòèôèêàòîð <b>cpu</b> ìîæåò áûòü èñïîëüçîâàí ëèøü ñ îïåðàòîðàìè ïðîâåðêè óñëîâèé: #ifdef cpu > 3 //åñëè òèï ïðîöåññîðà áîëüøå 80386 <A href="#contents5" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.1> 6. Ïåðåìåííûå. 6.1 Òèïû ïåðåìåííûõ. </A></B></FONT><FONT FACE="Courier">  C-- èìååòñÿ ñåìü òèïîâ ïåðåìåííûõ (èìåíîâàííûõ îáëàñòåé ïàìÿòè), ýòî: <b>byte, word, dword, char, int, long, float.</b> Ñëåäóþùàÿ òàáëèöà ïîêàçûâàåò ðàçìåð è äèàïàçîí ïðåäñòàâëÿåìûõ âåëè÷èí êàæäîãî èç òèïîâ ïåðåìåííîé: NAME | SIZE | VALUE RANGE | VALUE RANGE òèï |ðàçìåð | äèàïàçîí ïðåäñòàâëåíèÿ | äèàïàçîí ïðåäñòàâëåíèÿ |â áàéò.| â äåñÿòè÷íîé ñèñòåìå | â øåñòíàäöàòåðè÷íîé ñèñòåìå --------------------------------------------------------------------------- byte | 1 | 0 to 255 | 0x00 to 0xFF word | 2 | 0 to 65535 | 0x0000 to 0xFFFF dword | 4 | 0 to 4294967295 | 0x00000000 to 0xFFFFFFFF char | 1 | -128 to 127 | 0x80 to 0x7F int | 2 | -32768 to 32767 | 0x8000 to 0x7FFF long | 4 | -2147483648 to 2147483647 | 0x80000000 to 0x7FFFFFFF float | 4 | -3,37E38 to +3,37E38 | 0xFF7FFFFF to 0x7FFFFFFF Ïðèìå÷àíèå: äëÿ ðàáîòû ñ òèïàìè <b>float, dword è long</b> èñïîëüçóþòñÿ 32-ðàçðÿäíûå öåëî÷èñëåííûå êîìàíäû, ñëåäîâàòåëüíî, äëÿ èõ âûïîëíåíèÿ íóæíî èìåòü ïðîöåññîð íå õóæå 80386, ÷òî ñåé÷àñ íå ÿâëÿåòñÿ áîëüøîé ïðîáëåìîé. Äëÿ ñîâìåñòèìîñòè ñî ñòàíäàðòîì, ïðèíÿòîì â ÿçûêå <b>C</b>, ââåäåíû íîâûå çàðåçåðâèðîâàííûå ñëîâà: <b>short</b>, <b>signed</b>, <b>unsigned</b>. Äëÿ òèïà <b>int</b> â 32-áèòíîì ðåæèìå èçìåíåíà ðàçðÿäíîñòü. Âîò òàáëèöà âñåõ âàðèàíòîâ íîâûõ òèïîâ äàííûõ: --------------------------------------------------------- | ïîëíûé òèï |äîïóñòèìûå ñîêðàùåíèÿ|ñòàðûå àíàëîãè| --------------------------------------------------------- |signed char |char | char | |signed int |signed, int | int/long | |signed short int |short, signed short | int | |signed long int |long, signed long | long | |unsigned char |--- | byte | |unsigned int |unsigned | word/dword | |unsigned short int|unsigned short | word | |unsigned long int |unsigned long | dword | --------------------------------------------------------- Ñòàðûå òèïû <b>byte, word è dword</b> ïîääåðæèâàþòñÿ ïî ïðåæíåìó è èìåþò ôóíêöèîíàëüíî ïðåæíåå çíà÷åíèå. Èçìåíåíèÿ êîñíóëèñü ëèøü òèïà <b>int</b>. Îí â 16-áèòíîì ðåæèìå, òàêæå êàê è òèï <b>unsigned int</b>, èìååò 16-áèòíûé ðàçìåð, à â 32-áèòíîì ðåæèìå ýòè îáà òèïà èìåþò ðàçìåð â 32-áèòà. Íà ïåðâûé âçãëÿä òàêèå ñâîéñòâà òèïà <b>int</b> âíîñÿò íåêîòîðóþ ïóòàíèöó, íî ýòî äàåò áîëüøîé âûèãðûø ïðè èñïîëüçîâàíèè ýòîãî òèïà â áèáëèîòå÷íûõ ôàéëàõ, êîòîðûå ìîãóò áûòü èñïîëüçîâàíû ïðè êîìïèëÿöèè 16-áèòíûõ è 32-áèòíûõ ïðîãðàìì. <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.2> 6.2 Îáúÿâëåíèå ïåðåìåííûõ. </A></B></FONT><FONT FACE="Courier"> Ñèíòàêñèñ äëÿ îáúÿâëåíèÿ ïåðåìåííûõ ñëåäóþùèé: variable-type identifier; ãäå <b>variable-type - char, byte, int, word, long, dword</b> èëè <b>float</b>. Îäíîâðåìåííî ìîãóò áûòü îáúÿâëåíû íåñêîëüêî èäåíòèôèêàòîðîâ îäíîãî òèïà: variable-type identifier1, identifier2, ... , identifierN; Îäíîìåðíûå ìàññèâû ìîãóò áûòü îáúÿâëåíû ñëåäóþùèì îáðàçîì: variable-type identifier[elements]; ãäå <b>elements</b> - ïîñòîÿííîå âûðàæåíèå äëÿ êîëè÷åñòâà ïåðåìåííûõ ýòîãî òèïà, îáúåäèíåííûõ â ìàññèâ. Èíèöèàëèçèðîâàííûå ìàññèâû ìîæíî îáúÿâëÿòü áåç óêàçàíèÿ ÷èñëà ýëåìåíòîâ. Ïðè ýòîì áóäåò ñîçäàí ìàññèâ ïî ôàêòè÷åñêîìó ÷èñëó ýëåìåíòîâ. variable-type identifier[] = { const1, const2 }; Ïåðåìåííûå ïðè îáúÿâëåíèè ìîãóò áûòü ïðîèíèöèàëèçèðîâàíû ñëåäóþùèì îáðàçîì: variable-type identifier = value; Íåêîòîðûå ïðèìåðû ãëîáàëüíûõ îáúÿâëåíèé: byte i,j; /* îáúÿâëÿåò äâå ïåðåìåííûå òèïà byte ñ èìåíàìè i è j */ word see[10] /* îáúÿâëÿåò ìàññèâ ñ èìåíåì see, ñîñòîÿùèé èç 10 ýëåìåíòîâ òèïà word */ int h,x[27] /* îáúÿâëÿåò, ïåðåìåííóþ òèïà int ñ èìåíåì h, è ìàññèâ ñ èìåíåì x, ñîñòîÿùèé èç 27 ýëåìåíòîâ òèïà int */ long size=0; /* îáúÿâëåíà ïåðåìåííàÿ òèïà long ñ èìåíåì size è åé ïðèñâîåíî çíà÷åíèå 0. */ <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.3> 6.3 Ãëîáàëüíûå ïåðåìåííûå. </A></B></FONT><FONT FACE="Courier"> Ãëîáàëüíûå ïåðåìåííûå - ýòî ïåðåìåííûå, îáëàñòü äåéñòâèÿ êîòîðûõ ðàñïðîñòðàíÿåòñÿ íà âñþ ïðîãðàììó.  C-- èñïîëüçîâàòü ãëîáàëüíûå ïåðåìåííûå ìîæíî â ïðîöåäóðàõ, ðàñïîëîæåííûõ íèæå ìåñòà åå îáúÿâëåíèÿ. Ò.å. åñëè Âû ïèøèòå ïðîöåäóðó, â êîòîðîé èñïîëüçóåòå ïåðåìåííóþ var, à ñàìó ïåðåìåííóþ îáúÿâëÿåòå íèæå òåêñòà ïðîöåäóðû, òî êîìïèëÿòîð âûäàñò îøèáêó. Ýòî ñâÿçàíî ñ òåì, ÷òî êîìïèëÿòîð ìîæåò çíàòü òèï ïåðåìåííîé òîëüêî ïîñëå èõ îáúÿâëåíèÿ. Íî äëÿ òàêèõ ïåðåìåííûõ ìîæíî èñïîëüçîâàòü âçÿòèå èõ àäðåñà, òàê êàê àäðåñ ïåðåìåííîé íå çàâèñèò îò åãî òèïà. Ïðèìåð: void Proc(){ gvar = 0; /* êîìïèëÿòîð âûäàñò ñîîáùåíèå îá îøèáêå, ò.ê. îí åùå íå çíàåò òèïà ïåðåìåííîé gvar */ AX = #gvar; /* íåñìîòðÿ íà òî, ÷òî êîìïèëÿòîð íå çíàåò è àäðåñà ýòîé ïåðåìåííîé òàêîå âûðàæåíèå áóäåò îòêîìïèëèðîâàíî */ } int gvar; Íî âñå æå ñèòóàöèÿ íå áåçíàäåæíà è íàì óäàñòñÿ äîáèòüñÿ òîãî, ÷åãî ìû çàäóìàëè.  ýòîì íàì ïîìîæåò àëüòåðíàòèâíûé ñèíòàêñèñ îáðàùåíèÿ ê ïåðåìåííûì: void Proc(){ DSINT[#gvar] = 0; /* êîìïèëÿòîð óñïåøíî îòêîìïèëèðóåò ýòî âûðàæåíèå ò.ê. åìó òåïåðü èçâåñòåí òèï ïåðåìåííîé gvar */ } int gvar; Ïàìÿòü ïîä ãëîáàëüíûå ïåðåìåííûå âûäåëÿåòñÿ â ñåãìåíòå äàííûõ. Åñëè ïåðåìåííàÿ ïðè îáúÿâëåíèè èíèöèàëèçèðóåòñÿ (ò.å. åé ïðèñâîåíî êàêîå-òî çíà÷åíèå), òî ïåðåìåííàÿ áóäåò âêëþ÷åíà â êîä êîìïèëèðóåìîãî ôàéëà. Åñëè ïåðåìåííàÿ íå èíèöèàëèçèðóåòñÿ, òî ìåñòî äëÿ ïåðåìåííîé áóäåò çàðåçåðâèðîâàíî ñðàçó æå çà ïîñëåäíèì áàéòîì ñêîìïèëèðîâàííîé ïðîãðàììû. <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.4> 6.4 Ëîêàëüíûå ïåðåìåííûå. </A></B></FONT><FONT FACE="Courier"> Ëîêàëüíûå ïåðåìåííûå - ýòî ïåðåìåííûå îáëàñòü äåéñòâèÿ êîòîðûõ ðàñïðîñòðàíÿåòñÿ ëèøü â ïðåäåëàõ îäíîé ïðîöåäóðû. Îáúÿâëÿòü ëîêàëüíûå ïåðåìåííûå, â îòëè÷èè îò ñîâðåìåííûõ âåðñèé <b>C</b>, ìîæíî ìåæäó èìåíåì ïðîöåäóðû è ïåðâîé îòêðûâàþùåéñÿ ôèãóðíîé ñêîáêîé. Ïðèìåð: void PROC () int i; //îáúÿâëåíà ëîêàëüíàÿ ïåðåìåííàÿ òèïà int ñ èìåíåì i { for ( i=0; i<10; i++ ) WRITE(1); } Ïàìÿòü ïîä ëîêàëüíûå ïåðåìåííûå îòâîäèòñÿ â ñåãìåíòå ñòåêà. Ê ëîêàëüíûì ïåðåìåííûì ìîæíî îòíåñòè è ïàðàìåòðû ñòåêîâûõ ïðîöåäóð. Ïîä íèõ òàêæå îòâîäèòñÿ ïàìÿòü â ñòåêå. Ìîæíî èíèöèàëèçèðîâàòü ëîêàëüíûå ïåðåìåííûå ïðè èõ îáúÿâëåíèè. Íî åñòü íåêîòîðûå îãðàíè÷åíèÿ. Íåëüçÿ èíèöèàëèçèðîâàòü ìàññèâû è ìíîãîìåðíûå ñòðóêòóðû. Èíèöèàëèçèðîâàòü ìîæíî îäíèì çíà÷åíèåì, ò.å íåëüçÿ ïðè èíèöèàëèçàöèè ëîêàëüíûõ ïåðåìåííûõ ïîëüçîâàòüñÿ ïåðå÷èñëåíèåì çàêëþ÷åííûì â ôèãóðíûå ñêîáêè è îïåðàòîðàìè <b>FROM</b> è <b>EXTRACT</b>. Èìåíà ëîêàëüíûõ ïåðåìåííûõ ìîãóò ñîâïàäàòü ñ èìåíàìè ãëîáàëüíûõ ïåðåìåííûõ èëè ïðîöåäóð, íî òîãäà Âû íå ñìîæåòå îáðàòèòüñÿ ê ãëîáàëüíîé ïåðåìåííîé èëè âûçâàòü îäíîèìåííóþ ïðîöåäóðó. Ëîêàëüíûå ïåðåìåííûå ìîæíî îáúÿâëÿòü è â íà÷àëå áëîêà ïðîöåäóðû. Íî òîëüêî äî íà÷àëà òåëà ïðîöåäóðû. Ïðèìåð: void proc(){ int locproc; // îáúÿâëåíèå ëîêàëüíîé ïðîöåäóðû locproc=0; // à òåïåðü ïîøëî òåëî ïðîöåäóðû int locproc; // à íà ýòî îáúÿâëåíèå ïåðåìåííîé êîìïèëÿòîð âûäàñò ñîîáùåíèå // îá îøèáêå, ò.ê. óæå íà÷àëîñü òåëî ïðîöåäóðû } <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.5> 6.5 Äèíàìè÷åñêèå ïåðåìåííûå è ñòðóêòóðû. </A></B></FONT><FONT FACE="Courier"> Íàðÿäó ñ óæå èçâåñòíûìè Âàì äèíàìè÷åñêèìè ïðîöåäóðàìè â C-- åñòü âîçìîæíîñòü èñïîëüçîâàòü äèíàìè÷åñêè è ïåðåìåííûå è ñòðóêòóðû. Äèíàìè÷åñêèå ïåðåìåííûå è ñòðóêòóðû îáîçíà÷àþòñÿ òàêæå êàê è äèíàìè÷åñêèå ïðîöåäóðû - ñèìâîëîì äâîåòî÷èÿ ïåðåä íà÷àëîì èõ îáúÿâëåíèÿ. È òàêæå êàê è äèíàìè÷åñêàÿ ïðîöåäóðà, äèíàìè÷åñêàÿ ïåðåìåííàÿ èëè ñòðóêòóðà áóäåò âñòàâëåíà â êîä, ëèøü â òîì ñëó÷àå, åñëè îíà áóäåò èñïîëüçîâàíà â ïðîãðàììå. Äèíàìè÷åñêèå ïåðåìåííûå è ñòðóêòóðû íàéäóò ïðèìåíåíèå â áèáëèîòåêàõ. Èñïîëüçîâàòü èõ íåïîñðåäñòâåííî â ïðîãðàììàõ íåò ñìûñëà. Ó äèíàìè÷åñêèõ ïåðåìåííûõ, ñòðóêòóð òàêæå êàê è ó ïðîöåäóð, åñòü îäèí íåäîñòàòîê - Âû íå ñìîæåòå çíàòü, â êàêîì ìåñòå îòêîìïèëèðîâàííîãî êîäà îíè áóäóò ðàñïîëîæåíû, è â êàêîì ïîðÿäêå. Íî íåîáõîäèìîñòü ýòî çíàòü áûâàåò î÷åíü ðåäêî. Äèíàìè÷åñêèå èíèöèàëèçèðîâàííûå ïåðåìåííûå è ñòðóêòóðû â ôàéëå áóäóò ðàñïîëîæåíû â åãî ñàìîì êîíöå, ïîñëå äèíàìè÷åñêèõ ïðîöåäóð. Ýòó èõ îñîáåííîñòü ìîæíî èñïîëüçîâàòü, åñëè Âàì áóäåò íåîáõîäèìî, ÷òîáû äàííûå íå áûëè ðàçáðîñàíû ñðåäè êîäà, à áûëè ñãðóïïèðîâàíû â îäíîì ìåñòå. <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.6> 6.6 Ïðèñâàèâàíèå îäíîãî çíà÷åíèÿ íåñêîëüêèì ïåðåìåííûì. </A></B></FONT><FONT FACE="Courier"> Åñëè Âàì íåîáõîäèìî ïðèñâîèòü íåñêîëüêèì ïåðåìåííûì îäèíàêîâûå çíà÷åíèÿ: var1=0; var2=0; var3=0; òî òåïåðü ýòî ìîæíî çàïèñàòü áîëåå êîðîòêî: var1=var2=var3=0; Ïðè èñïîëüçîâàíèè òàêîé çàïèñè ãåíåðèðóåòñÿ áîëåå êîìïàêòíûé è áîëåå áûñòðûé êîä. <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.7.1> 6.7 Ïåðåìåííûå òèïà float. 6.7.1 Ôîðìàò ïåðåìåííûõ òèïà float. </A></B></FONT><FONT FACE="Courier"> Äëÿ ïðåäñòàâëåíèÿ çíà÷åíèé ñ ïëàâàþùåé òî÷êîé â ÿçûê C-- ââåäåí òèï float. Ýòîìó òèïó ñîîòâåòñòâóåò äåéñòâèòåëüíîå ÷èñëî îäèíàðíîé òî÷íîñòè FPU. Ôîðìàò ïðåäñòàâëåíèÿ äàííûõ ñ ïëàâàþùåé òî÷êîé âêëþ÷àåò òðè ïîëÿ: çíàêà, ìàíòèññû è ïîðÿäêà. Çíàê îïðåäåëÿåòñÿ ñòàðøèì çíà÷àùèì ðàçðÿäîì. Ïîëå ìàíòèññû ñîäåðæèò çíà÷àùèå áèòû ÷èñëà, à ïîëå ïîðÿäêà ñîäåðæèò ñòåïåíü 2 è îïðåäåëÿåò ìàñøòàáèðóþùèé ìíîæèòåëü äëÿ ìàíòèññû. 31 30.....23 22........0 | | | | | | | | -------------- - ïîëå ìàíòèññû | ------------------------ - ïîëå ïîðÿäêà --------------------------- - áèò çíàêà <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.7.2> 6.7.2 Êîíñòàíòû ñ ïëàâàþùåé òî÷êîé. </A></B></FONT><FONT FACE="Courier"> Êîìïèëÿòîð îòëè÷àåò âåùåñòâåííîå ÷èñëî îò öåëîãî ïî íàëè÷èþ â íåì òî÷êè. Íà÷èíàòüñÿ âåùåñòâåííîå ÷èñëî äîëæíî ëèáî öèôðîé îò <b>0</b> äî <b>9</b>, ëèáî çíàêîì ìèíóñ. Íåîáÿçàòåëüíîé ÷àñòüþ âåùåñòâåííîãî ÷èñëà ÿâëÿåòñÿ ïîêàçàòåëü ñòåïåíè. Ïîêàçàòåëü ñòåïåíè îòäåëÿåòñÿ îò ÷èñëà ñèìâîëîì <b>e</b> èëè <b>E</b>. Ïðîáåëû íåäîïóñòèìû. Âîò ïðèìåðû äîïóñòèìîãî ñèíòàêñèñà: 0.98 -15.75 3.14e2 1.234567E-20 <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.7.3> 6.7.3 Äèàïàçîí äîïóñòèìûõ çíà÷åíèé. </A></B></FONT><FONT FACE="Courier"> Âåùåñòâåííîå ÷èñëî òèïà float ìîæåò íàõîäèòüñÿ â äèàïàçîíå îò 3.37E38 äî -3.37E38. Ìèíèìàëüíî áëèçêîå ê íóëþ çíà÷åíèå ðàâíÿåòñÿ 1.17E-38 è -1.17E-38. Çàïèñûâàòü âåùåñòâåííîå ÷èñëî îäèíàðíîé òî÷íîñòè áîëåå ÷åì 8 öèôðàìè íå èìååò ñìûñëà. Ïîêàçàòåëü ñòåïåíè ìîæåò ïðèíèìàòü çíà÷åíèÿ îò +38 äî -38. <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.7.4> 6.7.4 Ìàòåìàòè÷åñêèå îïåðàöèè. </A></B></FONT><FONT FACE="Courier"> Êîìïèëÿòîð ïîääåðæèâàåò 4 îñíîâíûõ äåéñòâèÿ íàä ïåðåìåííûìè òèïà float: ñëîæåíèå, âû÷èòàíèå, óìíîæåíèå è äåëåíèå. Ïîääåðæèâàåòñÿ òàêæå èíêðåìåíò (var++ - óâåëè÷åíèå íà 1), äåêðåìåíò (var-- - óìåíüøåíèå íà 1), ñìåíà çíàêà (-var) è îáìåí çíà÷åíèÿìè (var1 >< var2). Îñòàëüíûå ìàòåìàòè÷åñêèå îïåðàöèè áóäóò ðåàëèçîâàíû ëèáî óæå ðåàëèçîâàíû âî âíåøíèõ áèáëèîòåêàõ. Ïðè âû÷èñëåíèè çíà÷åíèÿ ïåðåìåííîé <b>float</b> ìîæíî èñïîëüçîâàòü è ïåðåìåííûå äðóãèõ òèïîâ, îíè áóäóò àâòîìàòè÷åñêè ïðåîáðàçîâàíû â òèï <b>float</b>. <font color="Red"><b>ÂÍÈÌÀÍÈÅ! Ñîñòàâíûå ìàòåìàòè÷åñêèå îïåðàöèè âûïîëíÿþòñÿ â òîì ïîðÿäêå, â êîòîðîì îíè çàïèñàíû, íåâçèðàÿ íà ïðàâèëà àðèôìåòèêè</b></font>. <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.7.5> 6.7.5 Ïðåîáðàçîâàíèÿ òèïîâ. </A></B></FONT><FONT FACE="Courier"> Ïðè ìàòåìàòè÷åñêèõ îïåðàöèÿõ êîíå÷íûì èòîãîì êîòîðûõ ÿâëÿåòñÿ ïåðåìåííàÿ òèïà <b>float</b>, âñå îïåðàíäû äðóãèõ òèïîâ ïåðåä âû÷èñëåíèåì áóäóò ïðåîáðàçîâàíû â òèï <b>float</b>. Ïðè ïðèñâàèâàíèè ïåðåìåííîé òèïà <b>float</b> çíà÷åíèÿ ïåðåìåííîé äðóãîãî òèïà îíî òàêæå áóäåò ïðåîáðàçîâàíî â òèï <b>float</b>. Åñëè ïðè öåëî÷èñëåííûõ âû÷èñëåíèÿõ îäíèì èç îïåðàíäîâ áóäåò ïåðåìåííàÿ òèïà <b>float</b>, òî èç íåãî áóäåò âûäåëåíà öåëàÿ ÷àñòü, êîòîðàÿ è ïðèìåò ó÷àñòèå â âû÷èñëåíèÿõ. Ïðè ïðèñâàèâàíèè öåëî÷èñëåííîé ïåðåìåííîé çíà÷åíèÿ ïåðåìåííîé òèïà <b>float</b>, èç íåå òàêæå áóäåò âûäåëåíà öåëàÿ ÷àñòü, êîòîðàÿ è áóäåò ïðèñâîåíà öåëî÷èñëåííîé ïåðåìåííîé. <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.7.6> 6.7.6 Îïåðàöèè ñðàâíåíèÿ. </A></B></FONT><FONT FACE="Courier"> Åñëè ïðè îïåðàöèè ñðàâíåíèÿ ëåâûì îïåðàíäîì ÿâëÿåòñÿ ïåðåìåííàÿ èëè âûðàæåíèå òèïà <b>float</b>, à ïðàâûì ÿâëÿåòñÿ öåëî÷èñëåííîå çíà÷åíèå, òî öåëî÷èñëåííîå çíà÷åíèå áóäåò ïðåîáðàçîâàíî â âåùåñòâåííûé òèï. Åñëè æå ëåâûì îïåðàíäîì ÿâëÿåòñÿ öåëî÷èñëåííîå âûðàæåíèå èëè ïåðåìåííàÿ, à ïðàâûì îïåðàíäîì çíà÷åíèå òèïà <b>float</b>, òî èç ïðàâîãî îïåðàíäà áóäåò âûäåëåíà öåëàÿ ÷àñòü, êîòîðàÿ è ïðèìåò ó÷àñòèå â ñðàâíåíèè. <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.7.7> 6.7.7 Ñðàâíåíèå ïåðåìåííûõ òèïà float ñ 32-áèòíûì ðåãèñòðîì. </A></B></FONT><FONT FACE="Courier">  ðåãèñòðàõ ìîãóò ñîäåðæàòüñÿ çíàêîâûå, áåç çíàêîâûå è âåùåñòâåííûå äàííûå. Ïî óìîë÷àíèþ ñ÷èòàåòñÿ, ÷òî â ðåãèñòðå íàõîäèòñÿ áåç çíàêîâîå öåëîå ÷èñëî. Ïðè ñðàâíåíèè ïåðåìåííûõ òèïà <b>float</b> ñ 32-áèòíûì ðåãèñòðîì ìîæíî óêàçûâàòü òèï äàííûõ ñîäåðæàùèõñÿ â ðåãèñòðå. Äëÿ ýòîé öåëè ìîæíî èñïîëüçîâàòü ìîäèôèêàòîðû: <b>signed, unsigned, float</b>. Ïðèìåðû: float f=1.0; void PROC() { IF( f < signed ECX) //â ðåãèñòðå ECX íàõîäèòñÿ çíàêîâîå ÷èñëî IF( unsigned EBX > f) //â ðåãèñòðå EBX íàõîäèòñÿ áåç çíàêîâîå ÷èñëî IF( f == float EAX ) //â EAX íàõîäèòñÿ ÷èñëî ôîðìàòà float } <font color="Red"><b>ÂÍÈÌÀÍÈÅ! Ïðè îïåðàöèè ñðàâíåíèÿ ñ ó÷àñòèåì ïåðåìåíîé òèïà float, ñîäåðæèìîå ðåãèñòðà AX áóäåò ðàçðóøåíî.</b></font> <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=6.8> 6.8 Óêàçàòåëè. </A></B></FONT><FONT FACE="Courier">  C-- ñåé÷àñ óêàçàòåëè ðåàëèçîâàíû íå â ïîëíîì îáúåìå. Ïîýòîìó ìíîãèå âåùè, êîòîðûå âîçìîæíû â îáû÷íûõ ÿçûêàõ <b>C</b>, çäåñü áóäóò íåäîñòóïíû. Ïðèìåð ïðèìåíåíèÿ óêàçàòåëåé â C--: char *string[4]={"string1", "string2", "string3", 0}; //ìàññèâ óêàçàòåëåé char *str="string4"; main() int i; char *tstr; { FOR(i=0; string[i]!=0; i++){ WRITESTR(string[i]); WRITELN(); } FOR(tstr=str;byte *tstr!=0; tstr++){ WRITE(byte *tstr); } } Óêàçàòåëè ìîæíî èñïîëüçîâàòü ïðè ïåðåäà÷å ïàðàìåòðîâ ïðîöåäóðàì, à â ñàìèõ ïðîöåäóðàõ â êà÷åñòâå êàê ëîêàëüíûõ, òàê è ïàðàìåòðè÷åñêèõ ïåðåìåííûõ. Óêàçàòåëè ìîæíî òàêæå èñïîëüçîâàòü â ñòðóêòóðàõ. Ìîæíî èñïîëüçîâàòü óêàçàòåëè íà óêàçàòåëè. Ââåäåíà ïîääåðæêà óêàçàòåëåé íà ïðîöåäóðû: void (*proc)(); //îáúÿâëåíèå óêàçàòåëÿ íà ïðîöåäóðó Ïî óìîë÷àíèþ óêàçàòåëè íà ïðîöåäóðó ÿâëÿþòñÿ óêàçàòåëÿìè íà ïðîöåäóðó â ñòèëå <b>pascal</b>, íåçàâèñèìî îò ðåãèñòðà, â êîòîðîì íàïèñàíî èìÿ ïðîöåäóðû è ðåæèìà êîìïèëÿöèè. Åñëè Âàì íåîáõîäèìî, ÷òîáû áûë èñïîëüçîâàí äðóãîé òèï âûçîâà, òî åãî íåîáõîäèìî óêàçàòü ïðè îáúÿâëåíèè óêàçàòåëÿ íà ïðîöåäóðó. Ïðè èíèöèàëèçàöèè óêàçàòåëåé êîìïèëÿòîð íå êîíòðîëèðóåò òî, ÷åì èíèöèàëèçèðóåòñÿ óêàçàòåëü. Ò.å. Âû ìîæåòå óêàçàòåëþ íà <b>char</b> ïðèñâîèòü óêàçàòåëü íà <b>int</b> èëè óêàçàòåëþ íà ïðîöåäóðó ïðèñâîèòü àäðåñ ïåðåìåííîé. Ýòî ìîæåò âûçâàòü îøèáêó â ðàáîòå ïðîãðàììû. <A href="#contents6" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=7.1> 7. Àäðåñàöèÿ. 7.1 Îòíîñèòåëüíàÿ àäðåñàöèÿ. </A></B></FONT><FONT FACE="Courier"> Èçíà÷àëüíî èíäåêñíûé äîñòóï ê ýëåìåíòàì â ìàññèâàõ ëþáîãî òèïà â êîìïèëÿòîðå îñóùåñòâëÿëñÿ ïîáàéòíî, íåçàâèñèìî îò îáúÿâëåííîãî òèïà äàííûõ. Èíäåêñû îãðàíè÷åíû ôîðìàòîì ïîëÿ <b>RM</b> ïðîöåññîðà 8086, òàêèì îáðàçîì, äîñòóïíû òîëüêî ñëåäóþùèå ôîðìàòû èíäåêñîâ (ãäå èíäåêñ - çíà÷åíèå 16-ðàçðÿäíîé êîíñòàíòû èëè ïîñòîÿííîãî âûðàæåíèÿ): variable[index] variable[index+BX+SI] variable[index+BX+DI] variable[index+BP+SI] variable[index+BP+DI] variable[index+SI] variable[index+DI] variable[index+BP] variable[index+BX] Íà÷èíàÿ ñ âåðñèè 0.210, ïîÿâèëàñü âîçìîæíîñòü èñïîëüçîâàòü â êà÷åñòâå èíäåêñà ïåðåìåííûõ òèïà <b>char byte int word long dword</b>. Ïðè ýòîì äîñòóï ê ýëåìåíòàì ìàññèâà îñóùåñòâëÿåòñÿ â çàâèñèìîñòè îò îáúÿâëåííîãî òèïà ìàññèâà. Òàêæå íà÷èíàÿ ñ âåðñèè 0.210 ïîÿâèëàñü âîçìîæíîñòü èñïîëüçîâàòü â êà÷åñòâå èíäåêñíûõ è áàçîâûõ ðåãèñòðîâ ïðè îòíîñèòåëüíîé àäðåñàöèè ëþáûå 32-áèòíûå ðåãèñòðû. Åñëè Âû äëÿ àäðåñàöèè ê ýëåìåíòàì ìàññèâà áóäåòå èñïîëüçîâàòü ðåãèñòðû è ÷èñëîâûå êîíñòàíòû, èç êîòîðûõ ìîæíî ïîëó÷èòü ïîëå <b>RM</b> äëÿ èíñòðóêöèé 8086 ïðîöåññîðà èëè êîìáèíàöèþ ïîëåé <b>RM BASE è SIB</b> äëÿ 80386 ïðîöåññîðà, òî êîìïèëÿòîð áóäåò èñïîëüçîâàòü ýòè ðåãèñòðû äëÿ ãåíåðàöèè èíñòðóêöèè ñ ýòèìè ïîëÿìè.  ðåçóëüòàòå Âû ïîëó÷èòå îòíîñèòåëüíóþ ïîáàéòíóþ àäðåñàöèþ ê ýëåìåíòàì ìàññèâà. Åñëè æå èç ýòèõ ðåãèñòðîâ íåâîçìîæíî ïîëó÷èòü ïîëÿ <b>RM, BASE, SIB</b>, èëè äëÿ àäðåñàöèè áóäåò èñïîëüçîâàíà ïåðåìåííàÿ, òî êîìïèëÿòîð ñíà÷àëà âû÷èñëèò ýòî âûðàæåíèå â ðåãèñòð <b>(E)SI</b> èëè äðóãîé, ïîäõîäÿùèé ðåãèñòð, à çàòåì óìíîæèò ñîäåðæèìîå ýòîãî ðåãèñòðà íà ðàçðÿäíîñòü Âàøåãî ìàññèâà. Òàêèì îáðàçîì, â ýòîì ñëó÷àå âû áóäåòå èìåòü ïîýëåìåíòíóþ àäðåñàöèþ â ìàññèâå. Ïðèìåð: AX = var [ 5 ]; AX = var [ BX + 5 ]; AX = var [ BX + CX ]; AX = var [ i ]; Êîìïèëÿòîð ñãåíåðèðóåò ñëåäóþùèé êîä: test.c-- 7: AX=var[5]; 0100 A12501 mov ax,[125h] test.c-- 8: AX=var[BX+5]; 0103 8B872501 mov ax,[bx+125h] test.c-- 9: AX=var[BX+CX]; 0107 89DE mov si,bx 0109 01CE add si,cx 010B 01F6 add si,si 010D 8B842001 mov ax,[si+120h] test.c-- 10: AX=var[i]; 0111 8B362201 mov si,[122h] 0115 01F6 add si,si 0117 8B842001 mov ax,[si+120h] Êàê Âû âèäèòå, ïåðâûå äâà âûðàæåíèÿ áûëè ïðåîáðàçîâàíû â îäíó àññåìáëåðíóþ èíñòðóêöèþ, è ïîëó÷èëàñü ïîáàéòíàÿ àäðåñàöèÿ.  äâóõ ñëåäóþùèõ âûðàæåíèÿõ ïîëó÷èòü îäíó àññåìáëåðíóþ èíñòðóêöèþ íå óäàëîñü è êîìïèëÿòîð ïðèìåíèë äëÿ ýòèõ âûðàæåíèé ïîýëåìåíòíóþ àäðåñàöèþ. Òàêîé äâîéñòâåííûé ïîäõîä ðåàëèçîâàí ñ öåëüþ ñîõðàíåíèÿ ñîâìåñòèìîñòè íîâûõ âîçìîæíîñòåé ñ ïðåäûäóùèìè. Íåñìîòðÿ íà êàæóùóþñÿ äëÿ íåèñêóøåííîãî ïîëüçîâàòåëÿ ïóòàíèöó, ýòîò ìåõàíèçì ëåãêî ïîíÿòü è çàïîìíèòü ïî ñëåäóþùåìó ïðîñòîìó ïðàâèëó: åñëè Âû èñïîëüçóåòå â êà÷åñòâå èíäåêñà òîëüêî öèôðîâîå çíà÷åíèå èëè ðåãèñòð <b>BX, SI, DI, BP</b> èëè ëþáîé 32-áèòíûé ðåãèñòð, òî êîìïèëÿòîð ñãåíåðèðóåò êîä ñ ïîáàéòíîé àäðåñàöèåé. Åñëè æå â êà÷åñòâå èíäåêñà áóäåò èñïîëüçîâàíà ïåðåìåííàÿ, òî êîìïèëÿòîð ñãåíåðèðóåò êîä ñ ïîýëåìåíòíîé àäðåñàöèåé. Åñëè æå Âû õîðîøî çíàêîìû ñ àññåìáëåðîì, òî Âàì íå ñîñòàâèò áîëüøîãî òðóäà ïîíÿòü â êàêèõ ñëó÷àÿõ Âû ïîëó÷èòå ïîáàéòíóþ, à â êàêèõ ïîýëåìåíòíóþ àäðåñàöèþ. Èíîãäà òðåáóåòñÿ èìåòü ïîáàéòíûé äîñòóï ê ýëåìåíòàì ìàññèâà èñïîëüçóÿ â êà÷åñòâå èíäåêñà ïåðåìåííóþ. Íàïðèìåð AX=var[i]; Äëÿ ýòîãî âûðàæåíèÿ áóäåò ñãåíåðèðîâàíà ïîýëåìåíòíàÿ àäðåñàöèÿ, à íàì íóæíà ïîáàéòîâàÿ. Äëÿ ýòîãî ìîæíî íàïèñàòü òàê: SI=i; AX=var[SI]; Íî ìîæíî ýòî çàïèñàòü êîðî÷å: AX=DSWORD[#var+i];  îáîèõ ýòèõ ñëó÷àÿõ Âû ïîëó÷èòå ïîáàéòíóþ àäðåñàöèþ ê ýëåìåíòàì ìàññèâà <b>var</b>.  ïåðâîì âàðèàíòå Âû ñìîæåòå êîíòðîëèðîâàòü êàêîé ðåãèñòð áóäåò èñïîëüçîâàí â êà÷åñòâå èíäåêñà, à âî âòîðîì âàðèàíòå êîìïèëÿòîð áóäåò ñàì âûáèðàòü ðåãèñòð äëÿ èñïîëüçîâàíèÿ â êà÷åñòâå èíäåêñà. Âàæíî âñåãäà ïîìíèòü î äâîéñòâåííîì ïîäõîäå êîìïèëÿòîðà ê âû÷èñëåíèþ àäðåñà â ìàññèâå. Åùå ðàç êðàòêî: åñëè Âû â ìàññèâå àäðåñóåòåñü èñïîëüçóÿ ÷èñëîâóþ êîíñòàíòó èëè ðåãèñòðû <b>BX,DI,SI,BP</b> êîìïèëÿòîð èñïîëüçóåò ýòè çíà÷åíèÿ áåç èçìåíåíèÿ. Âî âñåõ äðóãèõ ñëó÷àÿõ áóäåò êîððåêöèÿ çíà÷åíèÿ â çàâèñèìîñòè îò òèïà ìàññèâà. <A href="#contents7" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=7.2> 7.2 Àáñîëþòíàÿ àäðåñàöèÿ. </A></B></FONT><FONT FACE="Courier"> Àáñîëþòíàÿ àäðåñàöèÿ òàêæå âîçìîæíà. Äåéñòâóþò òå æå ñàìûå îãðàíè÷åíèÿ íà èíäåêñû, ÷òî è ïðè îòíîñèòåëüíîé àäðåñàöèè. Âû÷èñëåííûé èíäåêñ áóäåò àáñîëþòåí â ñåãìåíòå, ðåãèñòð êîòîðîãî óêàçàí. Ìîæíî óêàçûâàòü ëþáîé èç ðåãèñòðîâ <b>DS, CS, SS è ES</b>. Íà ïðîöåññîðàõ 80386 è áîëåå íîâûõ ìîæíî óêàçûâàòü òàêæå ðåãèñòðû <b>FS è GS</b>. Ñèíòàêñèñ - òî÷íî òàêîé æå, êàê è â îòíîñèòåëüíîé àäðåñàöèè, çà èñêëþ÷åíèåì òîãî, ÷òî óêàçûâàåòñÿ íå ïåðåìåííàÿ, à ñåãìåíò è òèï äàííûõ. Ìîãóò ïðèìåíÿòüñÿ ñëåäóþùèå óêàçàòåëè: // àäðåñàöèÿ â ñåãìåíòå äàííûõ DSBYTE [ñìåùåíèå] // àäðåñóåò áàéò â ñåãìåíòå DS DSWORD [ñìåùåíèå] // àäðåñóåò ñëîâî â ñåãìåíòå DS DSCHAR [ñìåùåíèå] // àäðåñóåò char â ñåãìåíòå DS DSINT [ñìåùåíèå] // àäðåñóåò int â ñåãìåíòå DS DSDWORD [ñìåùåíèå] // àäðåñóåò dword â ñåãìåíòå DS DSLONG [ñìåùåíèå] // àäðåñóåò long â ñåãìåíòå DS DSFLOAT [ñìåùåíèå] // àäðåñóåò float â ñåãìåíòå DS // àäðåñàöèÿ â ñåãìåíòå êîäà CSBYTE [ñìåùåíèå] // àäðåñóåò áàéò â ñåãìåíòå CS CSWORD [ñìåùåíèå] // àäðåñóåò ñëîâî â ñåãìåíòå CS CSCHAR [ñìåùåíèå] // àäðåñóåò char â ñåãìåíòå CS CSINT [ñìåùåíèå] // àäðåñóåò int â ñåãìåíòå CS CSDWORD [ñìåùåíèå] // àäðåñóåò dword â ñåãìåíòå CS CSLONG [ñìåùåíèå] // àäðåñóåò long â ñåãìåíòå CS CSFLOAT [ñìåùåíèå] // àäðåñóåò float â ñåãìåíòå CS // àäðåñàöèÿ â ñåãìåíòå ñòåêà SSBYTE [ñìåùåíèå] // àäðåñóåò áàéò â ñåãìåíòå SS SSWORD [ñìåùåíèå] // àäðåñóåò ñëîâî â ñåãìåíòå SS SSCHAR [ñìåùåíèå] // àäðåñóåò char â ñåãìåíòå SS SSINT [ñìåùåíèå] // àäðåñóåò int â ñåãìåíòå SS SSDWORD [ñìåùåíèå] // àäðåñóåò dword â ñåãìåíòå SS SSLONG [ñìåùåíèå] // àäðåñóåò long â ñåãìåíòå SS SSFLOAT [ñìåùåíèå] // àäðåñóåò float â ñåãìåíòå SS // àäðåñàöèÿ â äîïîëíèòåëüíîì ñåãìåíòå äàííûõ ESBYTE [ñìåùåíèå] // àäðåñóåò áàéò â ñåãìåíòå ES ESWORD [ñìåùåíèå] // àäðåñóåò ñëîâî â ñåãìåíòå ES ESCHAR [ñìåùåíèå] // àäðåñóåò char â ñåãìåíòå ES ESINT [ñìåùåíèå] // àäðåñóåò int â ñåãìåíòå ES ESDWORD [ñìåùåíèå] // àäðåñóåò dword â ñåãìåíòå ES ESLONG [ñìåùåíèå] // àäðåñóåò long â ñåãìåíòå ES ESFLOAT [ñìåùåíèå] // àäðåñóåò float â ñåãìåíòå ES // àäðåñàöèÿ â äîïîëíèòåëüíîì ñåãìåíòå 2 (80386) + FSBYTE [ñìåùåíèå] // àäðåñóåò áàéò â ñåãìåíòå FS FSWORD [ñìåùåíèå] // àäðåñóåò ñëîâî â ñåãìåíòå FS FSCHAR [ñìåùåíèå] // àäðåñóåò char â ñåãìåíòå FS FSINT [ñìåùåíèå] // àäðåñóåò int â ñåãìåíòå FS FSDWORD [ñìåùåíèå] // àäðåñóåò dword â ñåãìåíòå FS FSLONG [ñìåùåíèå] // àäðåñóåò long â ñåãìåíòå FS FSFLOAT [ñìåùåíèå] // àäðåñóåò float â ñåãìåíòå FS // àäðåñàöèÿ â äîïîëíèòåëüíîì ñåãìåíòå 3 (80386) + GSBYTE [ñìåùåíèå] // àäðåñóþò áàéò â ñåãìåíòå GS GSWORD [ñìåùåíèå] // àäðåñóþò ñëîâî â ñåãìåíòå GS GSCHAR [ñìåùåíèå] // àäðåñóþò char â ñåãìåíòå GS GSINT [ñìåùåíèå] // àäðåñóþò int â ñåãìåíòå GS GSDWORD [ñìåùåíèå] // àäðåñóþò dword â ñåãìåíòå GS GSLONG [ñìåùåíèå] // àäðåñóþò long â ñåãìåíòå GS GSFLOAT [ñìåùåíèå] // àäðåñóåò float â ñåãìåíòå GS Ïðèìåðû: Çàãðóçèòü â AL áàéò èç ÿ÷åéêè ñ øåñòíàäöàòåðè÷íûì àäðåñîì 0000:0417 ES = 0x0000; AL = ESBYTE [0x417]; Ïåðåìåñòèòü ñëîâî èç ÿ÷åéêè ñ øåñòíàäöàòåðè÷íûì àäðåñîì 2233:4455 â ÿ÷åéêó ñ øåñòíàäöàòåðè÷íûì àäðåñîì A000:0002 $PUSH DS DS = 0x2233; ES = 0xA000; ESWORD [0x0002] = DSWORD [0x4455]; $POP DS Ñîõðàíèòü âû÷èñëåííîå çíà÷åíèå âûðàæåíèÿ X + 2, èìåþùåå òèï int â ÿ÷åéêå ñ øåñòíàäöàòåðè÷íûì àäðåñîì FFFF:1234 ES = 0xFFFF; ESINT [0x1234] = X + 2; Ñîõðàíèòü BX â ñåãìåíòå ñòåêà ïî ñìåùåíèþ 42: SSWORD [42] = BX; <A href="#contents7" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=8.1.1> 8. Ðàáîòà ñ áëîêàìè äàííûõ. 8.1 Ñòðóêòóðû. 8.1.1 ×òî òàêîå ñòðóêòóðû. </A></B></FONT><FONT FACE="Courier"> Ñòðóêòóðà ïîçâîëÿåò îáúåäèíèòü â îäíîì îáúåêòå ñîâîêóïíîñòü çíà÷åíèé, êîòîðûå ìîãóò èìåòü ðàçëè÷íûå òèïû. <A href="#contents8" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=8.1.2> 8.1.2 Ñèíòàêñèñ. </A></B></FONT><FONT FACE="Courier"> struct [<òåã>] { <ñïèñîê-îáúÿâëåíèé-ýëåìåíòîâ> } <îïèñàòåëü>[,<îïèñàòåëü>...]; struct <òåã> <îïèñàòåëü> [,<îïèñàòåëü>]; Îáúÿâëåíèå ñòðóêòóðû íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà struct è èìååò äâå ôîðìû çàïèñè.  ïåðâîé ôîðìå òèïû è èìåíà ýëåìåíòîâ ñòðóêòóðû ñïåöèôèöèðóþòñÿ â ñïèñêå-îáúÿâëåíèé-ýëåìåíòîâ. Íåîáÿçàòåëüíûé â äàííîì ñëó÷àå <b>òåã</b> - ýòî èäåíòèôèêàòîð, êîòîðûé èìåíóåò ñòðóêòóðíûé òèï, îïðåäåëåííûé äàííûì ñïèñêîì îáúÿâëåíèé ýëåìåíòîâ. <b>îïèñàòåëü</b> ñïåöèôèöèðóåò ëèáî ïåðåìåííóþ ñòðóêòóðíîãî òèïà, ëèáî ìàññèâ ñòðóêòóð äàííîãî òèïà. Âòîðàÿ ñèíòàêñè÷åñêàÿ ôîðìà îáúÿâëåíèÿ èñïîëüçóåò òåã ñòðóêòóðû äëÿ ññûëêè íà ñòðóêòóðíûé òèï, îïðåäåëåííûé ãäå-òî â äðóãîì ìåñòå ïðîãðàììû. Ñïèñîê îáúÿâëåíèé ýëåìåíòîâ ïðåäñòàâëÿåò ñîáîé ïîñëåäîâàòåëüíîñòü èç îäíîé èëè áîëåå îáúÿâëåíèé ïåðåìåííûõ. Êàæäàÿ ïåðåìåííàÿ, îáúÿâëåííàÿ â ýòîì ñïèñêå, íàçûâàåòñÿ ýëåìåíòîì ñòðóêòóðû. Ýëåìåíòû ñòðóêòóðû çàïîìèíàþòñÿ â ïàìÿòè ïîñëåäîâàòåëüíî â òîì ïîðÿäêå, â êîòîðîì îíè îáúÿâëÿþòñÿ. Âûðàâíèâàíèå ýëåìåíòîâ âíóòðè ñòðóêòóðû ïî óìîë÷àíèþ íå ïðîèçâîäèòñÿ. Íî ñóùåñòâóåò îïöèÿ, âêëþ÷åíèå êîòîðîé â êîìàíäíóþ ñòðîêó ïîçâîëÿåò èìåòü âûðàâíèâàíèå è âíóòðè ñòðóêòóðû. Ñàìà ñòðóêòóðà âûðàâíèâàåòñÿ íà ÷åòíûé àäðåñ åñëè âêëþ÷åíî âûðàâíèâàíèå. Ïðèìåðû îáúÿâëåíèé ñòðóêòóð: struct test { int a; char b[8]; long c; } rr, ff[4];  ýòîì ïðèìåðå îáúÿâëåíû ñòðóêòóðà ñ èìåíåì <b>rr</b> è ìàññèâ èç 4 ñòðóêòóð ñ èìåíåì <b>ff</b>. Âñåìó íàáîðó ïåðåìåííûõ ïðèñâîåíî íàçâàíèå <b>(òåã) test</b>. Ýòîò òåã ìîæíî èñïîëüçîâàòü äëÿ îáúÿâëåíèÿ äðóãèõ ñòðóêòóð. Íàïðèìåð: struct test dd; Çäåñü îáúÿâëåíà ñòðóêòóðà ñ èìåíåì <b>dd</b>, èìåþùàÿ íàáîð ýëåìåíòîâ îïèñàííûõ â òåãå <b>test</b>. Ïðè îáúÿâëåíèè ñòðóêòóð ñ ðàíåå îáúÿâëåííûì òåãîì êëþ÷åâîå ñëîâî <b>struct</b> ìîæíî íå ïèñàòü. Ò.å ìîæíî íàïèñàòü âîò òàê: test dd; <A href="#contents8" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=8.1.3> 8.1.3 Èíèöèàëèçàöèÿ ñòðóêòóð ïðè îáúÿâëåíèè. </A></B></FONT><FONT FACE="Courier"> Ïîñëå îáúÿâëåíèÿ ñòðóêòóðû åå ýëåìåíòû ìîãóò ïðèíèìàòü ïðîèçâîëüíûå çíà÷åíèÿ. ×òî áû ýòîãî íå áûëî íàäî ñòðóêòóðû ïðîèíèöèàëèçèðîâàòü. Èíèöèàëèçèðîâàòü ñòðóêòóðû ïðè èõ îáúÿâëåíèè ìîæíî òîëüêî ãëîáàëüíûå. C-- ïîääåðæèâàåò íåñêîëüêî ñïîñîáîâ èíèöèàëèçàöèè ñòðóêòóð ïðè èõ îáúÿâëåíèè: 1. Îäíèì çíà÷åíèåì: struct test dd=2;  ýòîì ïðèìåðå âñåì ýëåìåíòàì ñòðóêòóðû dd ïðèñâàèâàåòñÿ çíà÷åíèå 2. 2. Ìàññèâîì çíà÷åíèé: struct test dd={1,2,,6};  ýòîì ïðèìåðå ïåðâîìó ýëåìåíòó ñòðóêòóðû dd ïðèñâàèâàåòñÿ çíà÷åíèå 1, âòîðîìó - 2, ÷åòâåðòîìó - 6. Ïðîïóùåííûì è íå äîèíèöèàëèçèðîâàííûì çíà÷åíèÿì áóäåò ïðèñâîåíî 0 çíà÷åíèå. 3. Êîìàíäîé FROM: struct test dd=FROM "file.dat";  ýòîì ïðèìåðå íà ìåñòî ãäå ðàñïîëîæåíà ñòðóêòóðà dd ïðè êîìïèëÿöèè áóäåò çàãðóæåíî ñîäåðæèìîå ôàéëà <file.dat>. Åñëè ðàçìåð ôàéëà áîëüøå ÷åì ðàçìåð ñòðóêòóðû, òî ëèøíèå áàéòû áóäóò çàãðóæåíû â êîä ïðîãðàììû, íî îíè íå áóäóò âîñòðåáîâàíû. Åñëè ðàçìåð ôàéëà ìåíüøå ÷åì ðàçìåð ñòðóêòóðû, òî íåäîñòàþùèå áàéòû ñòðóêòóðû áóäóò çàïîëíåíû íóëÿìè. 4. Êîìàíäîé EXTRACT: struct test dd=EXTRACT "file.dat", 24, 10;  ýòîì ïðèìåðå íà ìåñòî ãäå ðàñïîëîæåíà ñòðóêòóðà dd ïðè êîìïèëÿöèè áóäåò çàãðóæåí ôðàãìåíò èç ôàéëà <b>file.dat</b> äëèíîé 10 áàéò ñî ñìåùåíèÿ 24. Íåäîñòàþùèå áàéòû áóäóò çàïîëíåíû íóëÿìè. <A href="#contents8" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=8.1.4> 8.1.4 Èíèöèàëèçàöèÿ ñòðóêòóðû ïðè âûïîëíåíèè ïðîãðàììû. </A></B></FONT><FONT FACE="Courier"> Ïðè âûïîëíåíèè ïðîãðàììû, êðîìå ïðèñâîåíèÿ êàæäîìó ýëåìåíòó ñòðóêòóðû çíà÷åíèÿ, ìîæíî ïðîèíèöèàëèçèðîâàòü âñþ ñòðóêòóðó ïðèñâîåíèåì åé ÷èñëà èëè ïåðåìåííîé. Ïðèìåðû: void proc() struct test aa[5],rr; int i; { aa[0]=0x12345678; aa[i]=int 0x12345678; aa=long 0x12345678; rr=i;  ïåðâîì ïðèìåðå ïàìÿòü, çàíèìàåìàÿ ïåðâîé ñòðóêòóðîé ìàññèâà èç 5 ñòðóêòóð, áóäåò çàïîëíåíà áàéòîì 0x78 (ïî óìîë÷àíèþ). Âî âòîðîì ïðèìåðå ïàìÿòü, çàíèìàåìàÿ (i+1)-âîé ñòðóêòóðîé ìàññèâà èç 5 ñòðóêòóð, áóäåò çàïîëíåíà ñëîâîì 0x5678.  òðåòüåì ïðèìåðå ïàìÿòü, çàíèìàåìàÿ âñåì ìàññèâîì èç 5 ñòðóêòóð, áóäåò çàïîëíåíà äëèííûì ñëîâîì 0x12345678.  ÷åòâåðòîì ïðèìåðå ïàìÿòü, çàíèìàåìàÿ ñòðóêòóðîé rr, áóäåò çàïîëíåíà ñîäåðæèìûì ïåðåìåííîé i. Ìîæíî òàêæå êîïèðîâàòü ñîäåðæèìîå îäíîé ñòðóêòóðû â äðóãóþ. Íàïðèìåð: rr=aa[2]; Áóäåò ñêîïèðîâàíî ñîäåðæèìîå òðåòüåé ñòðóêòóðû ìàññèâà ñòðóêòóð aa â ñòðóêòóðó rr. <A href="#contents8" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=8.1.5> 8.1.5 Îïåðàöèè ñ ýëåìåíòàìè ñòðóêòóð. </A></B></FONT><FONT FACE="Courier"> Ñ ýëåìåíòàìè ñòðóêòóð ìîæíî âûïîëíÿòü âñå òå îïåðàöèè, êîòîðûå äîñòóïíû äëÿ ïåðåìåííûõ ñîîòâåòñòâóþùåãî òèïà. Íàïðèìåð: Îáúÿâëåíà ñòðóêòóðà: struct test { int a; char b[8]; long c; } rr[3]; Ïðèìåð äîïóñòèìîãî ñèíòàêñèñà: rr.a = rr.b[i] * rr[1].c + i ; Ïðèìå÷àíèå: Ïðè îïåðàöèÿõ ñ ýëåìåíòàìè ìàññèâà ñòðóêòóð è ñ èíäåêñèðîâàííûìè ýëåìåíòàìè, â êîòîðûõ â êà÷åñòâå èíäåêñà èëè íîìåðà ñòðóêòóðû èñïîëüçóåòñÿ ïåðåìåííàÿ, êîìïèëÿòîð ìîæåò èñïîëüçîâàòü ðåãèñòðû SI è DI, à â íåêîòîðûõ ñèòóàöèÿõ (íàïðèìåð: rr[i].b[j] >< rr[i+1].b[j+2] ) áóäåò çàäåéñòâîâàí è ðåãèñòð DX. Äëÿ îòäåëüíûõ ýëåìåíòîâ ñòðóêòóðû, ìîæíî ïîëó÷àòü èõ àäðåñ, ðàçìåð è ñìåùåíèå â òåãå ñòðóêòóðû. Âîò ïðèìåð: struct AA //îáúÿâëåíèå òåãà ñòðóêòóðû { word a[3]; // ïåðâûé ýëåìåíò ñòðóêòóðû char b; // âòîðîé ýëåìåíò ñòðóêòóðû long c; // òðåòèé ýëåìåíò ñòðóêòóðû }; struct BB //òåã âòîðîé ñòðóêòóðû { word aa; // ïåðâûé ýëåìåíò AA bb; // âòîðîé ýëåìåíò - âëîæåííàÿ ñòðóêòóðà }ss; // îáúÿâëÿåì ñòðóêòóðó ñ òåãîì <b>BB</b> void proc() { AX=#ss.bb.b; // ïîëó÷èòü àäðåñ ýëåìåíòà <b>b</b> ñòðóêòóðû <b>bb</b> â ñòðóêòóðå <b>ss</b> AX=#BB.bb.b; // ïîëó÷èòü ñìåùåíèå ýòîãî æå ýëåìåíòà â òåãå <b>BB</b> AX=sizeof(ss.bb); // ïîëó÷èòü ðàçìåð ýëåìåíòà <b>bb</b> â ñòðóêòóðå <b>ss</b> AX=sizeof(BB.bb); // ïîëó÷èòü ðàçìåð ýëåìåíòà <b>bb</b> â òåãå <b>BB</b> } <A href="#contents8" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=8.1.6> 8.1.6 Âëîæåííûå ñòðóêòóðû. </A></B></FONT><FONT FACE="Courier"> Ïðè îáúÿâëåíèè òåãîâ ñòðóêòóð ìîæíî èñïîëüçîâàòü òåãè äðóãèõ, îáúÿâëåííûõ ðàíåå ñòðóêòóð. Ïðèìåð âëîæåííûõ ñòðóêòóð: struct RGB { byte Red; byte Green; byte Blue; byte Reserved; }; struct BMPINFO { struct BMPHEADER header; //îïèñàíèå ýòîé ñòðóêòóðû ïðîïóùåíî struct RGB color[256]; }info; Ïðåäïîëîæèì Âàì íóæíî ïîëó÷èòü ñîäåðæèìîå ïåðåìåííîé <b>Red</b> äåñÿòîãî ýëåìåíòà <b>color</b>. Ýòî ìîæíî áóäåò çàïèñàòü òàê: AL=info.color[10].Red; Íî ñóùåñòâóåò îäíî îãðàíè÷åíèå èñïîëüçîâàíèÿ âëîæåííûõ ñòðóêòóð â C--. Ýòî íåâîçìîæíîñòü èñïîëüçîâàíèÿ ïåðåìåííîé â êà÷åñòâå èíäåêñà áîëåå îäíîãî ðàçà ïðè îáðàùåíèè ê ìíîãîýêçåìïëÿðíûì ñòðóêòóðàì. Ïîÿñíèì ýòî íà ïðèìåðå: struct ABC { int a; int b; int c; }; struct { struct ABC first[4]; //4 ýêçåìïëÿðà ñòðóêòóðû ABC int d; }second[4]; int i,j; void proc() { AX=second[i].first[j].a; //òàêàÿ çàïèñü âûçîâåò ñîîáùåíèå îá îøèáêà, òàê //êàê ïåðåìåííàÿ èñïîëüçîâàëàñü â äâóõ ìåñòàõ AX=second[2].first[j].a; //à ýòîò ñèíòàêñèñ äîïóñòèì. AX=second[i].first[3].a; } <A href="#contents8" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=8.1.7> 8.1.7 Îòîáðàæåíèå òåãà ñòðóêòóðû íà áëîê ïàìÿòè. </A></B></FONT><FONT FACE="Courier"> Îòîáðàæåíèå òåãà ñòðóêòóðû íà áëîê ïàìÿòè ÿâëÿåòñÿ àëüòåðíàòèâîé óêàçàòåëÿì íà ñòðóêòóðû. Àëüòåðíàòèâíûé ñïîñîá èñïîëüçîâàíèÿ óêàçàòåëåé íà ñòðóêòóðû ïîçâîëèò Âàì ñàìèì âûáðàòü ðåãèñòð, â êîòîðîì áóäåò õðàíèòñÿ àäðåñ ñòðóêòóðû è ñàìèì ñëåäèòü çà åãî ñîõðàííîñòüþ è ïî ìåðå íåîáõîäèìîñòè âîññòàíàâëèâàòü åãî ñîäåðæèìîå. Îáúÿñíèòü, êàê èñïîëüçîâàòü îòîáðàæåíèå òåãà ñòðóêòóðû íà ïàìÿòü, íàâåðíîå, áóäåò ïðîùå íà ïðèìåðå: struct AA //îáúÿâëåíèå òåãà ñòðóêòóðû { word a[3]; // ïåðâûé ýëåìåíò ñòðóêòóðû char b; // âòîðîé ýëåìåíò ñòðóêòóðû long c; // òðåòèé ýëåìåíò ñòðóêòóðû }; byte buf[256]; //áëîê ïàìÿòè, íà êîòîðûé áóäåò îòîáðàæåí òåã ñòðóêòóðû void proc1() { ... proc2 ( #buf ); // âûçîâ ïðîöåäóðû ñ ïåðåäà÷åé åé â êà÷åñòâå ïàðàìåòðà // àäðåñà áëîêà ïàìÿòè ... } long proc2 (unsigned int pointer_to_mem) { int i; BX=pointer_to_mem; // â BX çàãðóçèì àäðåñ áëîêà ïàìÿòè FOR(i=0; i<3; i++){ // â ìàññèâ ýëåìåíòà <b>a</b> çàïèñàòü -1 BX.AA.a[i]=-1; } BX.AA.b=0; ES:BX.AA.c=EAX; return BX.AA.c; // âåðíóòü ñîäåðæèìîå ýëåìåíòà <b>c</b> }  16-áèòíîì ðåæèìå äëÿ õðàíåíèÿ àäðåñà ñòðóêòóðû ìîæíî èñïîëüçîâàòü ðåãèñòðû: <b>BX,DI,SI,BP</b>. Íî ëó÷øå äëÿ ýòîãî èñïîëüçîâàòü ðåãèñòð <b>BX</b>. Ðåãèñòðû <b>DI è SI</b> ìîæåò èñïîëüçîâàòü êîìïèëÿòîð ïðè âû÷èñëåíèè àäðåñà ìíîãîýëåìåíòíûõ îáúåêòîâ. Ðåãèñòð <b>BP</b> êîìïèëÿòîð èñïîëüçóåò äëÿ ðàáîòû ñ ëîêàëüíûìè è ïàðàìåòðè÷åñêèìè ïåðåìåííûìè.  32-áèòíîì ðåæèìå ìîæíî èñïîëüçîâàòü ëþáîé êðîìå <b>ESP è EBP</b> ðåãèñòð, à ðåãèñòðû <b>EDI è ESI</b> íàäî èñïîëüçîâàòü îñòîðîæíî. <A href="#contents8" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=8.1.8> 8.1.8 Áèòîâûå ïîëÿ ñòðóêòóð. </A></B></FONT><FONT FACE="Courier"> Áèòîâûå ïîëÿ ñòðóêòóð èñïîëüçóþòñÿ äëÿ ýêîíîìèè ïàìÿòè, ïîñêîëüêó ïîçâîëÿþò ïëîòíî óïàêîâàòü çíà÷åíèÿ, è äëÿ îðãàíèçàöèè óäîáíîãî äîñòóïà ê ðåãèñòðàì âíåøíèõ óñòðîéñòâ, â êîòîðûõ ðàçëè÷íûå áèòû ìîãóò èìåòü ñàìîñòîÿòåëüíîå ôóíêöèîíàëüíîå íàçíà÷åíèå. Îáúÿâëåíèå áèòîâîãî ïîëÿ èìååò ñëåäóþùèé ñèíòàêñèñ: <òèï> [<èäåíòèôèêàòîð>]:<êîíñòàíòà>; èëè íà ïðèìåðå: int var:5; //îáúÿâëåíèå áèòîâîãî ïîëÿ ðàçìåðîì 5 áèò ñ èìåíåì <b>var</b> Áèòîâîå ïîëå ñîñòîèò èç íåêîòîðîãî ÷èñëà áèòîâ, êîòîðîå çàäàåòñÿ ÷èñëîâûì âûðàæåíèåì <b>êîíñòàíòà</b>. Åãî çíà÷åíèå äîëæíî áûòü öåëûì ïîëîæèòåëüíûì ÷èñëîì è åãî çíà÷åíèå íå äîëæíî ïðåâûøàòü ÷èñëà ðàçðÿäîâ, ñîîòâåòñòâóþùèå <b>òèïó</b> îïðåäåëÿåìîãî áèòîâîãî ïîëÿ.  C-- áèòîâûå ïîëÿ ìîãóò ñîäåðæàòü òîëüêî áåç çíàêîâûå çíà÷åíèÿ. Íåëüçÿ èñïîëüçîâàòü ìàññèâû áèòîâûõ ïîëåé, óêàçàòåëè íà áèòîâûå ïîëÿ. <b> èäåíòèôèêàòîð</b> èìåíóåò áèòîâîå ïîëå. Åãî íàëè÷èå íåîáÿçàòåëüíî. Íåèìåíîâàííîå áèòîâîå ïîëå îçíà÷àåò ïðîïóñê ñîîòâåòñòâóþùåãî ÷èñëà áèòîâ ïåðåä ðàçìåùåíèåì ñëåäóþùåãî ýëåìåíòà ñòðóêòóðû. Íåèìåíîâàííîå áèòîâîå ïîëå, äëÿ êîòîðîãî óêàçàí íóëåâîé ðàçìåð, èìååò ñïåöèàëüíîå íàçíà÷åíèå: îíî ãàðàíòèðóåò, ÷òî ïàìÿòü äëÿ ñëåäóþùåãî áèòîâîãî ïîëÿ áóäåò íà÷èíàòüñÿ íà ãðàíèöå òîãî òèïà, êîòîðûé çàäàí äëÿ íåèìåíîâàííîãî áèòîâîãî ïîëÿ. Ò.å. áóäåò ïðîèçâåäåíî âûðàâíèâàíèå áèòîâîãî ïîëÿ íà 8/16/32 áèòà.  C-- âñå áèòîâûå ïîëÿ óïàêîâûâàþòñÿ îäíî çà äðóãèì íåçàâèñèìî îò ãðàíèö òèïà èäåíòèôèêàòîðîâ. Åñëè ïîñëåäóþùåå ïîëå íå ÿâëÿåòñÿ áèòîâûì ïîëåì, òî îñòàâøèåñÿ äî ãðàíèöû áàéòà áèòû íå áóäóò èñïîëüçîâàíû. Ìàêñèìàëüíûé ðàçìåð áèòîâîãî ïîëÿ ðàâåí 32 áèòà äëÿ òèïà <b>dword/long</b>, 16 áèò äëÿ òèïà <b>word/int</b> è 8 áèò äëÿ òèïà <b>byte/char</b>. Áèòîâûå ïîëÿ ìîæíî îáúåäèíÿòü, ò.å. èñïîëüçîâàòü èõ â îïåðàòîðå<b> union. sizeof</b> ïðèìåíåííûé ê áèòîâîìó ïîëþ âåðíåò ðàçìåð ýòîãî ïîëÿ â áèòàõ. Ïðè èñïîëüçîâàíèè áèòîâîãî ïîëÿ, åãî ñîäåðæèìîå áóäåò ðàñøèðÿòñÿ â ðåãèñòð êàê áåç çíàêîâîå öåëîå ÷èñëî. <A href="#contents8" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=8.2> 8.2 Îáúåäèíåíèÿ. </A></B></FONT><FONT FACE="Courier"> Îáúåäèíåíèÿ ïîçâîëÿþò â ðàçíûå ìîìåíòû âðåìåíè õðàíèòü â îäíîì îáúåêòå çíà÷åíèÿ ðàçëè÷íîãî òèïà. Ïàìÿòü, êîòîðàÿ âûäåëÿåòñÿ ïîä îáúåäèíåíèå, îïðåäåëÿåòñÿ ðàçìåðîì íàèáîëåå äëèííîãî èç ýëåìåíòîâ îáúåäèíåíèÿ. Âñå ýëåìåíòû îáúåäèíåíèÿ ðàçìåùàþòñÿ â îäíîé è òîé æå îáëàñòè ïàìÿòè ñ îäíîãî è òîãî æå àäðåñà. Çíà÷åíèå òåêóùåãî ýëåìåíòà îáúåäèíåíèÿ òåðÿåòñÿ, êîãäà äðóãîìó ýëåìåíòó îáúåäèíåíèÿ ïðèñâàèâàåòñÿ çíà÷åíèå.  C-- ðåàëèçîâàíû òàê íàçûâàåìûå àíîíèìíûå îáúåäèíåíèÿ. Ò.å. îáúåäèíåíèÿì íå ïðèñâàèâàåòñÿ èìÿ, à îáðàùåíèå ê ýëåìåíòàì îáúåäèíåíèÿ ïðîèñõîäèò êàê ê îáû÷íîé ïåðåìåííîé. Ïðèìåð: union { dword regEAX; word regAX; byte regAL; }; // îáúÿâèëè, ÷òî 3 ïåðåìåííûå ðàñïîëîæåíû ïî îäíîìó è òîìó æå // ôèçè÷åñêîìó àäðåñó void test() { regEAX = 0x2C; BL = regAL; //â ðåãèñòðå BL îêàæåòñÿ çíà÷åíèå 0x2C } Îáúåäèíÿòü ìîæíî ïåðåìåííûå ðàçëè÷íûõ òèïîâ, ìàññèâû, ñòðîêîâûå ïåðåìåííûå è ñòðóêòóðû. Îáúåäèíåíèÿ ìîãóò áûòü ãëîáàëüíûìè è ëîêàëüíûìè, à òàêæå ðàñïîëàãàòüñÿ âíóòðè ñòðóêòóð (ïîêà â îáúåäèíåíèÿõ âíóòðè ñòðóêòóð íåëüçÿ èñïîëüçîâàòü ñòðóêòóðû). Ãëîáàëüíûå îáúåäèíåíèÿ ìîãóò áûòü èíèöèàëèçèðîâàííûìè è íåèíèöèàëèçèðîâàííûìè. ×òîáû ïîëó÷èòü èíèöèàëèçèðîâàííîå îáúåäèíåíèå äîñòàòî÷íî ïðîèíèöèàëèçèðîâàòü ëèøü ïåðâûé ýëåìåíò îáúåäèíåíèÿ. Åñëè æå ïåðâûé ýëåìåíò îáúåäèíåíèÿ íå èíèöèàëèçèðîâàí, à ñëåäóþùèå ýëåìåíòû èíèöèàëèçèðîâàíû, òî ýòî âûçîâåò ñîîáùåíèå êîìïèëÿòîðà îá îøèáêå. <A href="#contents8" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=8.3> 8.3 Êîìàíäû 'FROM' è 'EXTRACT'. </A></B></FONT><FONT FACE="Courier">  C-- åñòü î÷åíü îðèãèíàëüíûå êîìàíäû, êîòîðûõ íåò â äðóãèõ ÿçûêàõ. Ýòî <b>FROM è EXTRACT</b>. Êîìàíäà <b>FROM</b> èìååò ñèíòàêñèñ: <òèï_ïåðåìåííîé> <èìÿ_ïåðåìåííîé> = FROM <èìÿ_ôàéëà>; Âñòðåòèâ ýòó êîìàíäó ïðè êîìïèëÿöèè, êîìïèëÿòîð çàãðóçèò â âûõîäíîé ôàéë ñîäåðæèìîå ôàéëà <b>èìÿ_ôàéëà</b>, à <b>èìÿ_ïåðåìåííîé</b> áóäåò èäåíòèôèêàòîðîì íà÷àëà çàãðóæåííîãî êîäà. Âîò ïðèìåð èñïîëüçîâàíèÿ ýòîé êîìàíäû èç ôàéëà tinydraw.c--: byte palette[PALSIZE] = FROM "TINYDRAW.PAL"; // buffer for palette Êîìàíäà <b>EXTRACT</b> èìååò ñèíòàêñèñ: <òèï_ïåðåìåííîé> <èìÿ_ïåðåìåííîé> = EXTRACT <èìÿ_ôàéëà>, <íà÷àëî>, <äëèíà>; Âñòðåòèâ ýòó êîìàíäó ïðè êîìïèëÿöèè, êîìïèëÿòîð çàãðóçèò â âûõîäíîé ôàéë èç ôàéëà <b>èìÿ_ôàéëà</b> ÷èñëî áàéò ðàâíîå <b>äëèíà</b> ñî ñìåùåíèÿ <b>íà÷àëî</b>, à <b>èìÿ_ïåðåìåííîé</b> áóäåò èäåíòèôèêàòîðîì íà÷àëà çàãðóæåííîãî êîäà. Âîò ïðèìåð èñïîëüçîâàíèÿ ýòîé êîìàíäû: byte LIT128 = EXTRACT "8X16.FNT", 16*128, 16; byte LIT130 = EXTRACT "8X16.FNT", 16*130, 16; <A href="#contents8" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.1> 9. Îïåðàòîðû. 9.1 Óñëîâíûå èíñòðóêöèè. </A></B></FONT><FONT FACE="Courier"> Óñëîâíûå èíñòðóêöèè, ïðè ïîìîùè êîòîðûõ îñóùåñòâëÿåòñÿ âåòâëåíèå, òàêèå æå êàê â C. C-- èìååò äâå èíñòðóêöèè âåòâëåíèÿ. <b>if è IF</b>. <b>if</b> äåëàåò áëèçêèé óñëîâíûé ïåðåõîä, à <b>IF</b> äåëàåò êîðîòêèé (8-ðàçðÿäíûé) óñëîâíûé ïåðåõîä. <b>IF</b> âûïîëíÿåòñÿ áûñòðåå è ìîæåò ýêîíîìèòü äî 3 áàéò â ðàçìåðå êîäà, íî ìîæåò îñóùåñòâëÿòü ïåðåõîäû òîëüêî â ïðåäåëàõ 127 áàéòîâ êîäà. Óñëîâíûå èíñòðóêöèè, êàê è â <b>C</b>, ìîãóò ñîïðîâîæäàòüñÿ, êàê îäèíî÷íîé êîìàíäîé, òàê è áëîêîì èç íåñêîëüêèõ êîìàíä, çàêëþ÷åííûõ â ôèãóðíûå ñêîáêè { è }. Óñëîâíûå èíñòðóêöèè èìåþò òå æå îãðàíè÷åíèÿ, ÷òî è óñëîâíûå âûðàæåíèÿ. Åñëè çà èíñòðóêöèåé <b>IF</b> ñëåäóåò áîëüøå ÷åì 127 áàéòîâ êîäà, òðàíñëÿòîð âûäàñò ñëåäóþùåå ñîîáùåíèå îá îøèáêå: IF jump distance too far, use if. Ýòî ìîæíî ïðîñòî èñïðàâèòü, çàìåíèâ â ýòîì ìåñòå èíñòðóêöèþ <b>IF</b> íà <b>if</b>. Êîìàíäû <b>else è ELSE</b> èñïîëüçóþòñÿ òî÷íî òàê æå, êàê â ÿçûêå <b>C</b>. Îòëè÷èå èõ â òîì, ÷òî <b>ELSE</b> èìååò îãðàíè÷åíèå àäðåñà ïåðåõîäà 127 áàéò, òàêîå æå êàê <b>IF. else</b> ãåíåðèðóåò êîä íà 1 áàéò äëèííåå, ÷åì <b>ELSE</b>. Êîìàíäû <b>IF è else</b>, à òàêæå <b>if è ELSE</b> ìîãóò ñâîáîäíî ñìåøèâàòüñÿ êàê â ñëåäóþùåì ïðèìåðå: if( x == 2 ) WRITESTR("Two"); ELSE{ WRITESTR("not two."); printmorestuff(); } Åñëè çà èíñòðóêöèåé <b>ELSE</b> ñëåäóåò áîëüøå ÷åì 127 áàéòîâ êîäà, òðàíñëÿòîð âûäàñò ñëåäóþùåå ñîîáùåíèå îá îøèáêå: ELSE jump distance too far, use else. Ýòî ìîæíî ïðîñòî èñïðàâèòü, çàìåíèâ â ýòîì ìåñòå èíñòðóêöèþ <b>ELSE</b> íà <b>else</b>. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.2> 9.2 Öèêëû do{} while. </A></B></FONT><FONT FACE="Courier">  òàêîì öèêëå áëîê êîäà, ñîñòàâëÿþùèé òåëî öèêëà, áóäåò ïîâòîðÿòüñÿ, ïîêà óñëîâíîå âûðàæåíèå èìååò çíà÷åíèå <b>èñòèííî</b>. Èñòèííîñòü óñëîâíîãî âûðàæåíèÿ ïðîâåðÿåòñÿ ïîñëå âûïîëíåíèÿ òåëà öèêëà, ïîýòîìó áëîê êîäà áóäåò âûïîëíåí, ïî êðàéíåé ìåðå, îäèí ðàç. Ïðèìåð <b>do {} while</b> öèêëà, â êîòîðîì òåëî áóäåò èñïîëíåíî ïÿòü ðàç: count = 0; do { count++; WRITEWORD(count); WRITELN(); } while (count < 5); Óñëîâíîå âûðàæåíèå â <b>do {} while</b> èíñòðóêöèè äîëæíî ñîîòâåòñòâîâàòü òåì æå ïðàâèëàì, ÷òî è â èíñòðóêöèÿõ <b>IF è if</b>. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.3> 9.3 Öèêëû loop, LOOPNZ, loopnz. </A></B></FONT><FONT FACE="Courier"> Öèêëû <b>loop</b> ïîâòîðÿþò áëîê êîäà, ïîêà îïðåäåëåííàÿ ïåðåìåííàÿ èëè ðåãèñòð, âûïîëíÿþùèå ðîëü ñ÷åò÷èêà öèêëà, ñîäåðæàò çíà÷åíèå, îòëè÷íîå îò íóëÿ.  êîíöå âûïîëíåíèÿ áëîêà êîäà, ñîñòàâëÿþùåãî òåëî öèêëà, óêàçàííàÿ ïåðåìåííàÿ èëè ðåãèñòð - óìåíüøàåòñÿ íà 1, à çàòåì ïðîâåðÿåòñÿ íà ðàâåíñòâî íóëþ. Åñëè ïåðåìåííàÿ (èëè ðåãèñòð) íå ðàâíà íóëþ, òåëî öèêëà áóäåò âûïîëíåíî ñíîâà, è ïðîöåññ ïîâòîðèòñÿ. Ïðèìåð èñïîëüçîâàíèÿ öèêëà <b>loop</b> â êîòîðîì â êà÷åñòâå ñ÷åò÷èêà öèêëà èñïîëüçîâàíà ïåðåìåííàÿ: count = 5; loop( count ) {WRITEWORD(count); WRITELN(); } Íàèáîëüøèé ýôôåêò äàåò èñïîëüçîâàíèå ðåãèñòðà CX äëÿ öèêëîâ ñ íåáîëüøèì òåëîì, ïîñêîëüêó â ýòîì ñëó÷àå êîìïèëÿòîðîì ãåíåðèðóåòñÿ öèêë ñ ïðèìåíåíèåì ìàøèííîé êîìàíäû <b>LOOP</b>. Åñëè ïåðåä ñòàðòîì ñ÷åò÷èê öèêëîâ ñîäåðæèò íóëåâîå çíà÷åíèå, êîìàíäû òåëà öèêëà áóäóò âûïîëíåíû ìàêñèìàëüíîå ÷èñëî ðàç äëÿ äèàïàçîíà ïåðåìåííîé (256 ðàç äëÿ 8-áèòíîãî ñ÷åò÷èêà (ïåðåìåííîé òèïà <b>byte</b> èëè <b>char</b>), 65536 äëÿ 16-áèòíîãî ñ÷åò÷èêà (ïåðåìåííîé òèïà <b>word</b> èëè <b>int</b>), è 4294967296 äëÿ 32-áèòíîãî ñ÷åò÷èêà (ïåðåìåííîé òèïà <b>dword</b> èëè <b>long</b>).  ñëåäóþùåì ïðèìåðå öèêë áóäåò âûïîëíåí 256 ðàç: BH = 0; loop (BH) { } Åñëè â êîìàíäå íå óêàçàíî íèêàêîãî ñ÷åò÷èêà öèêëà, öèêë áóäåò ïðîäîëæàòüñÿ áåñêîíå÷íî. Ñëåäóþùèé ïðèìåð áóäåò íåïðåðûâíî âûâîäèòü ñèìâîë çâåçäî÷êè (*) íà ýêðàí: loop() WRITE('*'); Ïðîãðàììèñò, åñëè õî÷åò, ìîæåò èñïîëüçîâàòü èëè èçìåíÿòü çíà÷åíèå ïåðåìåííîé ñ÷åò÷èêà öèêëà âíóòðè öèêëà. Íàïðèìåð, ñëåäóþùèé öèêë âûïîëíèòñÿ òîëüêî 3 ðàçà: CX = 1000; loop( CX ) { IF( CX > 3 ) CX = 3; } Öèêë ìîæíî òàêæå ïðåðâàòü îïåðàòîðîì ðàçðûâà <b>BREAK</b> èëè <b>break</b>. Âîò òîò æå ïðèìåð ñ èñïîëüçîâàíèåì <b>BREAK</b>: CX = 1000; loop( CX ) { IF( CX > 3 ) BREAK; } Öèêëû <b>LOOPNZ/loopnz</b> îòëè÷àþòñÿ îò öèêëà <b>loop</b>, òåì, ÷òî ïåðåä âõîäîì â öèêë ïðîâåðÿåòñÿ ðàâåíñòâî íóëþ àðãóìåíòà öèêëà. Åñëè àðãóìåíò ðàâåí íóëþ, òî òåëî öèêëà íè ðàçó íå âûïîëíèòñÿ (â öèêëå <b>loop</b> â ýòîì ñëó÷àå òåëî öèêëà âûïîëíèòñÿ ìàêñèìàëüíîå ÷èñëî ðàç). Öèêë <b>LOOPNZ</b> ïîëó÷àåòñÿ ìàêñèìàëüíî ýôôåêòèâíûì ïðè îïòèìèçàöèè íà ðàçìåð êîäà, åñëè â êà÷åñòâå ïàðàìåòðà-ñ÷åò÷èêà èñïîëüçóåòñÿ ðåãèñòð <b>CX/ECX</b>. Ïðè ýòîì êîìïèëÿòîð èñïîëüçóåò àññåìáëåðíûå èíñòðóêöèè <b>JCXZ/JECXZ è LOOP</b>. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.4> 9.4 Öèêë while, WHILE. </A></B></FONT><FONT FACE="Courier"> Ñèíòàêñèñ: while(<âûðàæåíèå>) <îïåðàòîð> Öèêë âûïîëíÿåòñÿ äî òåõ ïîð, ïîêà çíà÷åíèå <b>âûðàæåíèÿ</b> íå ñòàíåò ëîæíûì. Âíà÷àëå âû÷èñëÿåòñÿ <b>âûðàæåíèå</b>. Åñëè <b>âûðàæåíèå</b> èçíà÷àëüíî ëîæíî, òî òåëî îïåðàòîðà <b>while</b> âîîáùå íå âûïîëíÿåòñÿ è óïðàâëåíèå ñðàçó ïåðåäàåòñÿ íà ñëåäóþùèé îïåðàòîð ïðîãðàììû. Öèêë <b>WHILE</b> àíàëîãè÷åí öèêëó <b>while</b>, íî ïðè ýòîì ãåíåðèðóåòñÿ êîä íà 3 áàéòà êîðî÷å. Ðàçìåð ñãåíåðèðîâàííîãî êîäà â öèêëå <b>WHILE</b> äîëæåí áûòü ìåíüøå 127 áàéò. Ïðèìåðû: while ( i < 20 ){ WRITEWORD(i); i++; } WHILE (i < 20 ) @WRITEWORD(i); //öèêë ëèáî áóäåò áåñêîíå÷íûì ëèáî íå //âûïîëíèòñÿ íè ðàçó <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.5> 9.5 Öèêë for, FOR. </A></B></FONT><FONT FACE="Courier"> Ñèíòàêñèñ: for ([<íà÷àëüíîå âûðàæåíèå>]; [<óñëîâèå>]; [<ïðèðàùåíèå>]) <îïåðàòîð> Öèêë <b>for</b> âûïîëíÿåòñÿ äî òåõ ïîð, ïîêà çíà÷åíèå <b>óñëîâèÿ</b> íå ñòàíåò ëîæíûì. Åñëè <b>óñëîâèå</b> èçíà÷àëüíî ëîæíî, òî òåëî îïåðàòîðà <b>for</b> âîîáùå íå âûïîëíÿåòñÿ è óïðàâëåíèå ñðàçó ïåðåäàåòñÿ íà ñëåäóþùèé îïåðàòîð ïðîãðàììû. <b>Íà÷àëüíîå âûðàæåíèå</b> è <b>ïðèðàùåíèå</b> îáû÷íî èñïîëüçóþòñÿ äëÿ èíèöèàëèçàöèè è ìîäèôèêàöèè ïàðàìåòðîâ öèêëà. Ïåðâûì øàãîì ïðè âûïîëíåíèè <b>for</b> ÿâëÿåòñÿ âû÷èñëåíèå <b>íà÷àëüíîãî âûðàæåíèÿ</b>, åñëè îíî èìååòñÿ. Çàòåì âû÷èñëÿåòñÿ <b>óñëîâèå</b> è ïðîèçâîäèòñÿ åãî îöåíêà ñëåäóþùèì îáðàçîì: 1) Åñëè <b>óñëîâèå</b> èñòèííî, òî âûïîëíÿåòñÿ òåëî îïåðàòîðà. Çàòåì âû÷èñëÿåòñÿ <b>ïðèðàùåíèå</b> (åñëè îíî åñòü), è ïðîöåññ ïîâòîðÿåòñÿ. 2) Åñëè <b>óñëîâèå</b> îïóùåíî, òî åãî çíà÷åíèå ïðèíèìàåòñÿ çà èñòèíó.  ýòîì ñëó÷àå öèêë for ïðåäñòàâëÿåò áåñêîíå÷íûé öèêë, êîòîðûé ìîæåò çàâåðøèòüñÿ òîëüêî ïðè âûïîëíåíèè â åãî òåëå îïåðàòîðîâ <b>break, goto, return</b>. 3) Åñëè <b>óñëîâèå</b> ëîæíî, òî âûïîëíåíèå öèêëà <b>for</b> çàêàí÷èâàåòñÿ è óïðàâëåíèå ïåðåäàåòñÿ ñëåäóþùåìó îïåðàòîðó. Öèêë <b>FOR</b> àíàëîãè÷åí öèêëó <b>for</b>, íî ïðè ýòîì ãåíåðèðóåòñÿ êîä íà 3 áàéòà êîðî÷å. Ðàçìåð ñãåíåðèðîâàííîãî êîäà â öèêëå <b>FOR</b> äîëæåí áûòü ìåíüøå 127 áàéò. Ïðèìåðû: for(i=0;i<5;i++){ WRITESTR("ÑÒÐÎÊÀ "); WRITEWORD(i); WRITELN(); } ×èñëî <b>íà÷àëüíûõ âûðàæåíèé</b> è ÷èñëî <b>ïðèðàùåíèé</b> íå îãðàíè÷åíî. Êàæäûé îïåðàòîð â <b>íà÷àëüíûõ âûðàæåíèÿõ</b> è <b>ïðèðàùåíèÿõ</b> äîëæåí ðàçäåëÿòüñÿ çàïÿòîé. Ïðèìåð: for ( a=1, b=2 ; a<5 ; a++, b+=a ) {... Òàêæå åñòü âîçìîæíîñòü ëîãè÷åñêîãî îáúåäèíåíèÿ <b>óñëîâèé</b>. Îáúåäèíÿòü ìîæíî äî 32 óñëîâèé. Êàæäîå îáúåäèíÿåìîå óñëîâèå äîëæíî áûòü çàêëþ÷åíî â ñêîáêè. Ïðèìåð: for ( a=0 ; (a>=0) && (a<10) ; a++ ){... <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.6> 9.6 Îïåðàòîð ïåðåêëþ÷àòåëü switch. </A></B></FONT><FONT FACE="Courier"> Ñèíòàêñèñ: switch(<âûðàæåíèå>){ case <êîíñòàíòà>: <îïåðàòîð> ... case <êîíñòàíòà>: <îïåðàòîð> ... ... default: <îïåðàòîð> } Îïåðàòîð ïåðåêëþ÷àòåëü <b>switch</b> ïðåäíàçíà÷åí äëÿ âûáîðà îäíîãî èç íåñêîëüêèõ àëüòåðíàòèâíûõ ïóòåé âûïîëíåíèÿ ïðîãðàììû. Âûïîëíåíèå íà÷èíàåòñÿ ñ âû÷èñëåíèÿ çíà÷åíèÿ <b>âûðàæåíèÿ</b>. Ïîñëå ýòîãî óïðàâëåíèå ïåðåäàåòñÿ îäíîìó èç <b>îïåðàòîðîâ</b> òåëà ïåðåêëþ÷àòåëÿ.  òåëå ïåðåêëþ÷àòåëÿ ñîäåðæàòñÿ êîíñòðóêöèè: <b>case êîíñòàíòà:</b>, êîòîðûå ñèíòàêñè÷åñêè ïðåäñòàâëÿþò ñîáîé ìåòêè îïåðàòîðîâ. Îïåðàòîð, ïîëó÷àþùèé óïðàâëåíèå, - ýòî òîò îïåðàòîð, çíà÷åíèå êîíñòàíòû êîòîðîãî ñîâïàäàþò ñî çíà÷åíèåì <b>âûðàæåíèÿ</b> ïåðåêëþ÷àòåëÿ. Çíà÷åíèå <b>êîíñòàíòû</b> äîëæíî áûòü óíèêàëüíûì. Âûïîëíåíèå òåëà îïåðàòîðà-ïåðåêëþ÷àòåëÿ <b>switch</b> íà÷èíàåòñÿ ñ âûáðàííîãî òàêèì îáðàçîì îïåðàòîðà, è ïðîäîëæàåòñÿ äî êîíöà òåëà èëè äî òåõ ïîð, ïîêà êàêîé-ëèáî îïåðàòîð íå ïåðåäàñò óïðàâëåíèå çà ïðåäåëû òåëà. Îïåðàòîð, ñëåäóþùèé çà êëþ÷åâûì ñëîâîì <b>default</b>, âûïîëíÿåòñÿ, åñëè íè îäíà èç êîíñòàíò íå ðàâíà çíà÷åíèþ <b>âûðàæåíèÿ</b>. Åñëè <b>default</b> îïóùåíî, òî íè îäèí îïåðàòîð â òåëå ïåðåêëþ÷àòåëÿ íå âûïîëíÿåòñÿ, è óïðàâëåíèå ïåðåäàåòñÿ íà îïåðàòîð, ñëåäóþùèé çà <b>switch</b>. Äëÿ âûõîäà èç òåëà ïåðåêëþ÷àòåëÿ îáû÷íî èñïîëüçóåòñÿ îïåðàòîð ðàçðûâà <b>break (BREAK)</b>. Ïðèìåð: switch (i){ case 'A': WRITE(i); i++; BREAK; case 32: WRITE('_'); i++; BREAK; default: WRITE('i'); } Îïåðàòîð <b>switch</b> ñåé÷àñ â êîìïèëÿòîðå ìîæåò ðåàëèçîâûâàòüñÿ òðåì ñïîñîáàìè: äâóõòàáëè÷íûì, òàáëè÷íûì è ìåòîäîì ïîñëåäîâàòåëüíûõ ïðîâåðîê. Òàáëè÷íûé ìåòîä ÿâëÿåòñÿ ñàìûì áûñòðûì, à ïðè áîëüøîì ÷èñëå îïåðàòîðîâ <b>case</b> è ïðè íåçíà÷èòåëüíîé ðàçíèöå ìåæäó ìàêñèìàëüíûì è ìèíèìàëüíûì çíà÷åíèÿìè <b>case</b> îí åùå ìîæåò áûòü è áîëåå êîìïàêòíûì. Íî ó íåãî åñòü è íåäîñòàòêè: â 16-áèòíîì ðåæèìå êîìïèëÿòîð âñåãäà èñïîëüçóåò ðåãèñòð BX, à â 32-áèòíîì ðåæèìå, åñëè îïåðàíäîì <b>switch</b> ÿâëÿåòñÿ ðåãèñòð, òî åãî çíà÷åíèå áóäåò ðàçðóøåíî.  ìåòîäå ïîñëåäîâàòåëüíûõ ïðîâåðîê áëîê ñðàâíåíèé íàõîäèòñÿ â íà÷àëå òåëà îïåðàòîðà <b>switch</b>, ýòî ïîçâîëÿåò èçáàâèòüñÿ îò 1-2 ëèøíèõ <b>jmp</b>. Íî êîìïèëÿòîð íå ìîæåò îïðåäåëèòü, êàêîé òèï ïåðåõîäà èñïîëüçîâàòü ïðè ïðîâåðêå çíà÷åíèé <b>case</b>. Ýòî áóäåò Âàøåé çàáîòîé. Åñëè ðàçìåð êîäà îò íà÷àëà òåëà îïåðàòîðà <b>switch</b> äî ìåñòà ðàñïîëîæåíèÿ îïåðàòîðà <b>case</b> ìåíüøå 128 áàéò, ìîæíî èñïîëüçîâàòü êîðîòêèé ïåðåõîä.  ýòîì ñëó÷àå Âû ìîæåòå óêàçàòü îïåðàòîð <b>CASE</b>, ÷òî ïðèâåäåò ê ãåíåðàöèè áîëåå êîìïàêòíîãî êîäà. Êîìïèëÿòîð â ïðåäóïðåæäåíèÿõ áóäåò Âàì ïîäñêàçûâàòü î âîçìîæíîñòè èñïîëüçîâàíèÿ îïåðàòîðîâ <b>CASE</b>. Èñïîëüçîâàíèå îïåðàòîðà <b>CASE</b> â ñëó÷àÿõ, êîãäà ðàçìåð áëîêà êîäà áîëåå 128 áàéò ïðèâåäåò ê âûäà÷å êîìïèëÿòîðîì ñîîáùåíèÿ îá îøèáêå. Ïðè äâóõòàáëè÷íîì ìåòîäå ñîçäàþòñÿ äâå òàáëèöû - òàáëèöà àäðåñîâ âõîäà â òåëî îïåðàòîðà <b>switch/SWITCH</b> è òàáëèöà çíà÷åíèé <b>case</b>. Ãåíåðèðóåòñÿ ïðîöåäóðà ñðàâíåíèÿ âõîäíîãî çíà÷åíèÿ ñî çíà÷åíèÿìè âî âòîðîé òàáëèöå. Åñëè åñòü ñîâïàäåíèå, òî äåëàåòñÿ ïåðåõîä ïî àäðåñó èç âòîðîé òàáëèöû. Ýòîò ìåòîä ÿâëÿåòñÿ ñàìûì ìåäëåííûì, íî ïðè áîëüøîì ÷èñëå çíà÷åíèé <b>case</b> (áîëåå 15) îí ñòàíîâèòñÿ ñàìûì êîìïàêòíûì. Ïðè îïòèìèçàöèè êîäà íà ðàçìåð, êîìïèëÿòîð ïðåäâàðèòåëüíî âû÷èñëÿåò ðàçìåð êîäà, êîòîðûé ìîæåò áûòü ïîëó÷åí âñåìè ìåòîäàìè è ðåàëèçóåò ñàìûé êîìïàêòíûé. Ïðè îïòèìèçàöèè íà ñêîðîñòü ïðåèìóùåñòâî îòäàåòñÿ òàáëè÷íîìó ìåòîäó, åñëè ðàçìåð òàáëèöû ïîëó÷àåòñÿ íå ñëèøêîì áîëüøèì. Äëÿ îïåðàòîðà <b>switch</b> ââåäåíà òàêæå è êîðîòêàÿ åãî ôîðìà - <b>SWITCH</b>. Åå ìîæíî ïðèìåíÿòü â ñëó÷àå, åñëè ðàçìåð áëîêà êîäà ìåæäó íà÷àëîì òåëà îïåðàòîðà è îïåðàòîðîì <b>default</b> (åñëè îí îòñóòñòâóåò, òî êîíöîì òåëà îïåðàòîðà <b>switch</b>) ìåíüøå 128 áàéò. Î âîçìîæíîñòè èñïîëüçîâàíèÿ êîðîòêîé ôîðìû êîìïèëÿòîð áóäåò ñîîáùàòü â ïðåäóïðåæäåíèÿõ. Äëÿ îïåðàòîðà <b>case/CASE</b>, êîòîðûé ìîæåò èñïîëüçîâàòüñÿ òîëüêî â òåëå áëîêà îïåðàòîðà <b>switch/SWITCH</b>, ìîæíî óêàçûâàòü äèàïàçîí çíà÷åíèé. Ñíà÷àëà íàäî óêàçûâàòü ìåíüøåå çíà÷åíèå, çàòåì ïîñëå ìíîãîòî÷èÿ áîëüøåå. Ïðèìåð: switch(AX){ case 1...5: WRITESTR("Range AX from 1 to 5"); BREAK; }; Ðàíüøå Âàì áû ïðèøëîñü ïèñàòü áîëåå ãðîìîçäêóþ êîíñòðóêöèþ: switch(AX){ case 1: case 2: case 3: case 4: case 5: WRITESTR("Range AX from 1 to 5"); BREAK; }; Êðîìå òîãî, ÷òî íîâûé ôîðìàò çàïèñè áîëåå êîìïàêòåí è áîëåå ÷èòàáåëåí, íî åùå ïðè ýòîì êîìïèëÿòîð ñîçäàåò áîëåå êîìïàêòíûé è áûñòðûé êîä. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.7> 9.7 Îïåðàòîð ïåðåõîäà goto, GOTO. </A></B></FONT><FONT FACE="Courier"> Ñèíòàêñèñ: goto <ìåòêà>; . . . <ìåòêà>: Îïåðàòîð ïåðåõîäà <b>goto</b> ïåðåäàåò óïðàâëåíèå íà <b>îïåðàòîð</b> ïîìå÷åííûé <b>ìåòêîé</b>. Àíàëîãîì â àññåìáëåðå îïåðàòîðó goto ÿâëÿåòñÿ êîìàíäà <b>jmp near</b>. Àíàëîãîì â àññåìáëåðå îïåðàòîðó <b>GOTO</b> ÿâëÿåòñÿ êîìàíäà <b>jmp short</b>. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.8> 9.8 Îïåðàòîð ðàçðûâà break, BREAK. </A></B></FONT><FONT FACE="Courier"> Îïåðàòîð ðàçðûâà <b>break</b> ïðåðûâàåò âûïîëíåíèå îïåðàòîðîâ <b>do-while, for, switch, while, loop, loopnz, LOOPNZ</b>. Îí ìîæåò ñîäåðæàòüñÿ òîëüêî â òåëå ýòèõ îïåðàòîðîâ. Óïðàâëåíèå ïåðåäàåòñÿ îïåðàòîðó, ñëåäóþùåìó çà ïðåðâàííûì öèêëîì. Îïåðàòîð <b>BREAK</b> àíàëîãè÷åí <b>break</b>, íî ïðè ýòîì ãåíåðèðóåòñÿ êîä íà 1 áàéò êîðî÷å. Ðàçìåð ñãåíåðèðîâàííîãî êîäà îò ìåñòà ãäå ïðèìåíÿåòñÿ <b>BREAK</b> äî êîíöà öèêëà äîëæåí áûòü ìåíüøå 127 áàéò. Ïðèìåðû: FOR (i=0; ; i++){ FOR(j=0; j < WIDTH; j++){ IF(i==5)BREAK; } IF(i==10)BREAK; } <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.9> 9.9 Îïåðàòîð ïðîäîëæåíèÿ continue, CONTINUE. </A></B></FONT><FONT FACE="Courier"> Îïåðàòîð ïðîäîëæåíèÿ <b>continue</b> ïåðåäàåò óïðàâëåíèå íà ñëåäóþùóþ èòåðàöèþ â öèêëàõ <b>do-while, for, while, loop, loopnz</b>.  öèêëàõ <b>do-while, while, loop</b> ñëåäóþùàÿ èòåðàöèÿ íà÷èíàåòñÿ ñ âû÷èñëåíèÿ óñëîâíîãî âûðàæåíèÿ. Äëÿ öèêëà <b>for</b> ñëåäóþùàÿ èòåðàöèÿ íà÷èíàåòñÿ ñ âû÷èñëåíèÿ âûðàæåíèÿ ïðèðàùåíèÿ, à çàòåì ïðîèñõîäèò âû÷èñëåíèå óñëîâíîãî âûðàæåíèÿ. Îïåðàòîð <b>CONTINUE</b> àíàëîãè÷åí <b>continue</b>, íî ïðè ýòîì ãåíåðèðóåòñÿ êîä íà 1 áàéò êîðî÷å. Ðàçìåð ñãåíåðèðîâàííîãî êîäà îò ìåñòà ãäå ïðèìåíÿåòñÿ <b>CONTINUE</b> äî íà÷àëà èòåðàöèè äîëæåí áûòü ìåíüøå 127 áàéò. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.10> 9.10 Ëîãè÷åñêîå îáúåäèíåíèå óñëîâèé. </A></B></FONT><FONT FACE="Courier"> Ñóùåñòâóåò âîçìîæíîñòü ëîãè÷åñêîãî îáúåäèíåíèÿ ñðàâíåíèé â óñëîâèÿõ <b>IF è if</b>, öèêëàõ <b>do{}while, while{}, WHILE{}, for{} è FOR{}</b>. Êàæäîå ñðàâíåíèå ïðè èõ ëîãè÷åñêîì îáúåäèíåíèè äîëæíî áûòü çàêëþ÷åíî â ñêîáêè. Îáúåäèíÿòü ìîæíî íå áîëåå 32 ñðàâíåíèé.  îòëè÷èå îò <b>C</b> â C-- àíàëèç ëîãè÷åñêèõ îáúåäèíåíèé ïðîèñõîäèò ñëåâà íàïðàâî è âñå ëèøíèå ñêîáêè áóäóò âîñïðèíÿòû êîìïèëÿòîðîì êàê îøèáî÷íûå. Ýòî íåñêîëüêî ñíèæàåò ãèáêîñòü è âîçìîæíîñòè ïðèìåíåíèÿ ýòèõ îáúåäèíåíèé, íî òàêîâà òðàäèöèÿ è ôèëîñîôèÿ, çàëîæåííàÿ â C--. Ïðèìåð: if ( (a>3) && (b>4) || (c<8) ){ Ò.å. åñëè ïðîèçâåñòè ðàñøèôðîâêó ýòîãî óñëîâèÿ, òî ïîëó÷èòñÿ ñëåäóþùåå: óñëîâèå âûïîëíèòñÿ åñëè a>3 è b>4 èëè a>3 è c<8. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.11> 9.11 Ïåðåõîä ÷åðåç öèêëû. </A></B></FONT><FONT FACE="Courier"> Äëÿ îïåðàòîðîâ <b>BREAK, break, CONTINUE, continue</b> ââåäåíà ïîääåðæêà ÷èñëîâîãî ïàðàìåòðà, îïðåäåëÿþùåãî, ñêîëüêî öèêëîâ íàäî ïðîïóñòèòü, ïðåæäå ÷åì áóäåò âûïîëíåí ýòîò îïåðàòîð. Íàïðèìåð, ìû èìååì òðè âëîæåííûõ öèêëà: do{ loop(CX){ for(BX=0;BX<10;BX++){ break; //ñòàíäàðòíûé îïåðàòîð break 0; //break ñ ïàðàìåòðîì - ïðîïóñòèòü 0 öèêëîâ break 1; //break ñ ïàðàìåòðîì - ïðîïóñòèòü 1 öèêë break 2; //break ñ ïàðàìåòðîì - ïðîïóñòèòü 2 öèêëà } LABL0: } LABL1: }while (DX!=0); LABL2:  òðåòüåì öèêëå íàõîäèòñÿ ãðóïïà ðàçëè÷íûõ âàðèàíòîâ îïåðàòîðà <b>break</b>. Ïåðâûì ñòîèò ñòàíäàðòíûé îïåðàòîð <b>break</b>, ïðè âûïîëíåíèè êîòîðîãî óïðàâëåíèå áóäåò ïåðåäàâàòüñÿ çà ïðåäåëû òðåòüåãî öèêëà - íà ìåòêó <b>LABL0</b>. Âòîðûì èäåò îïåðàòîð <b>break 0</b>, ïðè âûïîëíåíèè êîòîðîãî áóäåò ïðîïóùåíî 0 öèêëîâ è óïðàâëåíèå áóäåò ïåðåäàíî îïÿòü æå íà ìåòêó <b>LABL0</b>. Òàêèì îáðàçîì, çàïèñü <b>break è break 0</b> ÿâëÿþòñÿ ñèíîíèìàìè. Òðåòüèì èäåò îïåðàòîð <b>break 1</b>, ïðè âûïîëíåíèè êîòîðîãî áóäåò ïðîïóùåí îäèí öèêë è óïðàâëåíèå áóäåò ïåðåäàíî çà ïðåäåëû âòîðîãî öèêëà íà ìåòêó <b>LABL1</b>. Íó è íàêîíåö, ïîñëåäíèì èäåò îïåðàòîð <b>break 2</b>, ïðè âûïîëíåíèè êîòîðîãî êîìïèëÿòîð ïðîïóñòèò äâà öèêëà è ïåðåäàñò óïðàâëåíèå çà ïðåäåëû òðåòüåãî, íà ìåòêó <b>LABL2</b>. Ìåòêè â ýòîì ïðèìåðå ïðîñòàâëåíû äëÿ óäîáñòâà îáúÿñíåíèÿ. Íó è ÿ íàäåþñü, Âàì ïîíÿòíî, ÷òî çíà÷åíèå ïàðàìåòðà íå ìîæåò ïðåâûøàòü ÷èñëà öèêëîâ íàõîäÿùèõñÿ ïåðåä òåêóùèì. Òàê äëÿ îäèíî÷íîãî öèêëà ýòîò ïàðàìåòð ìîæåò ïðèíèìàòü ìàêñèìàëüíîå è åäèíñòâåííîå çíà÷åíèå - 0. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.12> 9.12 Èíâåðòèðîâàíèå ôëàãà ïðîâåðêè óñëîâèé. </A></B></FONT><FONT FACE="Courier"> Èíâåðòèðîâàíèå ôëàãà ïðîâåðêè óñëîâèé â îïåðàöèÿõ ñðàâíåíèÿ <b>if/IF for/FOR while/WHILE</b> ïðîèñõîäèò ñ ïîìîùüþ ñèìâîëà <b>! - not</b>. Âûðàæåíè IF ( NOTCARRYFLAG )... è IF ( ! CARRYFLAG )... IF ( proc() == 0 )... è IF ( ! proc() ) ... ÿâëÿþòñÿ ñèíîíèìàìè. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.13> 9.13 Âû÷èñëåíèå âûðàæåíèÿ, à çàòåì ïðîâåðêà óñëîâèÿ. </A></B></FONT><FONT FACE="Courier">  îïåðàöèÿõ ñðàâíåíèÿ â ëåâîì îïåðàíäå òåïåðü äîïóñòèìî èñïîëüçîâàòü âû÷èñëåíèÿ âûðàæåíèÿ ñ ïðèñâàèâàíèåì è îïåðàöèè èíêðåìåíòà, äåêðåìåíòà. Íàïðèìåð: IF (i=a+2 != 0 )... IF ( i++ )... IF ( a-- )... IF ( i+=4 == 0 )... Âî âñåõ ýòèõ ïðèìåðàõ ñíà÷àëà ïðîèçîéäåò âû÷èñëåíèå âûðàæåíèÿ â ëåâîé ÷àñòè îïåðàöèè ñðàâíåíèÿ, à ïîòîì áóäåò ïðîèçâåäåíî ñðàâíåíèå ðåçóëüòàòà ñ ïðàâîé ÷àñòüþ âûðàæåíèÿ ñðàâíåíèÿ. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.14> 9.14 Ïðîâåðêà áèòîâ ïðè îïåðàöèè ñðàâíåíèÿ. </A></B></FONT><FONT FACE="Courier"> Åñëè â ëåâîé ÷àñòè âûðàæåíèÿ ñðàâíåíèÿ íàïèñàíî: BX & 5, òî ïðè âû÷èñëåíèè âûðàæåíèÿ ñîäåðæèìîå ðåãèñòðà BX áóäåò èçìåíåíî èíñòðóêöèåé <b>and</b>. Íî èíîãäà âîçíèêàåò íåîáõîäèìîñòü â ïðîâåðêå áèòîâ áåç èçìåíåíèÿ ñîäåðæèìîãî ðåãèñòðà BX. Äëÿ ýòèõ öåëåé íàäî èñïîëüçîâàòü èíñòðóêöèþ <b>test</b>. Êàê æå óêàçàòü êîìïèëÿòîðó, â êàêèõ ñèòóàöèÿõ èñïîëüçîâàòü èíñòðóêöèþ <b>and</b>, à â êàêèõ <b>test</b>?  ñòàíäàðòíûõ ÿçûêàõ <b>C</b> äëÿ ýòîãî èñïîëüçóåòñÿ ìåõàíèçì ïðèîðèòåòîâ - åñëè âûðàæåíèå çàêëþ÷åíî â ñêîáêè, òî ïðîèçâîäèòñÿ åãî âû÷èñëåíèå, åñëè íåò, òî ïðîèçâîäèòñÿ ïðîâåðêà. Íî C-- íå ïîääåðæèâàåò ïðèîðèòåòîâ. Äëÿ ðàçðåøåíèÿ ýòîé ïðîáëåìû â C-- ðåøåíî èñïîëüçîâàòü íåïîñðåäñòâåííî ñàìó èíñòðóêöèþ <b>test</b>. Âîò äîïóñòèìûå âàðèàíòû ñèíòàêñèñà: IF ( $test AX,5 ) IF ( ! $test AX,5) IF ( asm test AX,5) IF ( ! asm { test AX,5 } ) <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.15> 9.15 Îïåðàòîð ïåðåñòàíîâêè. </A></B></FONT><FONT FACE="Courier">  C-- åñòü îïåðàòîð, êîòîðûé íå âñòðå÷àåòñÿ â äðóãèõ ÿçûêàõ, ýòî îïåðàòîð ïåðåñòàíîâêè. Îïåðàòîð ïåðåñòàíîâêè ìåíÿåò ìåñòàìè ñîäåðæèìîå äâóõ ïåðåìåííûõ. Ñèìâîëüíîå îáîçíà÷åíèå ýòîãî îïåðàòîðà ><. Ïåðåìåííûå ñ îáåèõ ñòîðîí îïåðàòîðà ïåðåñòàíîâêè äîëæíû èìåòü îäèíàêîâûé ðàçìåð, 8 áèò è 8 áèò, 16 áèò è 16 áèò, èëè 32 áèòà è 32 áèòà. Âîò íåêîòîðûå ïðèìåðû: AX >< BX; // ñîõðàíÿåò çíà÷åíèå BX â AX è çíà÷åíèå AX â BX CH >< BL; // ìåíÿåò ìåñòàìè ñîäåðæèìîå ðåãèñòðîâ CH è BL dog >< cat; /* ìåíÿåò ìåñòàìè çíà÷åíèÿ ïåðåìåííîé dog è ïåðåìåííîé cat*/ counter >< CX; // ìåíÿåò ìåñòàìè çíà÷åíèÿ ïåðåìåííîé counter // è ñîäåðæèìîå ðåãèñòðà CX Åñëè ïåðåñòàíîâêà îñóùåñòâëÿåòñÿ ìåæäó äâóìÿ 8-ðàçðÿäíûìè ïåðåìåííûìè â ïàìÿòè, áóäåò ðàçðóøåíî ñîäåðæèìîå ðåãèñòðà AL. Åñëè ïåðåñòàíîâêà - ìåæäó äâóìÿ 16-ðàçðÿäíûìè ïåðåìåííûìè â ïàìÿòè, áóäåò ðàçðóøåíî ñîäåðæèìîå ðåãèñòðà AX. Åñëè ïåðåñòàíîâêà - ìåæäó äâóìÿ 32-ðàçðÿäíûìè ïåðåìåííûìè â ïàìÿòè, áóäåò ðàçðóøåíî ñîäåðæèìîå EAX.  ëþáîì äðóãîì ñëó÷àå, íàïðèìåð, ìåæäó ïåðåìåííîé â ïàìÿòè è ðåãèñòðîì, çíà÷åíèÿ âñåõ ðåãèñòðîâ áóäóò ñîõðàíåíû. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.16> 9.16 Îïåðàòîð îòðèöàíèÿ. </A></B></FONT><FONT FACE="Courier"> C-- ïîääåðæèâàåò áûñòðûé ñèíòàêñèñ ñìåíû çíàêà ïåðåìåííîé - îïåðàòîð îòðèöàíèÿ. Ïîñòàâèâ <b>-</b> (çíàê ìèíóñ) ïåðåä èäåíòèôèêàòîðîì ïåðåìåííîé ïàìÿòè èëè ðåãèñòðà è <b>;</b> (òî÷êó ñ çàïÿòîé) ïîñëå èäåíòèôèêàòîðà, âû ñìåíèòå çíàê ïåðåìåííîé ïàìÿòè èëè ðåãèñòðà. Âîò íåêîòîðûå ïðèìåðû: -AX; // ðåçóëüòàò òîò æå, ÷òî è ïðè 'AX = -AX;' ,íî áûñòðåå. -tree; // òî æå ñàìîå, ÷òî 'tree = -tree;' ,íî áûñòðåå. -BH; // ìåíÿåò çíàê BH. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.17> 9.17 Îïåðàòîð èíâåðñèè. </A></B></FONT><FONT FACE="Courier"> C-- ïîääåðæèâàåò áûñòðûé ñèíòàêñèñ âûïîëíåíèÿ ëîãè÷åñêîé èíâåðñèè çíà÷åíèÿ ïåðåìåííîé - îïåðàòîð èíâåðñèè. Ïîñòàâèâ <b>!</b> (âîñêëèöàòåëüíûé çíàê) ïåðåä èäåíòèôèêàòîðîì ïåðåìåííîé ïàìÿòè èëè ðåãèñòðîì è <b>;</b> (òî÷êó ñ çàïÿòîé) ïîñëå èäåíòèôèêàòîðà, âû âûïîëíèòå ëîãè÷åñêóþ (âûïîëíèòñÿ àññåìáëåðíàÿ êîìàíäà NOT) èíâåðñèþ òåêóùåãî çíà÷åíèÿ ïåðåìåííîé. Âîò íåêîòîðûå ïðèìåðû: !AX; // òî æå ñàìîå, ÷òî ' AX ^ = 0xFFFF; ' íî áûñòðåå. !node; // çàìåíÿåò çíà÷åíèå 'node' åãî ëîãè÷åñêîé èíâåðñèåé. !CL; // òî æå ñàìîå, ÷òî ' CL ^ = 0xFF ' íî áûñòðåå. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.18> 9.18 Ñïåöèàëüíûå óñëîâíûå âûðàæåíèÿ. </A></B></FONT><FONT FACE="Courier"> C-- ïîääåðæèâàåò âîñåìü ñïåöèàëüíûõ óñëîâíûõ âûðàæåíèé: CARRYFLAG NOTCARRYFLAG OVERFLOW NOTOVERFLOW ZEROFLAG NOTZEROFLAG MINUSFLAG PLUSFLAG Îíè ìîãóò èñïîëüçîâàòüñÿ âìåñòî ëþáûõ íîðìàëüíûõ óñëîâíûõ âûðàæåíèé. Åñëè Âû æåëàåòå, íàïðèìåð, âûïîëíèòü áëîê êîäà òîëüêî åñëè óñòàíîâëåí ôëàã ïåðåíîñà, Âàì ñëåäóåò èñïîëüçîâàòü ñëåäóþùóþ ïîñëåäîâàòåëüíîñòü êîìàíä: IF( CARRYFLAG ) { // çäåñü âû ÷åãî-òî äåëàåòå } Åñëè Âû æåëàåòå íåïðåðûâíî âûïîëíÿòü áëîê êîäà äî òåõ ïîð, ïîêà íå óñòàíîâèòñÿ ôëàã ïåðåïîëíåíèÿ, Âàì ñëåäóåò èñïîëüçîâàòü íå÷òî ïîäîáíîå ñëåäóþùåìó êóñêó êîäà: do { // çäåñü âû îïÿòü ÷åãî-òî äåëàåòå } while( NOTOVERFLOW ); <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.19> 9.19 Ñèìâîë $ - âñòàâëÿåò òåêóùèé àäðåñ ïðîãðàììû. </A></B></FONT><FONT FACE="Courier"> Ñèìâîë <b>$</b>, êðîìå òîãî, ÷òî ÿâëÿåòñÿ ïðèçíàêîì ïîñëåäóþùåé àññåìáëåðíîé èíñòðóêöèè, â ÿçûêå C--, êàê è â ÿçûêå Assembler ìîæåò óêàçûâàòü òåêóùèé àäðåñ (ñìåùåíèå) êîìïèëèðóåìîé ïðîãðàììû. Íî â C-- îí èìåë îãðàíè÷åííûå âîçìîæíîñòè. Îí ìîã áûòü èñïîëüçîâàí ëèøü êàê àðãóìåíò â îïåðàòîðàõ <b>GOTO/goto</b> è àññåìáëåðíûõ èíñòðóêöèÿõ <b>DW/DD/JMP</b>. Ýòîò ñèìâîë ìîæåò íàõîäèòüñÿ â ëþáîì ìåñòå âû÷èñëÿåìîãî ÷èñëîâîãî âûðàæåíèÿ è ìîæåò áûòü ïðèìåíåí â ëþáîì ìåñòå ñîâìåñòíî ñ äðóãèìè ÷èñëîâûìè âûðàæåíèÿìè. Ïðèìåðû ïðèìåíåíèÿ: DW #main-$ //çàïèñàòü ðàññòîÿíèå îò ïðîöåäóðû main äî òåêóùåãî ìåñòà GOTO $+2; //ïåðåéòè ïî àäðåñó íà 2 áîëüøå, ÷åì òåêóùèé àäðåñ <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.20> 9.20 Êëþ÷åâîå ñëîâî static è îïåðàòîð ::. </A></B></FONT><FONT FACE="Courier"> Åñëè ïåðåä îáúÿâëåíèåì ãëîáàëüíîé ïåðåìåííîé, ñòðóêòóðû èëè ïðîöåäóðû óêàçàòü ñëîâî <b>static</b>, òî ýòè ïåðåìåííàÿ, ñòðóêòóðà èëè ïðîöåäóðà áóäóò äîñòóïíû òîëüêî â òîì ôàéëå, â êîòîðîì îíè áûëè îáúÿâëåíû. Ò.å. åñëè Âû âêëþ÷èòå ýòîò ôàéë â äðóãîé äèðåêòèâîé <b>include</b>, òî ïåðåìåííûå îáúÿâëåííûå âî âêëþ÷àåìîì ôàéëå ñî ñëîâîì <b>static</b> íå áóäóò äîñòóïíû â îñíîâíîì ôàéëå, è Âû ìîæåòå â îñíîâíîì ôàéëå îáúÿâèòü äðóãèå ïåðåìåííûå ñ òàêèìè æå èìåíàìè. Åñëè Âû ïðèìåíèòå ñëîâî <b>static</b> ïðè îáúÿâëåíèè ëîêàëüíîé ïåðåìåííîé â ïðîöåäóðå, òî ïàìÿòü äëÿ ýòîé ïåðåìåííîé áóäåò âûäåëåíà íå â ñòåêå, à â îáëàñòè äàííûõ ïðîöåäóðû. Íî ýòà ïåðåìåííàÿ áóäåò äîñòóïíà òîëüêî âíóòðè ïðîöåäóðû, â êîòîðîé îíà áûëà îáúÿâëåíà. Ïðèìåíåíèå <b>static</b> ê ëîêàëüíûì ïåðåìåííûì äàåò âîçìîæíîñòü ñîõðàíÿòü çíà÷åíèå ïåðåìåííîé äëÿ ñëåäóþùåãî âõîäà â ïðîöåäóðó. Ñëîâî <b>static</b> ìîæíî ïðèìåíÿòü ê ëþáîìó ãëîáàëüíîìó îáúåêòó (ïåðåìåííîé, ñòðóêòóðå, ïðîöåäóðå). Äëÿ ëîêàëüíîãî èñïîëüçîâàíèÿ ýòî ñëîâî ìîæíî ïðèìåíÿòü òîëüêî ê ïåðåìåííûì. Åñëè â Âàøåé ïðîãðàììå åñòü ãëîáàëüíàÿ è ëîêàëüíàÿ ïåðåìåííàÿ ñ îäèíàêîâûìè èìåíàìè, òî â ïðîöåäóðå, â êîòîðîé îáúÿâëåíà ýòà ëîêàëüíàÿ ïåðåìåííàÿ, Âû íå èìåëè äîñòóïà ê îäíîèìåííîé ãëîáàëüíîé ïåðåìåííîé. Ïðèìåíèâ ïåðåä èìåíåì ïåðåìåííîé îïåðàòîð <b>::</b>, Âû ïîëó÷èòå äîñòóï ê ãëîáàëüíîé ïåðåìåííîé. Ïðèìåð: int var; //îáúÿâëÿåì ãëîáàëüíóþ ïåðåìåííóþ void proc() int var; //îáúÿâëÿåì ëîêàëüíóþ ïåðåìåííóþ ñ èìåíåì óæå ñóùåñòâóþùåé //ãëîáàëüíîé ïåðåìåííîé { (E)AX=var; //èìååì äîñòóï òîëüêî ê ëîêàëüíîé ïåðåìåííîé (E)AX=::var; //à òàê ìîæíî ïîëó÷èòü äîñòóï ê ãëîáàëüíîé ïåðåìåííîé } <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.21> 9.21 Îïåðàòîð sizeof. </A></B></FONT><FONT FACE="Courier"> Îïåðàöèÿ <b>sizeof</b> îïðåäåëÿåò ðàçìåð ïàìÿòè, êîòîðûé ñîîòâåòñòâóåò îáúåêòó èëè òèïó. Îïåðàöèÿ sizeof èìååò ñëåäóþùèé âèä: sizeof (<èìÿ òèïà>) Ðåçóëüòàòîì îïåðàöèè <b>sizeof</b> ÿâëÿåòñÿ ðàçìåð ïàìÿòè â áàéòàõ, ñîîòâåòñòâóþùèé çàäàííîìó îáúåêòó èëè òèïó.  C-- îïåðàòîð <b>sizeof</b> ìîæíî ïðèìåíÿòü ê ïåðåìåííûì, ðåãèñòðàì, òèïàì ïåðåìåííûõ, ñòðóêòóðàì, ïðîöåäóðàì, òåêñòîâûì ñòðîêàì è ôàéëàì. Åñëè îïåðàöèÿ <b>sizeof</b> ïðèìåíÿåòñÿ ê òèïó ñòðóêòóðû, òî ðåçóëüòàòîì ÿâëÿåòñÿ ðàçìåð òåãà äàííîé ñòðóêòóðû. Åñëè îïåðàöèÿ <b>sizeof</b> ïðèìåíÿåòñÿ ê òåêñòîâîé ñòðîêå, òî ðåçóëüòàòîì îïåðàöèè ÿâëÿåòñÿ ðàçìåð ñòðîêè ïëþñ çàâåðøàþùèé íóëü. Íàïðèìåð: sizeof ("Test") ðåçóëüòàòîì ýòîé îïåðàöèè áóäåò ÷èñëî 5. Åñëè Âû íàïèøèòå òàêóþ êîíñòðóêöèþ: char a="Test"; sizeof(a) òî ðåçóëüòàòîì áóäåò 5 - ðàçìåð ïàìÿòè, îòâåäåííûé äëÿ ïåðåìåííîé a. Ïðè èñïîëüçîâàíèè îïåðàòîðà <b>sizeof</b> ñ èìåíåì ñòðóêòóðû âñòàâëÿåò ôàêòè÷åñêèé ðàçìåð ïàìÿòè, çàíèìàåìûé ñòðóêòóðîé. Ýòî îñîáåííî âàæíî, åñëè Âû îáúÿâèëè ìàññèâ ñòðóêòóð. Îïåðàòîð <b>sizeof</b> ìîæíî ïðèìåíÿòü è ê èìåíè îïðåäåëåííîé ðàíåå ïðîöåäóðû. Ðåçóëüòàòîì áóäåò ðàçìåð ýòîé ïðîöåäóðû. Íî äëÿ äèíàìè÷åñêèõ ïðîöåäóð âñåãäà áóäåò íîëü. Îïåðàöèþ <b>sizeof</b> ìîæíî ïðèìåíÿòü è ê ôàéëàì. Ýòî áûâàåò î÷åíü ïîëåçíûì ïðè èñïîëüçîâàíèè îïåðàòîðà <b>FROM</b>, íî ìîæåò ïðèìåíÿòüñÿ è â äðóãèõ ñëó÷àÿõ. Ïðèìåð ïðèìåíåíèÿ îïåðàòîðà <b>sizeof</b> ê ôàéëàì: sizeof ( file "filename.dat" ) Ðåçóëüòàòîì ýòîé îïåðàöèè áóäåò ðàçìåð ôàéëà "filename.dat". <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=9.22> 9.22 Ìåòêè ïåðåõîäà. </A></B></FONT><FONT FACE="Courier"> Ìåòêè ïåðåõîäà ïðèìåíÿþòñÿ äëÿ óêàçàíèÿ íà÷àëüíûõ òî÷åê ó÷àñòêîâ êîäà, èñïîëüçóåìûõ êîìàíäàìè ïåðåõîäà âñòðîåííîãî àññåìáëåðà è îïåðàòîðàìè <b>goto/GOTO</b>. Èìåþòñÿ äâà òèïà ìåòîê ïåðåõîäà: ãëîáàëüíûå è ëîêàëüíûå. Ãëîáàëüíûå ìåòêè, êàê ñëåäóåò èç íàçâàíèÿ, ýòî ìåòêè, êîòîðûå âèäèìû èç ëþáîãî ìåñòà â ïðîãðàììå. Ëîêàëüíûå ìåòêè âèäíû òîëüêî â ïðåäåëàõ ñâîåãî ïðîöåäóðíîãî áëîêà, è íå îïðåäåëåíû çà åãî ïðåäåëàìè. Ìåòêè îïðåäåëÿþòñÿ èäåíòèôèêàòîðîì, îêàí÷èâàþùèìèñÿ äâîåòî÷èåì. Åñëè èäåíòèôèêàòîð ñîäåðæèò õîòÿ áû îäèí ñèìâîë ñòðî÷íûõ áóêâ (áóêâ íèæíåãî ðåãèñòðà, ìàëåíüêèõ áóêâ), ýòî ãëîáàëüíàÿ ìåòêà ïåðåõîäà, â ïðîòèâíîì ñëó÷àå, ýòî ëîêàëüíàÿ ìåòêà ïåðåõîäà. Ãëîáàëüíûå ìåòêè ïåðåõîäà íå äîëæíû èñïîëüçîâàòüñÿ âíóòðè äèíàìè÷åñêèõ ïðîöåäóð; òàì ìîæíî èñïîëüçîâàòü òîëüêî ëîêàëüíûå ìåòêè. Ýòî âàæíî ïîìíèòü, ïîñêîëüêó, èç-çà ïðèìåíåíèÿ òàêîãî ñðåäñòâà êàê ìàêðîêîìàíäû, äèíàìè÷åñêàÿ ïðîöåäóðà ìîæåò ïðèñóòñòâîâàòü â íåñêîëüêèõ ìåñòàõ êîäà, ÷òî áóäåò îçíà÷àòü, ÷òî ìåòêå ñîîòâåòñòâóåò áîëüøå ÷åì îäèí àäðåñ. Ìåòêè âíå ïðîöåäóð ôàêòè÷åñêè ðàñïîëàãàþòñÿ â îáëàñòè äàííûõ ïðîãðàììû. Åñëè äàííûå è êîä íàõîäÿòñÿ â îäíîì ñåãìåíòå (à èìåííî òàê îðãàíèçîâàííà ïðîãðàììà, íàïèñàííàÿ íà C--), òî ìåòêè âíå ïðîöåäóð ñòàíîâÿòñÿ ïðîñòûì è ýôôåêòèâíûì ìåòîäîì äëÿ ïîëó÷åíèÿ ðàññòîÿíèé ìåæäó ÷àñòÿìè ïðîãðàììû.  êà÷åñòâå èìåí äëÿ ìåòîê âíå ïðîöåäóð ìîãóò áûòü èñïîëüçîâàíû óíèêàëüíûå èäåíòèôèêàòîðû, â êîòîðûõ ìîæíî èñïîëüçîâàòü áîëüøèå, ìàëåíüêèå è ñìåñü áîëüøèõ è ìàëåíüêèõ áóêâ. <A href="#contents9" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=10.1> 10. Àññåìáëåð. 10.1 Ïîääåðæêà êîìàíä àññåìáëåðà. </A></B></FONT><FONT FACE="Courier"> Âñòðîåííûé â C-- àññåìáëåð ïîääåðæèâàåò âñå èíñòðóêöèè 8088/8086, 80286, 80386, 80486, Pentium, Pentium II è Pentium III ïðîöåññîðîâ. Âñå èíñòðóêöèè âñòðîåííîãî àññåìáëåðà äîëæíû íà÷èíàòüñÿ ñ ñèìâîëà äîëëàðà <b>$</b>. Ïîääåðæèâàåòñÿ òàêæå êëþ÷åâîå ñëîâî <b>asm</b>, êîòîðîå ÿâëÿÿñü ñèíîíèìîì ê ñèìâîëó äîëëàðà, åùå è ïîääåðæèâàåò îáúåäèíåíèå àññåìáëåðíûõ èíñòðóêöèé â áëîêè. <A href="#contents10" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=10.2> 10.2 Êëþ÷åâîå ñëîâî asm. </A></B></FONT><FONT FACE="Courier"> Êëþ÷åâîå ñëîâî <b>asm</b> ÿâëÿåòñÿ ñèíîíèìîì ê <b>$</b> - ïðåôèêñ àññåìáëåðíîé êîìàíäû. Ïîñëå ñëîâà asm ìîæíî ïèñàòü áëîê àññåìáëåðíûõ êîìàíä. Ïðèìåð: asm { . . push AX labl: push BX mov AX,0x1234 jmp short labl . . . } Ìåòêè âíóòðè áëîêà àññåìáëåðíûõ êîìàíä äîïóñòèìû. <A href="#contents10" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=10.3> 10.3 Ïðåôèêñ dup - ïîâòîðåíèå èíñòðóêöèé DB/DW/DD. </A></B></FONT><FONT FACE="Courier"> Äëÿ àññåìáëåðíûõ èíñòðóêöèè <b>DB, DW, DD</b> ââåäåíà âîçìîæíîñòü èñïîëüçîâàòü ïðåôèêñ ïîâòîðåíèé <b>dup</b>. Ïðèìåíåíèå ýòîãî ïðåôèêñà èìååò ñëåäóþùèé ñèíòàêñèñ: $DW NUMREP dup VALTOREP NUMREP - ÷èñëî ïîâòîðîâ èíñòðóêöèè DW. VALTOREP - âåëè÷èíà, êîòîðàÿ áóäåò ïîâòîðåíà NUMREP ðàç.  îòëè÷èå îò àíàëîãà ýòîãî ïðåôèêñà èç àññåìáëåðà ïîâòîðÿåìóþ âåëè÷èíó çàêëþ÷àòü â ñêîáêè íåëüçÿ. <A href="#contents10" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=10.4> 10.4 Èíñòðóêöèè ïðîöåññîðà Pentium III. </A></B></FONT><FONT FACE="Courier">  êîìïèëÿòîð äîáàâëåíà ïîääåðæêà 19 íîâûõ èíñòðóêöèé MMX ðàñøèðåíèÿ MASKMOVQ mmx,mmx MOVNTQ m64,mmx PAVGB mmx,mmx/m64 PAVGW mmx,mmx/m64 PEXTRW r32,mmx,i8 PINSRW mmx,r32/m16,i8 PMAXUB mmx,mmx/m64 PMAXSW mmx,mmx/m64 PMINUB mmx,mmx/m64 PMINSW mmx,mmx/m64 PMOVMSKB r32,mmx PMULHUW mmx,mmx/m64 PREFETCHT0 mem PREFETCHT1 mem PREFETCHT2 mem PREFETCHNTA mem SFENCE PSADBW mmx,mmx/m64 PSHUFW mmx,mmx/m64,i8 è 46 èíñòðóêöèé SSE ðàñøèðåíèÿ. ADDPS xmm,m128/xmm ADDSS xmm,xmm/m32 ANDNPS xmm,xmm/m128 ANDPS xmm,xmm/m128 COMISS xmm,xmm/m32 DIVPS xmm,m128/xmm DIVSS xmm,xmm/m32 MAXPS xmm,m128/xmm MAXSS xmm,xmm/m32 MINPS xmm,m128/xmm MINSS xmm,xmm/m32 MULPS xmm,m128/xmm MULSS xmm,xmm/m32 ORPS xmm,xmm/m128 RCPPS xmm,xmm/m128 RCPSS xmm,xmm/m32 RSQRTPS xmm,xmm/m128 RSQRTSS xmm,xmm/m32 SQRTPS xmm,m128/xmm SQRTSS xmm,xmm/m32 SUBPS xmm,m128/xmm SUBSS xmm,xmm/m32 UCOMISS xmm,xmm/m32 UNPCKHPS xmm,xmm/m128 UNPCKLPS xmm,xmm/m128 XORPS xmm,xmm/m128 CMPPS xmm,xmm/m128,i8 CMPSS xmm,xmm/m32,i8 SHUFPS xmm,xmm/m128,i8 CVTPI2PS xmm,m64/mmx CVTSI2SS xmm,m32/r32 CVTPS2PI mmx,m128/xmm CVTTPS2PI mmx,xmm/m128 CVTSS2SI r32,xmm/m128 CVTTSS2SI r32,xmm/m128 LDMXCSR m32 STMXCSR m32 MOVHLPS xmm,xmm MOVLHPS xmm,xmm MOVMSKPS r32,xmm MOVNTPS m128,xmm MOVAPS m128/xmm,xmm/m128 MOVSS xmm/m32,xmm/m32 MOVUPS xmm/m128,m128/xmm MOVHPS xmm/m64,m64/xmm MOVLPS xmm/m64,m64/xmm Ìíîãèå èç ýòèõ èíñòðóêöèé ìîãóò èñïîëüçîâàòü â êà÷åñòâå îïåðàíäà 64-áèòíûå è 128-áèòíûå ÿ÷åéêè ïàìÿòè. Êîìïèëÿòîð C-- ñåé÷àñ ìîæåò ðàáîòàòü òîëüêî ñ 32-áèòíûìè ïåðåìåííûìè. Ïîýòîìó äëÿ èíñòðóêöèé èñïîëüçóþùèõ â êà÷åñòâå îïåðàíäà ÿ÷åéêè ïàìÿòè ðàçìåðîì áîëüøå 32-áèò ìîæíî èñïîëüçîâàòü ïåðåìåííûå ëþáûõ òèïîâ. Êîìïèëÿòîð íå áóäåò âûäàâàòü íà ýòî ñîîáùåíèé îá îøèáêå, áóäåò èñïîëüçîâàí àäðåñ ýòîé ïåðåìåííîé, à ñàìà èíñòðóêöèÿ áóäåò èñïîëüçîâàòü íóæíîå åé ÷èñëî áèòîâ ïàìÿòè, íà÷èíàÿ ñ àäðåñà óêàçàííîé ïåðåìåííîé. Íàïðèìåð: Äëÿ èíñòðóêöèè <b>movaps</b> îäèí èç îïåðàíäîâ ìîæåò áûòü 128-áèòíîé ÿ÷åéêîé ïàìÿòè. Äëÿ ýòîé èíñòðóêöèè äîïóñòèìû ñëåäóþùèé ñèíòàêñèñ: byte var8_128[16]; word var16_128[8]; dword var32_128[4]; void proc() { asm{ movaps var8_128,xmm0 //â ìàññèâ èç 16 áàéò áóäåò çàïèñàíî ñîäåðæèìîå XMM0 movaps xmm1,var16_128 //â XMM1 áóäåò çàïèñàíî ñîäåðæèìîå 8 ñëîâ movaps var32_128,xmm1 //â ìàññèâ èç 4 äâîéíûõ ñëîâ áóäåò çàïèñàíî XMM1 } } <A href="#contents10" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.1> 11. Ïðîöåäóðû. 11.1 Òèïû ïðîöåäóð, ôóíêöèé è ìàêðîêîìàíä. </A></B></FONT><FONT FACE="Courier"> Ñåé÷àñ C-- ïîääåðæèâàåò 4 òèïà âûçîâà ïðîöåäóð: <b>cdecl, pascal, stdcall è fastcall</b>. Âîò êðàòêèå õàðàêòåðèñòèêè ýòèõ òèïîâ âûçîâîâ ïðîöåäóð: <b><font color="Red">cdecl</font></b> Ýòîò òèï âûçîâà ïðîöåäóð ÿâëÿåòñÿ ïî óìîë÷àíèþ äëÿ ÿçûêà <b>Ñ</b>. Îí õàðàêòåðèçóåòñÿ òåì, ÷òî ïàðàìåòðû ïðîöåäóðû ïåðåäàþòñÿ â ïîðÿäêå îáðàòíîì èõ çàïèñè. Î÷èñòêà ñòåêà îò ïàðàìåòðîâ ïðîèçâîäèòñÿ ïîñëå çàâåðøåíèÿ ðàáîòû ïðîöåäóðû. Ýòîò ñïîñîá âûçîâà ïðîöåäóð î÷åíü óäîáåí äëÿ ïðîöåäóð ñ ïåðåìåííûì ÷èñëîì ïàðàìåòðîâ. <b><font color="Red">pascal</font></b> Ýòîò òèï âûçîâà ïðåäïîëàãàåò, ÷òî ïàðàìåòðû ïåðåäàþòñÿ â òîì ïîðÿäêå, â êîòîðîì îíè çàïèñàíû â ïðîãðàììå. Îñâîáîæäåíèå ñòåêà îò ïàðàìåòðîâ ïðîèçâîäèò ñàìà âûçûâàåìàÿ ïðîöåäóðà. Ýòîò òèï âûçîâà ÿâëÿåòñÿ áîëåå êîìïàêòíûì, ÷åì <b>cdecl</b>. <b><font color="Red">stdcall</font></b> Ýòîò òèï âûçîâà ÿâëÿåòñÿ ãèáðèäîì ïåðâûõ äâóõ. Ïàðàìåòðû ïåðåäàþòñÿ ïðîöåäóðå â ïîðÿäêå îáðàòíîì, òîìó â êîòîðîì îíè çàïèñàíû â ïðîãðàììå. Îñâîáîæäåíèå ñòåêà îò ïàðàìåòðîâ ïðîèçâîäèòñÿ â ñàìîé âûçûâàåìîé ïðîöåäóðå. <b><font color="Red">fastcall</font></b> Ýòîò òèï âûçîâà ïðîöåäóð ïðåäïîëàãàåò ÷òî ïåðåäà÷à ïàðàìåòðîâ ïðîöåäóðå ïðîèçâîäèòñÿ ÷åðåç ðåãèñòðû, òåì ñàìûì îòïàäàåò íåîáõîäèìîñòü îñâîáîæäåíèÿ ñòåêà îò ïàðàìåòðîâ. Äëÿ ýòîãî òèïà âûçîâà ïðîöåäóðû ñóùåñòâóþò îãðàíè÷åíèÿ ïî ÷èñëó ïåðåäàâàåìûõ ïàðàìåòðîâ. Äëÿ C ýòî òðè ïàðàìåòðà, à äëÿ C-- øåñòü.  C-- ïàðàìåòðû ïåðåäàþòñÿ ïî óìîë÷àíèþ â ñëåäóþùåì ïîðÿäêå: <b>1-é - AX/EAX, 2-é - BX/EBX, 3 - CX/ECX, 4 - DX/EDX, 5 - DI/EDI, 6 - SI/ESI</b>. Ïàðàìåòðû òèïîâ char èëè byte ìîãóò ïåðåäàâàòüñÿ â êîëè÷åñòâå íå áîëåå 4 èëè òîëüêî â ïåðâûõ 4 ðåãèñòðàõ: <b>1 - AL, 2 - BL, 3 - CL, 4 - DL</b>. Ýòîò ïîðÿäîê ðåãèñòðîâ ìîæåò áûòü èçìåíåí, åñëè ÿâíî óêàçàòü åãî ëèáî ïðè îáúÿâëåíèè ïðîöåäóðû, ëèáî ïðè åå îïðåäåëåíèè. Ïðîöåäóðû òèïà fastcall èíîãäà åùå íàçûâàþò ðåãèñòðîâûìè.  C-- ïî óìîë÷àíèþ, åñëè èìÿ ïðîöåäóðû íàïèñàíî áîëüøèìè áóêâàìè, òî ñ÷èòàåòñÿ, ÷òî ýòà ïðîöåäóðà èìååò òèï âûçîâà <b>fastcall</b>. Åñëè æå â èìåíè ïðîöåäóðû åñòü õîòÿ áû îäíà ìàëåíüêàÿ áóêâà, òî ïî óìîë÷àíèþ ñ÷èòàåòñÿ, ÷òî ýòà ïðîöåäóðà èìååò òèï âûçîâà <b>pascal</b>, çà èñêëþ÷åíèåì ïðîãðàìì êîìïèëèðóåìûõ ñ êëþ÷îì <b>/w32 /w32c</b> èëè <b>/DLL</b>.  íèõ ïî óìîë÷àíèþ ïðèìåíÿåòñÿ òèï âûçîâà ïðîöåäóð <b>stdcall</b>. Åñëè æå Âû õîòèòå èçìåíèòü òèï âûçîâà ïðîöåäóð èç ïî óìîë÷àíèþ íà ëþáîé äðóãîé, òî ýòó ïðîöåäóðó íàäî îáÿçàòåëüíî îáúÿâèòü ñ óêàçàíèåì òèïà æåëàåìîãî âûçîâà. Îáúÿâëåíèå ïðîöåäóð ââåäåíî äëÿ òîãî, ÷òîáû ñîîáùàòü êîìïèëÿòîðó î òèïå âîçâðàòà èç ïðîöåäóð, ñïîñîáå ïåðåäà÷è ïàðàìåòðîâ ïðîöåäóðå è èõ ÷èñëå. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.2> 11.2 Ñòåêîâûå ïðîöåäóðû. </A></B></FONT><FONT FACE="Courier"> Ñòåêîâûå ïðîöåäóðû ïî óìîë÷àíèþ îáúÿâëÿþòñÿ ïðè ïîìîùè èäåíòèôèêàòîðà, êîòîðûé ñîäåðæèò, ïî êðàéíåé ìåðå, îäèí ñèìâîë ñòðî÷íûõ áóêâ (áóêâ íèæíåãî ðåãèñòðà, ìàëåíüêèõ áóêâ). Òàêèì îáðàçîì, ñòåêîâûå ïðîöåäóðû ëåãêî îòëè÷èìû îò ðåãèñòðîâûõ ïðîöåäóð, ïîñêîëüêó äëÿ èìåí ðåãèñòðîâûõ ïðîöåäóð ñèìâîëû ñòðî÷íûõ áóêâ çàïðåùåíû. Ïàðàìåòðû äëÿ ñòåêîâûõ ïðîöåäóð, åñëè îíè åñòü, ìîãóò èìåòü ëþáîé òèï <b>byte, char, word, int, dword, long</b> èëè <b>float</b>. Ïàðàìåòðû ïåðåäàþòñÿ â ñîîòâåòñòâèè ñ ïðàâèëàìè, ïðèíÿòûìè äëÿ äàííîãî òèïà ïðîöåäóð. Åñëè ïðîöåäóðà íå èìååò îáúÿâëåíèÿ, òî êîìïèëÿòîð íå ñëåäèò çà ÷èñëîì è òèïîì ïåðåäàâàåìûõ ïàðàìåòðîâ.  ýòîì ñëó÷àå ó Âàñ ïîÿâëÿåòñÿ ñâîáîäà â èõ èñïîëüçîâàíèè, íî Âû äîëæíû îñîçíàâàòü è ïîñëåäñòâè íåïðàâèëüíîãî èõ èñïîëüçîâàíèÿ.  ñïèñêå ïàðàìåòðîâ äëÿ êàæäîãî ïàðàìåòðà óêàçûâàåòñÿ åãî òèï. Ïàðàìåòðû îäíîãî òèïà, èäóùèå ïîäðÿä, ðàçäåëÿþòñÿ çàïÿòûìè. Ôîðìàëüíûå ïàðàìåòðû ðàçíîãî òèïà â îáúÿâëåíèè ôóíêöèè ðàçäåëÿþòñÿ ñèìâîëîì <b>;</b>.  ñëåäóþùåì ïðèìåðå ñòåêîâàÿ ïðîöåäóðà âîçâðàùàåò ñóììó âñåõ ñâîèõ ïàðàìåòðîâ (èìåþùèõ ðàçëè÷íûå òèïû) êàê âåëè÷èíó òèïà word: word add_them_all (int a,b,c; byte d,e; word x,y) { return( a+b+c+d+e+x+y ); } Ðàíåå C-- äåëàë âûçîâû ñòåêîâûõ ïðîöåäóð ëèøü â ñòèëå <b>pascal</b>. Ïðåèìóùåñòâîì ýòîãî ñïîñîáà âûçîâà ïðîöåäóð ÿâëÿåòñÿ êîìïàêòíîñòü è áîëåå ïðîñòîé ìåõàíèçì ãåíåðàöèè êîäà. Ê íåäîñòàòêàì, à ñîîòâåòñòâåííî è ïðåèìóùåñòâàì Ñ-ñòèëÿ, ìîæíî îòíåñòè æåñòêóþ ïðèâÿçàííîñòü ïàñêàëåâñêèõ ïðîöåäóð ê ÷èñëó è òèïó ïåðåäàâàåìûõ ïàðàìåòðîâ (ïîïðîáóéòå ïðè âûçîâå ïðîöåäóðû â ñòèëå <b>pascal</b> îïóñòèòü îäèí ïàðàìåòð è ïîëó÷èòå 100% çàâèñàíèå). Íàïîìíþ íåêîòîðûå òåõíè÷åñêèå äåòàëè îáîèõ òèïîâ âûçîâîâ ïðîöåäóð. Êàäð ñòåêà C-- äëÿ áëèçêèõ ïðîöåäóð ñòåêà â ñòèëå pascal: ÀÄÐÅÑ ... BP + FFFE ïðåäïîñëåäíèé áàéòà ëîêàëüíûõ ïåðåìåííûõ BP + FFFF ïîñëåäíèé áàéò ëîêàëüíûõ ïåðåìåííûõ BP + 0000 Ñîõðàíåííûé BP BP + 0002 RET àäðåñ BP + 0004 ïîñëåäíåå ñëîâî ïåðåäàâàåìûõ ïðîöåäóðå ïàðàìåòðîâ (åñëè îíè åñòü) BP + 0006 ïðåäïîñëåäíåå ñëîâî ïåðåäàâàåìûõ ïðîöåäóðå ïàðàìåòðîâ ... BP + nnnn ïåðâîå ñëîâî ïåðåäàâàåìûõ ïðîöåäóðå ïàðàìåòðîâ Îñâîáîæäåíèå ñòåêà îò ïåðåäàííûõ ïðîöåäóðå ïàðàìåòðîâ ïðîèñõîäèò ïðÿìî â ñàìîé ïðîöåäóðå êîìàíäîé <b>RET nnnn</b> - ãäå nnnn ÿâëÿåòñÿ ðàçìåðîì ïåðåäàííûõ â ñòåê ïàðàìåòðîâ. Êàäð ñòåêà C-- äëÿ áëèçêèõ ïðîöåäóð ñòåêà â ñòèëå ñè: ÀÄÐÅÑ ... BP + FFFE ïðåäïîñëåäíèé áàéòà ëîêàëüíûõ ïåðåìåííûõ BP + FFFF ïîñëåäíèé áàéò ëîêàëüíûõ ïåðåìåííûõ BP + 0000 Ñîõðàíåííûé BP BP + 0002 RET àäðåñ BP + 0004 ïåðâîå ñëîâî ïåðåäàâàåìûõ ïðîöåäóðå ïàðàìåòðîâ (åñëè îíè åñòü) BP + 0006 âòîðîå ñëîâî ïåðåäàâàåìûõ ïðîöåäóðå ïàðàìåòðîâ ... BP + nnnn ïîñëåäíåå ñëîâî ïåðåäàâàåìûõ ïðîöåäóðå ïàðàìåòðîâ Ïðîöåäóðû â ñòèëå <b>Ñ</b> çàêàí÷èâàþòñÿ êîìàíäîé <b>RET</b>. Îñâîáîæäåíèå ñòåêà îò ïàðàìåòðîâ ïðîèñõîäèò â òîì ìåñòå îòêóäà áûëà âûçâàíà ïðîöåäóðà. Îáû÷íî ýòî äåëàåòñÿ êîìàíäîé <b>ADD SP,nnnn</b>. Ò.å. êîìïèëÿòîð ìîæåò òî÷íî çíàòü ñêîëüêî è êàêèõ ïàðàìåòðîâ Âû ïåðåäàåòå â äàííîì ñëó÷àå ïðîöåäóðå è ñîîòâåòñòâåííî îñâîáîæäàåò ñòåê ïîñëå çàâåðøåíèÿ ïðîöåäóðû. Ýòî î÷åíü óäîáíî äëÿ ïðîöåäóð, êîòîðûå ìîãóò îáðàáàòûâàòü ïåðåìåííîå ÷èñëî ïàðàìåòðîâ (íàïðèìåð, ïðîöåäóðû òèïà printf). Îáúÿâëåíèå ïðîöåäóðû èìååò ñëåäóþùèé âèä: rettype modif procname(); Ïåðâûì èäåò íåîáÿçàòåëüíûé òèï âîçâðàòà èç ïðîöåäóð. Ïî óìîë÷àíèþ îí äëÿ 16-áèòíûõ ïðîãðàìì ðàâåí word, à äëÿ 32-áèòíûõ dword. Çàòåì äîëæåí èäòè òàêæå íåîáÿçàòåëüíûé ìîäèôèêàòîð. Ïî óìîë÷àíèþ âñå ñòåêîâûå ïðîöåäóðû â C-- (çà èñêëþ÷åíèåì ðåæèìà êîìïèëÿöèè ïðîãðàìì ïîä Windows, ãäå ïî óìîë÷àíèþ äåéñòâóåò ñòèëü âûçîâà ïðîöåäóð <b>stdcall</b>) èìåþò ñòèëü <b>pascal</b>. Äàëåå èäåò èì ïðîöåäóðû ñî ñêîáêàìè, êîòîðûå ÿâëÿþòñÿ ïðèçíàêîì òîãî ÷òî Âû îáúÿâëÿåòå ïðîöåäóðó, à íå ïåðåìåííóþ. Çàâåðøàåò îáúÿâëåíèå ñèìâîë òî÷êà ñ çàïÿòîé. Ïðè îáúÿâëåíèè ïðîöåäóð â C-- ïðîïèñûâàòü ïàðàìåòðû ïðîöåäóðû íåîáÿçàòåëüíî (òîãäà êîìïèëÿòîð íå áóäåò êîíòðîëèðîâàòü ÷èñëî è òèï ïåðåäàâàåìûõ ïàðàìåòðîâ), íî åñëè Âû èõ âñòàâèòå, òî âêëþ÷èòñÿ ìåõàíèçì êîíòðîëÿ çà ÷èñëîì è òèïîì ïàðàìåòðîâ. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.3> 11.3 Ðåãèñòðîâûå ïðîöåäóðû. </A></B></FONT><FONT FACE="Courier"> Ðåãèñòðîâûå ïðîöåäóðû îïðåäåëÿþòñÿ, ïî óìîë÷àíèþ, ïðè ïîìîùè èäåíòèôèêàòîðà, êîòîðûé íå ñîäåðæèò ñèìâîëîâ ñòðî÷íûõ áóêâ. Èëè æå ÿâíûì óêàçàíèåì ÷òî ýòî ðåãèñòðîâàÿ ïðîöåäóðà ñ ïîìîùüþ êëþ÷åâîãî ñëîâà <b>fastcall</b>. Êàê óæå áûëî ñêàçàíî, ïàðàìåòðû (åñëè îíè åñòü) äëÿ ðåãèñòðîâîé ïðîöåäóðû ïåðåäàþòñÿ ÷åðåç ðåãèñòðû. Ðåãèñòðîâûå ïðîöåäóðû ìîãóò èìåòü íå áîëåå 6 ïàðàìåòðîâ. Åñëè ïàðàìåòðû èìåþò òèï int èëè word, ðåãèñòðû ïî óìîë÷àíèþ èñïîëüçóþòñÿ â ñëåäóþùåì ïîðÿäêå: <b>AX, BX, CX, DX, DI, è SI</b>. Ïåðâûå ÷åòûðå ïàðàìåòðà ìîãóò òàêæå èìåòü òèï <b>char</b> èëè <b>byte</b>, â ýòîì ñëó÷àå çàäåéñòâóþòñÿ ðåãèñòðû <b>AL, BL, CL è DL</b> ñîîòâåòñòâåííî. Ëþáîé èç øåñòè ïàðàìåòðîâ ìîæåò èìåòü òèï <b>long, dword</b> èëè <b>float</b>, òîãäà äëÿ íåãî èñïîëüçóåòñÿ ðåãèñòð <b>EAX, EBX, ECX, EDX, EDI</b>, èëè <b>ESI</b>.  ñëåäóþùåì ïðèìåðå ðåãèñòðîâàÿ ïðîöåäóðà ñ èìåíåì TOGETHER âîçâðàùàåò çíà÷åíèå òèïà word êàê ðåçóëüòàò óìíîæåíèÿ ïåðâîãî ïàðàìåòðà, èìåþùåãî òèï word, íà âòîðîé ïàðàìåòð òîãî æå òèïà: word TOGETHER() /* AX = ïåðâûé ïàðàìåòð, BX = âòîðîé ïàðàìåòð */ { return (AX * BX); }  ñëåäóþùåì ïðèìåðå ðåãèñòðîâàÿ ïðîöåäóðà ñ èìåíåì SHOW_NUM, êîòîðàÿ íå âîçâðàùàåò íèêàêîãî çíà÷åíèÿ, çàòî âûâîäèò íà ýêðàí ïåðâûé ïàðàìåòð (èìåþùèé òèï int), çàòåì ðàçäåëèòåëüíûé çíàê â âèäå äâîåòî÷èÿ <b>:</b>, à çàòåì âòîðîé ïàðàìåòð (èìåþùèé òèï byte) : void SHOW_NUM () /* AX = ïåðâîå ÷èñëî, BL = âòîðîå ÷èñëî */ { $ PUSH BX WRITEINT (int AX); WRITE (':'); $ POP BX WRITEWORD (BL); } Íî åñëè â ïðîöåäóðå ñäåëàòü îáúÿâëåíèå ïîðÿäêà è òèïîâ èñïîëüçóåìûõ ðåãèñòðîâ, òî âîçìîæíî ïðîèçâîëüíîå èñïîëüçîâàíèå ðåãèñòðîâ. Áîëåå ïîäðîáíî îá ýòîì ìîæíî ïî÷èòàòü â ðàçäåëå îá îáúÿâëåíèÿõ ïàðàìåòðîâ â ðåãèñòðîâûõ ïðîöåäóðàõ. Äëÿ òîãî, ÷òîáû èñïîëüçîâàòü ðåãèñòðîâóþ ïðîöåäóðó êàê ìàêðîêîìàíäó, îíà äîëæíà áûòü îáúÿâëåíà êàê äèíàìè÷åñêàÿ ïðîöåäóðà. Äèíàìè÷åñêèå ïðîöåäóðû îïèñàíû â ñëåäóþùåì ïîäðàçäåëå. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.4> 11.4 Äèíàìè÷åñêèå ïðîöåäóðû. </A></B></FONT><FONT FACE="Courier"> Äèíàìè÷åñêèå ïðîöåäóðû - ïðîöåäóðû, êîòîðûå îïðåäåëåíû, íî âñòàâëÿþòñÿ â êîä ïðîãðàììû, òîëüêî åñëè åñòü âûçîâ. Äèíàìè÷åñêèå ïðîöåäóðû ìîãóò èñïîëüçîâàòüñÿ êàê ìàêðîêîìàíäû. Îïðåäåëåíèå äèíàìè÷åñêîé ïðîöåäóðû íà÷èíàåòñÿ ñ ñèìâîëà äâîåòî÷èÿ ':'. Ïðèìåð äèíàìè÷åñêîé ïðîöåäóðû ñòåêà: : void setvideomode (byte mode) { AL = mode; AH = 0; $ INT 0x10 } Ïðèìåð äèíàìè÷åñêîé ðåãèñòðîâîé ïðîöåäóðû: : int ABS () /* AX = ÷èñëî, àáñîëþòíîå çíà÷åíèå êîòîðîãî èùåòñÿ*/ { IF (int AX < 0) -AX; } <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.4.1> 11.4.1 Óñòàíîâêà äèíàìè÷åñêîé ïðîöåäóðû â îïðåäåëåííîå ìåñòî ïðîãðàììû. </A></B></FONT><FONT FACE="Courier"> Äèíàìè÷åñêèå ïðîöåäóðû, åñëè îíè íå èñïîëüçóþòñÿ êàê ìàêðîñû è åñëè îíè áûëè âîñòðåáîâàíû â ïðîãðàììå, âñòàâëÿþòñÿ â êîä ïðîãðàììû â ñàìîì êîíöå êîìïèëÿöèè.  êàêîì òî÷íî ìåñòå Âàøåé ïðîãðàììû îíè îêàæóòñÿ óçíàòü íåâîçìîæíî. Åñëè æå Âàì íåîáõîäèìî, ÷òîáû êàêàÿ-òî äèíàìè÷åñêàÿ ïðîöåäóðà íàõîäèëàñü â êîíêðåòíîì ìåñòå ïðîãðàììû, òî ýòî ìîæíî ñäåëàòü òàêèì îáðàçîì: :void proc ( int par1, par2) { ... } Ìû èìååì äèíàìè÷åñêóþ ïðîöåäóðó, êîä êîòîðîé áûë áû ðàñïîëîæåí ðàíåå êîäà îáû÷íîé ïðîöåäóðû íàøåé ïðîãðàììû. Äëÿ ýòîãî ïåðåä îïðåäåëåíèåì ýòîé ïðîöåäóðû íàäî íàïèñàòü òàêóþ ñòðîêó: @ void proc ();  èòîãå äèíàìè÷åñêàÿ ïðîöåäóðà áóäåò âñòàâëåíà â êîä ïðîãðàììû íå â êîíöå åå, êàê îáû÷íî, à â ìåñòå, ãäå áóäåò ðàñïîëîæåíà ýòà ñòðîêà. Åñëè äèíàìè÷åñêàÿ ïðîöåäóðà èìååò ïàðàìåòðû, òî ïðîïèñûâàòü ýòè ïàðàìåòðû íåîáÿçàòåëüíî.  êîìïèëÿòîðå åñòü åùå áîëåå ìîùíîå ñðåäñòâî, ïîçâîëÿþùåå âñå äèíàìè÷åñêèå îáúåêòû ( ïðîöåäóðû, ïåðåìåííûå, ñòðóêòóðû ) ðàñïîëîæèòü â óêàçàííîì ìåñòå, à íå â êîíöå ïðîãðàììû, êàê îáû÷íî. Ýòî äèðåêòèâà <b>#setdinproc</b>. Âñòðåòèâ ýòó äèðåêòèâó, êîìïèëÿòîð íåìåäëåííî ðàñïîëîæèò âñå èçâåñòíûå åìó íà ýòîò ìîìåíò äèíàìè÷åñêèå îáúåêòû â ìåñòå îáúÿâëåíèÿ ýòîé äèðåêòèâû. Ïîñëåäóþùèå äèíàìè÷åñêèå îáúåêòû áóäóò ðàñïîëàãàòüñÿ êàê îáû÷íî, â êîíöå ïðîãðàììû, åñëè êîíå÷íî, íå áóäåò ïîâòîðíî ïðèìåíåíà äèðåêòèâà <b>#setdinproc</b>. Ýòî ìîæåò áûòü ïðèìåíåíî è áûòü ïîëåçíûì ïðè ñîçäàíèè ðåçèäåíòíûõ ïðîãðàìì (TSR) è äðàéâåðîâ óñòðîéñòâ. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.5> 11.5 inline-ïðîöåäóðû. </A></B></FONT><FONT FACE="Courier"> inline-ïðîöåäóðàìè ìîãóò áûòü äèíàìè÷åñêèå ïðîöåäóðû, êîòîðûå ìîæíî èñïîëüçîâàòü êàê ìàêðîñû. Íî â îòëè÷èå îò ìàêðîñîâ, inline-ïðîöåäóðû, ïðè âêëþ÷åííîé îïòèìèçàöèè íà ñêîðîñòü, àâòîìàòè÷åñêè âñòàâëÿþòñÿ â êîä, à ïðè îïòèìèçàöèè êîäà íà ðàçìåð, äåëàåòñÿ âûçîâ èõ, êàê äèíàìè÷åñêèõ ïðîöåäóð. Íî èíîãäà áûâàåò íóæíî ïðè âêëþ÷åííîé îïòèìèçàöèè íà ðàçìåð êîäà, ÷òîáû ïðîöåäóðû âñòàâëÿëèñü â êîä, à íå äåëàëñÿ èõ âûçîâ. Äëÿ ýòèõ öåëåé ââåäåíà äèðåêòèâà <b>#inline TRUE</b>. Ýòîé æå äèðåêòèâîé ( <b>#inline FALSE</b> ), ìîæíî ïðè îïòèìèçàöèè íà ñêîðîñòü äåëàòü âûçîâû ïðîöåäóð, âìåñòî èõ âñòàâêè. Âàæíî ïîìíèòü, ÷òî ñòàòóñ äèðåêòèâû <b>#inline</b> àâòîìàòè÷åñêè ìåíÿåòñÿ ïðè ñìåíå ðåæèìà îïòèìèçàöèè. Ïðè óñòàíîâêå îïòèìèçàöèè íà ñêîðîñòü ñòàòóñ äèðåêòèâû <b>#inline</b> óñòàíàâëèâàåòñÿ â <b>TRUE</b>, à ïðè ñìåíå ðåæèìà îïòèìèçàöèè ïî ðàçìåðó êîäà, óñòàíàâëèâàåòñÿ â <b>FALSE</b>. Ïîýòîìó ïðèìåíÿéòå äèðåêòèâó <b>#inline</b> ëèøü ïîñëå ñìåíû ðåæèìà îïòèìèçàöèè. Äèðåêòèâû ìåíÿþùèå ðåæèì îïòèìèçàöèè <b>#codesize, #speed</b> è äèðåêòèâà <b>#inline</b>, îáúÿâëåííûå âíóòðè ïðîöåäóðû ðàñïðîñòðàíÿþòñÿ òîëüêî íà îñòàâøóþñÿ ÷àñòü ïðîöåäóðû, ò.å. îíè ñòàíîâÿòñÿ ëîêàëüíûìè. Äëÿ òîãî ÷òîáû èçìåíåíèÿ áûëè ãëîáàëüíûìè ýòè äèðåêòèâû íàäî îáúÿâëÿòü âíå òåëà ïðîöåäóðû. Äëÿ òîãî ÷òîáû îïðåäåëèòü inline-ïðîöåäóðó, íàäî â ïåðâîé ñòðîêå ñ èìåíåì ïðîöåäóðû âìåñòî ñèìâîëà äèíàìè÷åñêîé ïðîöåäóðû <b>(:)</b> íàïèñàòü êëþ÷åâîå ñëîâî <b>inline</b>. Ïðèìåð îïðåäåëåíèÿ inline-ïðîöåäóðû: inline int fastcall abs(AX) { IF ( int AX < 0 ) -AX ; } <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.5.1> 11.5.1 Äðóãîå ïðèìåíåíèå inline. </A></B></FONT><FONT FACE="Courier"> Êëþ÷åâîå ñëîâî <b>inline</b> èìååò â ïðîöåäóðàõ è äðóãîå ïðèìåíåíèå. Åñëè ýòî ñëîâî ðàñïîëîæåíî ïåðåä íà÷àëîì áëîêà ïðîöåäóðû, òî äëÿ òàêîé ïðîöåäóðû íå ñîçäàåòñÿ êàäð ñòåêà è íå ãåíåðèðóåòñÿ çàâåðøàþùèé ïðîöåäóðó <b>ret</b>. Ïðèìåð: void PROC () inline { ... } Òàêèå ïðîöåäóðû íå äîëæíû ñîäåðæàòü ëîêàëüíûõ ïåðåìåííûõ. Åñëè ïðîöåäóðà ÿâëÿåòñÿ ðåãèñòðîâîé (òèï <b>fastcall</b>), òî ñ ïåðåäà÷åé åé ïàðàìåòðîâ íåò ïðîáëåì. Åñëè æå ïðîöåäóðà ÿâëÿåòñÿ ñòåêîâîé, òî ïåðåäàòü â òàêóþ ïðîöåäóðó ïàðàìåòðû Âû ìîæåòå, íî âîñïîëüçîâàòüñÿ ýòèìè ïàðàìåòðàìè èñïîëüçóÿ èõ èìåíà, Âû óæå íå ñìîæåòå. Ýòî ïðîèñõîäèò ïîòîìó, ÷òî â ýòèõ ïðîöåäóðàõ êàäð ñòåêà íå ôîðìèðóåòñÿ. Ïðèìåð: void proc (int par1, par2) inline { AX=par1; /* êîìïèëÿòîð îáðàòèòñÿ ñ ïàðàìåòðó 'par1' ÷åðåç ðåãèñòð BP. Íî òàê êàê êàäð ñòåêà íå áûë ñîçäàí, ïðè âûïîëíåíèè ýòîãî êîäà ïðîãðàììà áóäåò ðàáîòàòü íå ïðàâèëüíî. */ ... } Âñòðåòèâ òàêîå îïðåäåëåíèå ïðîöåäóðû, êîìïèëÿòîð âûäàñò ïðåäóïðåæäåíèå î òîì, ÷òî â òàêèõ ïðîöåäóðàõ èñïîëüçîâàòü ëîêàëüíûå è ïàðàìåòðè÷åñêèå ïåðåìåííûå íåëüçÿ. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.6> 11.6 Ïðîöåäóðû îáðàáîòêè ïðåðûâàíèé. </A></B></FONT><FONT FACE="Courier"> Ïðîöåäóðû îáðàáîòêè ïðåðûâàíèé îïðåäåëÿþòñÿ ñëåäóþùèì ñïîñîáîì: interrupt procedure_name () { // put code here (çäåñü äîëæåí áûòü êîä îáðàáîòêè) } Ïðîöåäóðû îáðàáîòêè ïðåðûâàíèé íå ñîõðàíÿþò íèêàêèõ ðåãèñòðîâ àâòîìàòè÷åñêè, è íèêàêèå ðåãèñòðû ñàìè ïî ñåáå íå çàãðóæàþòñÿ ïåðåä ïåðåäà÷åé óïðàâëåíèÿ îáðàáîò÷èêó ïðåðûâàíèÿ, ñëåäîâàòåëüíî, íà Âàøåé ñîâåñòè ñîõðàíåíèå çíà÷åíèé ðåãèñòðîâ â ñòåêå è ïîñëåäóþùèé èõ âîçâðàò, à òàêæå çàãðóçêà ðåãèñòðà DS íóæíûì çíà÷åíèåì. Âîò ïðèìåð îáðàáîò÷èêà ïðåðûâàíèÿ, êîòîðûé ñîõðàíÿåò çíà÷åíèÿ âñåõ ðåãèñòðîâ è çàãðóæàåò ðåãèñòð DS: interrupt safe_handle () { $ PUSH DS $ PUSH ES $ PUSHA // äëÿ âûïîëíåíèÿ ýòîé êîìàíäû íóæåí ïðîöåññîð íå õóæå 80286 DS = CS; // çäåñü DS çàãðóæàåòñÿ äëÿ ðàáîòû ñ ìîäåëüþ ïàìÿòè òèïà tiny /* do your thing here (çäåñü âû äåëàåòå ñâîþ îáðàáîòêó)*/ $ POPA // äëÿ âûïîëíåíèÿ ýòîé êîìàíäû íóæåí ïðîöåññîð íå õóæå 80286 $ POP ES $ POP DS } Ïðè çàâåðøåíèè ïðîöåäóðû ïðåðûâàíèÿ áóäåò àâòîìàòè÷åñêè ñãåíåðèðîâàíà èíñòðóêöèÿ âûõîäà èç îáðàáîò÷èêà ïðåðûâàíèÿ - IRET. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.7> 11.7 Çàìåíà return íà goto. </A></B></FONT><FONT FACE="Courier">  íåêîòîðûõ ñèòóàöèÿõ, ïðè êîìïèëÿöèè ïðîãðàììû, îïåðàòîð <b>return</b> áóäåò çàìåíÿòüñÿ íà <b>goto</b>. Ýòî ïðîèñõîäèò ïðè ðàçðåøåííîé îïòèìèçàöèè ïî ðàçìåðó êîäà äëÿ îïåðàòîðîâ <b>return</b>, êîòîðûå ðàñïîëîæåíû âíóòðè ïðîöåäóðû è, åñòåñòâåííî, åñëè ðàçìåð êîäà äëÿ âûïîëíåíèÿ <b>return</b> áîëüøå, ÷åì ðàçìåð êîäà äëÿ ðåàëèçàöèè <b>goto</b>. Äëÿ äèíàìè÷åñêèõ ïðîöåäóð, êîòîðûå èñïîëüçóþòñÿ êàê ìàêðîñû, òàêàÿ çàìåíà áóäåò ïðîèçâîäèòñÿ âñåãäà. Îïåðàòîð <b>goto</b> áóäåò âûïîëíåí íà êîíåö ïðîöåäóðû, òàì, ãäå áóäåò ðàñïîëàãàòüñÿ åäèíñòâåííûé âûõîä èç ïðîöåäóðû.  äèíàìè÷åñêèõ ïðîöåäóðàõ, èñïîëüçóåìûõ â êà÷åñòâå ìàêðîñîâ, <b>return</b> â êîíöå ïðîöåäóðû áóäåò ïðîïóùåí êîìïèëÿòîðîì. Òàêèì îáðàçîì, ñíÿòî ïîñëåäíåå îãðàíè÷åíèå íà èñïîëüçîâàíèå äèíàìè÷åñêèõ ïðîöåäóð â êà÷åñòâå ìàêðîñîâ. Ëþáàÿ äèíàìè÷åñêàÿ ïðîöåäóðà ìîæåò áûòü èñïîëüçîâàíà êàê ìàêðîñ. Äëÿ îïåðàòîðà <b>goto</b> ñóùåñòâóåò åãî áîëåå êîðîòêèé àíàëîã - <b>GOTO</b>. Äëÿ ïîëó÷åíèÿ áîëåå êîìïàêòíîãî êîäà äëÿ îïåðàòîðà <b>return</b> ââåäåí òàêæå áîëåå êîðîòêèé îïåðàòîð <b>RETURN</b>. Åãî ìîæíî èñïîëüçîâàòü, åñëè îò ìåñòà åãî ïðèìåíåíèÿ äî êîíöà ïðîöåäóðû íàõîäèòñÿ íå áîëåå 128 áàéò. Åñëè Âû áóäåòå èñïîëüçîâàòü <b>RETURN</b> íà áîëüøåì ðàññòîÿíèè äî êîíöà ïðîöåäóðû, òî êîìïèëÿòîð âûäàñò ñîîáùåíèå îá îøèáêå. Ïðè èñïîëüçîâàíèè <b>return</b> íà ðàññòîÿíèè ìåíüøå 128 áàéò äî êîíöà êîäà, êîìïèëÿòîð âûäàñò âàì ïðåäóïðåæäåíèå î âîçìîæíîì èñïîëüçîâàíèè <b>RETURN</b>. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.8> 11.8 Âîçâðàùàåìûå çíà÷åíèÿ. </A></B></FONT><FONT FACE="Courier"> Âîçâðàùàåìûå èç ôóíêöèé çíà÷åíèÿ ðàñïîëàãàþòñÿ â ðåãèñòðàõ.  òàáëèöå ïîêàçàíî, êàêîé ðåãèñòð èñïîëüçóåòñÿ äëÿ êàæäîãî èç âîçâðàùàåìûõ òèïîâ: -------------------------------------------- | âîçâðàùàåìûé òèï | èñïîëüçóåìûé ðåãèñòð | -------------------------------------------- | byte | AL | | word | AX | | dword | EAX | | char | AL | | int | AX | | long | EAX | | float | EAX | -------------------------------------------- Ñàìûé ïðîñòîé ñïîñîá âåðíóòü çíà÷åíèå èç ôóíêöèè ñîñòîèò â òîì, ÷òîáû èñïîëüçîâàòü êîìàíäó return(), íî âìåñòî ýòîãî ìîæíî íàïðÿìóþ çàãðóçèòü âîçâðàùàåìîå çíà÷åíèå â ñîîòâåòñòâóþùèé ðåãèñòð. Íàïðèìåð, ñëåäóþùèå äâå ôóíêöèè âîçâðàùàþò îäíî è òî æå çíà÷åíèå: byte proc_one () { return (42); } byte proc_two () { AL = 42; } Ìíîãèå DOS ôóíêöèè 0x21 ïðåðûâàíèÿ â êà÷åñòâå èíäèêàòîðà óñïåøíîãî âûïîëíåíèÿ èñïîëüçóþò óñòàíîâêó èëè ñáðîñ carry ôëàãà. Èñïîëüçîâàòü ôëàãè ïðîöåññîðà ïðè âîçâðàòå èç ïðîöåäóð ìîæíî è â äðóãèõ ñëó÷àÿõ, êîãäà íàäî èìåòü ñòàòóñ óñïåøíîãî èëè íå óñïåøíîãî âûïîëíåíèÿ ïðîöåäóðû. Ýòî ïîçâîëèò áîëåå ïîëíî èñïîëüçîâàòü âîçìîæíîñòè ïðîöåññîðà è ñîîòâåòñòâåííî óìåíüøèò ðàçìåð êîäà è ïîâûñèò áûñòðîäåéñòâèå ïðîãðàììû. Íàðÿäó ñ ôëàãàìè, ïðè âîçâðàòå èç ïðîöåäóð, ïî ïðåæíåìó îñòàåòñÿ âîçâðàò ðàçëè÷íûõ òèïîâ è ÷åðåç ðåãèñòð <b>AL/AX/EAX</b>. Åñëè äëÿ ïðîöåäóðû îáúÿâëåíî, ÷òî îíà èìååò òèï âîçâðàòà <b>int è CARRYFLAG</b>, òî ïðè èñïîëüçîâàíèè òàêîé ïðîöåäóðû â îïåðàöèÿõ ñðàâíåíèÿ <b>IF, WHILE...</b> áóäåò äåëàòüñÿ ïðîâåðêà carry ôëàãà, à íå ñðàâíåíèå ðåãèñòðà AX. Ïðèìåð èñïîëüçîâàíèÿ âîçâðàòà ôëàãîâ èç ïðîöåäóð: int CARRYFLAG FOPEN(); // îáúÿâëåíèå ïðîöåäóðû void proc() { IF ( FOPEN(name,0) ) Error ( "Not open file" ); } Âàðèàíòû äîïóñòèìîãî ñèíòàêñèñà äëÿ èñïîëüçîâàíèÿ âîçâðàòà ôëàãà: IF ( ! FOPEN() )... IF ( @ FOPEN() )... IF ( ! @ FOPEN() )... IF ( handl = FOPEN() )... IF ( handl = @ FOPEN() )... IF ( ! handl = FOPEN() )... IF ( ! handl = @ FOPEN() )... À âîò âàðèàíòû, â êîòîðûõ, íåñìîòðÿ íà òî, ÷òî äëÿ ïðîöåäóðû îáúÿâëåí âîçâðàò ôëàãà, áóäåò ïðîèçâîäèòüñÿ ñðàâíåíèå ðåãèñòðà AX: IF ( FOPEN() == 5 )... // ïðîèçâîäèòñÿ ñðàâíåíèå IF ( FOPEN() + 2 )... // ðåçóëüòàò ïðîöåäóðû ïîäâåðãàåòñÿ äàëüíåéøåìó // âû÷èñëåíèþ, â ðåçóëüòàòå êîòîðîãî ôëàãè áóäóò // èçìåíåíû. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.9> 11.9 Îáúÿâëåíèå ïàðàìåòðîâ â ðåãèñòðîâûõ ïðîöåäóðàõ. </A></B></FONT><FONT FACE="Courier"> Ðàíåå êàæäîìó ïàðàìåòðó ðåãèñòðîâîé ïðîöåäóðû ñîîòâåòñòâîâàë ñòðîãî îïðåäåëåííûé ðåãèñòð. Íàïðèìåð, äëÿ ïåðåìåííûõ òèïà int èëè word ïåðâûé ïàðàìåòð ïåðåäàâàëñÿ ÷åðåç ðåãèñòð AX, 2-é - BX, 3-é - CX, 4-é - DX, 5-é - DI, 6-é - SI. Ïîýòîìó, åñëè Âàì áûëî íåîáõîäèìî ïåðåäàòü òîëüêî îäèí ïàðàìåòð ÷åðåç ðåãèñòð SI, òî ïðèõîäèëîñü ïåðåä íèì ïèñàòü ïÿòü çàïÿòûõ. Âîò êàê, íàïðèìåð, âûãëÿäèò âûçîâ ïðîöåäóðû STRCPY: void main () { STRCPY ( , , , , #dest, #sourc ) ; } Òåïåðü ðåãèñòðû ìîãóò ðàñïîëàãàòüñÿ ïðè ïåðåäà÷å ïàðàìåòðîâ ïðîèçâîëüíûì îáðàçîì. Íàäî òîëüêî îáúÿâèòü êîìïèëÿòîðó î òîì, êàêîé ðåãèñòð çàêðåïëåí çà êàêèì ïàðàìåòðîì äàííîé ïðîöåäóðû. Ïîñëå òàêîãî îáúÿâëåíèÿ êîìïèëÿòîð áóäåò ñàì ñëåäèòü çà òåì, ÷åðåç êàêîé ðåãèñòð ïåðåäàâàòü ïàðàìåòð ïðîöåäóðå, åãî ðàçìåðíîñòüþ è ÷èñëîì ïåðåäàâàåìûõ ïàðàìåòðîâ. Âîò êàê áóäåò âûãëÿäåòü îáúÿâëåíèå è èñïîëüçîâàíèå ïðîöåäóðû STRCPY: void STRCPY ( DI, SI ) ; //ýòî îáúÿâëåíèå ïðîöåäóðû void main () { STRCPY ( #dest, #sourc ) ; //à ýòî âûçîâ ïðîöåäóðû } Ìîæíî íå äåëàòü îáúÿâëåíèÿ ïðîöåäóðû, à óêàçàòü ðàñïîëîæåíèå ðåãèñòðîâ â çàãîëîâêå ïðîöåäóðû. Íî òîãäà òàêàÿ ïðîöåäóðà äîëæíà âûçûâàòüñÿ òîëüêî ïîñëå åå îïðåäåëåíèÿ. Âîò ïðèìåð ïðîöåäóðû âûâîäÿùåé íà ýêðàí íåñêîëüêî îäèíàêîâûõ ñèìâîëîâ: void PUTNCHAR(AL,CX,BL,BH) /* 1 ïàðàìåòð â AL - êîä ñèìâîëà, êîòîðûé áóäåò âûâåäåí 2 ïàðàìåòð â CX - ÷èñëî âûâîäèìûõ ñèìâîëîâ 3 ïàðàìåòð â BL - öâåòîâîé àòðèáóò 4 ïàðàìåòð â BH - íîìåð âèäåîñòðàíèöû */ { AH=9; $INT 0x10 } Ïðè îáúÿâëåíèè ðåãèñòðîâîé ïðîöåäóðû ìîæíî òàêæå óêàçûâàòü êàêîé òèï ïåðåìåííîé îæèäàåò ïðîöåäóðà (çíàêîâûé/áåç çíàêîâûé èëè âåùåñòâåííûé). Ïî óìîë÷àíèþ ñ÷èòàåòñÿ áåç çíàêîâûé òèï. Îäíàêî çíàêîâûé òèï óêàçûâàòü åñòü ñìûñë òîëüêî åñëè ïàðàìåòð ïåðåäàåòñÿ ÷åðåç ðåãèñòð <b>AL/AX/EAX</b>. ×åðåç äðóãèå ðåãèñòðû ïåðåìåííàÿ âñåãäà ïåðåäàåòñÿ êàê áåç çíàêîâàÿ. Ïðèìåð îáúÿâëåíèÿ ðåãèñòðîâîé ïðîöåäóðû ñ óêàçàíèåì òèïîâ: int fastcall Exampl( word CX, int AX, DX, float ESI ) ; | | | | | | | | | | | | | |---- 4-é ïàðàì. èìååò òèï float è | | | | | | ïåðåä. ÷åðåç ðåãèñòð ESI. | | | | | |-------- 3-é ïàðàì. èìååò ïî óìîë÷. | | | | | òèï word è ïåðåä. ÷åðåç DX. | | | | |------------ 2-é ïàðàì. èìååò òèï int è | | | | ïåðåäàåòñÿ ÷åðåç ðåãèñòð AX. | | | |---------------------- 1-é ïàðàì. èìååò òèï word è | | | ïåðåäàåòñÿ ÷åðåç ðåãèñòð CX. | | |------------------------------- Èìÿ îáúÿâëÿåìîé ïðîöåäóðû. | |---------------------------------------- Ìîäèôèêàòîð, óêàçûâàþùèé, ÷òî | ýòà ïðîö. ÿâë. ðåãèñòðîâîé. |--------------------------------------------- Ïðîöåäóðà âîçâðàùàåò ïåðåìåí. òèïà int. Åñëè Âû ñäåëàëè îáúÿâëåíèå ðåãèñòðîâ ïðîöåäóðû, òî êîìïèëÿòîð áóäåò ñòðîãî ñëåäèòü çà êîëè÷åñòâîì óêàçàííûõ ïàðàìåòðîâ ïðè âûçîâå ýòîé ïðîöåäóðû è âûäàâàòü ñîîáùåíèÿ îá îøèáêå, åñëè èõ áóäåò ìåíüøå èëè áîëüøå. Ñ îäíîé ñòîðîíû ýòî õîðîøî - åñòü êîíòðîëü çà òåì, ÷òî Âû íè÷åãî íå çàáûëè èëè íå äîáàâèëè ëèøíåãî ïðè âûçîâå ïðîöåäóðû. Ñ äðóãîé ñòîðîíû èíîãäà áûâàþò íåîáÿçàòåëüíûå ïàðàìåòðû, à èõ òåïåðü ïðèäåòñÿ ïðîïèñûâàòü. Íî åñëè Âû ïðè âûçîâå ïðîöåäóðû íå óêàæåòå íè îäíîãî ïàðàìåòðà, òî êîìïèëÿòîð íå áóäåò Âàì âûäàâàòü ñîîáùåíèå îá îøèáêå. Ýòî äàåò Âàì âîçìîæíîñòü ïðîèíèöèàëèçèðîâàòü ðåãèñòðû, ÷åðåç êîòîðûå Âû ïåðåäàåòå ïàðàìåòðû, âíå âûçîâà ïðîöåäóðû. Íî åñëè Âû óêàæåòå, õîòü îäèí ïàðàìåòð, òî Âàì ïðèäåòñÿ óêàçûâàòü è îñòàëüíûå, èíà÷å êîìïèëÿòîð áóäåò ñ÷èòàòü, ÷òî Âû èõ ñëó÷àéíî ïðîïóñòèëè è âûäàñò ñîîáùåíèå îá îøèáêå. Åñëè Âû íå îáúÿâèëè ðåãèñòðû íè ïðè îáúÿâëåíèè ðåãèñòðîâîé ïðîöåäóðû, íè â çàãîëîâêå ñàìîé ïðîöåäóðû, òî êîìïèëÿòîð áóäåò ñ÷èòàòü, ÷òî ïàðàìåòðû â ýòó ïðîöåäóðó ïåðåäàþòñÿ ñòàðûì ñïîñîáîì. Òàêèì îáðàçîì, äîñòèãàåòñÿ ïîëíàÿ ñîâìåñòèìîñòü ñ ïðåäûäóùèìè âåðñèÿìè êîìïèëÿòîðà. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.10> 11.10 Îáúÿâëåíèå ïàðàìåòðîâ â ñòåêîâûõ ïðîöåäóðàõ. </A></B></FONT><FONT FACE="Courier"> Êàê èçâåñòíî, ðàíåå â C-- êîíòðîëü çà ÷èñëîì è òèïîì ïåðåäàâàåìûõ ïðîöåäóðå ïàðàìåòðîâ âîçëàãàëñÿ íà ïðîãðàììèñòà. Ïîýòîìó âîçíèêëà íåïðîñòàÿ çàäà÷à, ñîâìåñòèòü îäíîâðåìåííî îòñóòñòâèå êîíòðîëÿ çà ïàðàìåòðàìè (äëÿ ñîâìåñòèìîñòè ñ ïðåäûäóùèìè âåðñèÿìè) è åå íàëè÷èå.  ðåçóëüòàòå êîìïðîìèññîâ ïîÿâèëñÿ âàðèàíò íåìíîãî îòëè÷àþùèéñÿ îò òðàäèöèîííî ïðèíÿòîãî â ÿçûêàõ C. Ãëàâíîå îòëè÷èå - ýòî òî, ÷òî ïàðàìåòðû, îïðåäåëÿåìûå ïðè îïðåäåëåíèè ïðîöåäóðû, íå áóäóò âîñïðèíèìàòüñÿ êîìïèëÿòîðîì äëÿ êîíòðîëÿ çà íèìè. Âî âñåõ ÿçûêàõ C äîïóñêàåòñÿ ñîâìåùåíèå ïðîòîòèïà ïðîöåäóðû è åå îáúÿâëåíèÿ.  C-- äëÿ òîãî, ÷òîáû âêëþ÷èëñÿ êîíòðîëü çà ïàðàìåòðàìè ñòåêîâîé ïðîöåäóðû, íàäî ýòó ïðîöåäóðó îáÿçàòåëüíî îáúÿâèòü. Íî íå âñÿêîå îáúÿâëåíèå ïðîöåäóðû áóäåò ñèãíàëîì êîìïèëÿòîðó î âêëþ÷åíèè êîíòðîëÿ çà ïàðàìåòðàìè ýòîé ïðîöåäóðû. Åñëè ïðè îáúÿâëåíèè â êðóãëûõ ñêîáêàõ íè÷åãî íå áóäåò, òî êîìïèëÿòîð íå áóäåò îòñëåæèâàòü ïàðàìåòðû, ïåðåäàâàåìûå ýòîé ïðîöåäóðå.  C++ òàêîå îáúÿâëåíèå îçíà÷àåò, ÷òî ïðîöåäóðå íå ïåðåäàþòñÿ íèêàêèå ïàðàìåòðû.  C-- äëÿ ýòîãî íàäî ïðè îáúÿâëåíèè ïðîöåäóðû â êðóãëûõ ñêîáêàõ îáÿçàòåëüíî íàïèñàòü void. Íàïðèìåð: int proc ( void ) ; Âñòðåòèâ òàêîå îáúÿâëåíèå ïðîöåäóðû, êîìïèëÿòîð áóäåò ñëåäèòü çà òåì, ÷òîáû ýòîé ïðîöåäóðå íå áûëè ïåðåäàíû ïàðàìåòðû. Ïðè îáúÿâëåíèè ïðîöåäóðû èìåíà ïàðàìåòðîâ ìîæíî îïóñêàòü. Êàê èçâåñòíî, â C-- ïàðàìåòðû ïðîöåäóðû îäíîãî òèïà çàïèñûâàþòñÿ ÷åðåç çàïÿòóþ. Äëÿ ñìåíû òèïà èñïîëüçóþò òî÷êó ñ çàïÿòîé. Ïðè îáúÿâëåíèè ñìåíó òèïà ìîæíî ïðîèçâîäèòü è ïîñëå çàïÿòîé: void ptoc ( int a, b, c; word d ); void proc ( int, int, int, word ); void proc ( int, int, int; word ); Âñå ýòè ïðèìåðû îáúÿâëåíèé ÿâëÿþòñÿ èäåíòè÷íûìè è äîïóñòèìûìè. Äëÿ êîíòðîëÿ çà ïðîöåäóðàìè ñ ïåðåìåííûì ÷èñëîì ïàðàìåòðîâ áûë ââåäåí íîâûé äëÿ C-- ýëåìåíò ñèíòàêñèñà - ìíîãîòî÷èå èëè åãî åùå íàçûâàþò ýëëèïñ. Âîò êàê áóäåò âûãëÿäåòü îáúÿâëåíèå ïðîöåäóðû printf: void cdecl printf ( word, ... ); <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.11> 11.11 Èñïîëüçîâàíèå ìàêðîêîìàíä. </A></B></FONT><FONT FACE="Courier"> Òåïåðü ëþáàÿ äèíàìè÷åñêàÿ ïðîöåäóðà ìîæåò áûòü èñïîëüçîâàíà êàê ìàêðîñ. Åñëè ïåðåä âûçîâîì äèíàìè÷åñêîé ïðîöåäóðû ïîñòàâèòü ñèìâîë <b>@</b>, òî êîä ýòîé ïðîöåäóðû áóäåò âñòàâëåí, à íå âûçâàí èíñòðóêöèåé CALL. Ïðè èñïîëüçîâàíèè ñòåêîâûõ äèíàìè÷åñêèõ ïðîöåäóð â êà÷åñòâå ìàêðîñîâ î÷èñòêà ñòåêà îò ïåðåäàííûõ ïàðàìåòðîâ ïðîèçâîäèòñÿ àññåìáëåðíîé èíñòðóêöèåé <b>ADD SP,SIZE_PARAMETRS</b> ñðàçó ïîñëå îêîí÷àíèÿ êîäà âñòàâëåííîãî ìàêðîñà. Ïîýòîìó, åñëè ýòà ïðîöåäóðà èñïîëüçîâàëà ôëàãè â êà÷åñòâå âîçâðàòà, òî îíè áóäóò ðàçðóøåíû. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.12> 11.12 Ïåðåäà÷à ïàðàìåòðîâ â ñòåêîâûå ïðîöåäóðû ÷åðåç ðåãèñòðû. </A></B></FONT><FONT FACE="Courier"> Ïðè ïåðåäà÷å ïàðàìåòðîâ ÷åðåç ðåãèñòðû, ÷àùå âñåãî ïîëó÷àåòñÿ áîëåå êîìïàêòíûé è áûñòðûé êîä. Íî ñîäåðæèìîå ðåãèñòðîâ ìîæåò áûòü ëåãêî ðàçðóøåíî. Åñëè â Âàøåé ïðîöåäóðå, êàêîé-òî èç ïàðàìåòðîâ èñïîëüçóåòñÿ îäíîêðàòíî äëÿ òîãî, ÷òîáû â íà÷àëå ïðîöåäóðû èíèöèàëèçèðîâàòü êàêîé-òî ðåãèñòð, òî Âû ìîæåòå ïåðåäàòü ýòî çíà÷åíèå â ïðîöåäóðó ñðàçó ÷åðåç ðåãèñòð, ìèíóÿ ñòàäèþ çàñîâûâàíèÿ è èçâëå÷åíèÿ ñîäåðæèìîãî â ñòåê. Ïðèìåð: int proc (int param1, param2, param3) { (E)BX = param3; (E)BX.TEG_STRUCT.var = proc2 (param1,papra2); proc3 (param1,param2); }  ýòîì ïðèìåðå ïàðàìåòð param3 èñïîëüçóåòñÿ ëèøü äëÿ òîãî, ÷òîáû èíèöèàëèçèðîâàòü ðåãèñòð (E)BX, ïîýòîìó åãî ìîæíî ñðàçó ïåðåäàòü ÷åðåç ðåãèñòð: int proc (int param1, param2, (E)BX) { (E)BX.TEG_STRUCT.var = proc2 (param1,papra2); proc3 (param1,param2); } Êàê Âû âèäèòå, ïðîöåäóðà íåìíîãî óïðîñòèëàñü.  ïðèíöèïå, ïîðÿäîê ðàñïîëîæåíèÿ ñòåêîâûõ è ðåãèñòðîâûõ ïàðàìåòðîâ íå ïðèíöèïèàëåí. Íî íàäî ïîìíèòü, ÷òî ñîäåðæèìîå ðåãèñòðîâ ìîæåò áûòü ëåãêî ðàçðóøåíî, è ïîýòîìó ëó÷øå âñåãî ðåãèñòðîâûå ïàðàìåòðû èíèöèàëèçèðîâàòü ëèøü ïîñëå òîãî, êàê áûëè çàñóíóòû â ñòåê âñå ñòåêîâûå ïàðàìåòðû. Äëÿ ïðîöåäóð òèïà <b>pascal</b> ðåãèñòðîâûå ïàðàìåòðû ëó÷øå ðàñïîëàãàòü ïîñëå ñòåêîâûõ ïàðàìåòðîâ. Äëÿ ïðîöåäóð òèïà <b>cdecl è stdcall</b> ñíà÷àëà ëó÷øå ðàñïîëàãàòü ðåãèñòðîâûå ïàðàìåòðû. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.13> 11.13 Âûçîâ ïðîöåäóð ñ àäðåñîì â ðåãèñòðå. </A></B></FONT><FONT FACE="Courier">  C-- äîïóñòèìî äåëàòü âûçîâ ïðîöåäóðû, àäðåñ êîòîðîé íàõîäèòñÿ â ðåãèñòðå. Ïàðàìåòðû äëÿ òàêîãî âûçîâà ïåðåäàþòñÿ òîëüêî ÷åðåç ñòåê. Òèï âûçîâà ïðîöåäóðû äëÿ ïðîãðàìì ïîä Windows <b>stdcall</b>, äëÿ îñòàëüíûõ <b>pascal</b>. Àäðåñ ïðîöåäóðû äëÿ 32-áèòíûõ ïðîãðàìì äîëæåí íàõîäèòñÿ â 32-áèòíîì ðåãèñòðå, à äëÿ 16-áèòíûõ ïðîãðàìì â 16-áèòíîì ðåãèñòðå. Ñ÷èòàåòñÿ, ÷òî òàêîé âûçîâ èìååò âîçâðàò òèïà <b>unsigned int</b>. Ïðèìåð: BX = # proc; BX (a); IF ( BX(b) == 0 ) AX=2; Âû ïîëó÷èòå ñëåäóþùèé êîä: test.c-- 8: BX=#proc; 0104 BB1A01 mov bx,11Ah test.c-- 9: BX(a); 0107 FF76FC push word ptr [bp-4] 010A FFD3 call near bx test.c-- 10: IF (BX(b) == 0)AX=2; 010C FF76FE push word ptr [bp-2] 010F FFD3 call near bx 0111 85C0 test ax,ax 0113 7503 jne 118h 0115 B80200 mov ax,2 <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.14> 11.14 Âñòðîåííûå â êîìïèëÿòîð ïðîöåäóðû. </A></B></FONT><FONT FACE="Courier"> Äëÿ íåêîòîðûõ ïðîöåäóð Âû íå íàéäåòå èõ èñõîäíûå òåêñòû â áèáëèîòåêàõ êîìïèëÿòîðà. Êîä ýòèõ ïðîöåäóð ãåíåðèðóåò êîìïèëÿòîð. Âîò ñïèñîê ýòèõ ïðîöåäóð: ABORT Ïðåêðàùåíèå âûïîëíåíèÿ ïðîãðàììû atan Âû÷èñëèòü àðêòàíãåíñ ÷èñëà atan2 Âû÷èñëèòü àðêòàíãåíñ ÷èñëà ATEXIT Çàðåãèñòðèðîâàòü ôóíêöèþ âûïîëíÿþùóþñÿ ïðè âûõîäå. cos Âîçâðàùàåò êîñèíóñ óãëà EXIT Çàêîí÷èòü ïðîãðàììó ñ êîäîì îøèáêè exp Âîçâðàùàåò ýêñïîíåíòó ÷èñëà inp/inportb Ñ÷èòàòü îäèí áàéò èç ïîðòà inport Ñ÷èòàòü ñëîâî èç ïîðòà inportd Ñ÷èòàòü äâîéíîå ñëîâî èç ïîðòà fabs Âîçâðàùàåò àáñîëþòíîå çíà÷åíèå ÷èñëà log Âû÷èñëÿåò íàòóðàëüíûé ëîãàðèôì ÷èñëà log10 Âû÷èñëÿåò äåñÿòè÷íûé ëîãàðèôì ÷èñëà outp/outportb Çàïèñàòü îäèí áàéò â ïîðò outport Çàïèñàòü ñëîâî â ïîðò outportd Çàïèñàòü äâîéíîå ñëîâî â ïîðò sin Âîçâðàùàåò ñèíóñ óãëà sqrt Èçâëå÷ü êâàäðàòíûé êîðåíü ÷åðåç FPU. tan Âîçâðàùàåò òàíãåíñ óãëà Ðàçìåùåíèå ýòèõ ïðîöåäóð íåïîñðåäñòâåííî â êîìïèëÿòîðå, ñâÿçàíî ñ òåì, ÷òî â íàñòîÿùèé ìîìåíò êîìïèëÿòîð ìîæåò òàêèì îáðàçîì ãåíåðèðîâàòü áîëåå ýôôåêòèâíûé êîä, ÷åì åñëè áû ýòè ïðîöåäóðû ðàñïîëàãàëèñü â áèáëèîòåêàõ.  áóäóùåì, ïî ìåðå ðàçâèòèÿ êîìïèëÿòîðà, ýòè ïðîöåäóðû ïîñòåïåííî áóäóò âûíîñèòñÿ èç êîìïèëÿòîðà â áèáëèîòåêè. Íî íè÷òî íå ìåøàåò Âàì óæå ñåé÷àñ íàïèñàòü ñâîè îäíîèìåííûå áèáëèîòå÷íûå ïðîöåäóðû. Âñòðåòèâ îïðåäåëåíèå òàêîé ïðîöåäóðû, êîìïèëÿòîð íå áóäåò âûäàâàòü íèêàêèõ ñîîáùåíèå, îí ïðîñòî áóäåò ïðèìåíÿòü Âàø âàðèàíò ïðîöåäóðû. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.14.1> 11.14.1 Ïðîöåäóðû ABORT, ATEXIT è EXIT. </A></B></FONT><FONT FACE="Courier"> Ïðîöåäóðû <b>ABORT è EXIT</b> ñâÿçàíû ñ ðàáîòîé äèðåêòèâû <b>#atexit</b> è ïðîöåäóðîé <b>ATEXIT</b>. Íàèáîëåå îïòèìàëüíóþ èõ ðåàëèçàöèþ è âçàèìíóþ èíòåãðàöèþ ìîæåò ñäåëàòü òîëüêî êîìïèëÿòîð. Èìåííî ïîýòîìó ýòè ïðîöåäóðû ïîääåðæèâàþòñÿ êîìïèëÿòîðîì. Ïðîöåäóðà <b>ATEXIT</b> - ðåãèñòðîâàÿ ïðîöåäóðà, êîòîðàÿ ðåãèñòðèðóåò ôóíêöèþ, àäðåñ êîòîðîé ïåðåäàåòñÿ åé â êà÷åñòâå ïàðàìåòðà, ò.å. ÷åðåç ðåãèñòð (E)AX, êàê ôóíêöèþ çàâåðøåíèÿ ïðîãðàììû. Ïðè óñïåøíîé ðåãèñòðàöèè <b>ATEXIT</b> âîçâðàùàåò 0. Âñåãî ìîæíî çàðåãèñòðèðîâàòü äî 16 ôóíêöèé. Çàâåðøàþùèå ôóíêöèè íå äîëæíû èìåòü ïàðàìåòðîâ è âîçâðàòà. Ýòè ôóíêöèè áóäóò âûïîëíÿòüñÿ â ïîðÿäêå îáðàòíîì î÷åðåäíîñòè ðåãèñòðàöèè â ñëó÷àå, åñëè Âû áóäåòå çàâåðøàòü ðàáîòó ïðîãðàììû ÷åðåç âûçîâû ïðîöåäóð <b>ABORT</b> èëè <b>EXIT</b> èëè çàêîí÷èòñÿ ðàáîòà ïðîöåäóðû <b>main</b>. Åñëè Âû çàâåðøèòå ðàáîòó ïðîãðàììû âûçîâîì ïðîöåäóðû <b>ExitProcess</b> ïîä Windows èëè âûçîâîì <b>AH=0x4C; $int 0x21</b> ïîä DOS, âûõîä èç ïðîãðàììû ïðîèçîéäåò áåç çàïóñêà çàðåãèñòðèðîâàííûõ ôóíêöèé. Ïðîöåäóðà <b>ABORT è EXIT</b>, åñëè íå âêëþ÷åíà äèðåêòèâà <b>#atexit</b> äåëàþò âûçîâ ïðîöåäóðû <b>ExitProcess</b> ïîä Windows è âûçîâ <b>AH=0x4C; $int 0x21</b> ïîä DOS. Ïðîöåäóðå <b>ABORT</b> íå ïåðåäàþòñÿ íèêàêèå ïàðàìåòðû, è îíà çàâåðøàåò ðàáîòó ïðîãðàììû ñ êîäîì âîçâðàòà 0. Ïðîöåäóðå <b>EXIT</b> ïåðåäàåòñÿ â êà÷åñòâå ïàðàìåòðà êîä âîçâðàòà, ñ êîòîðûì îíà è çàâåðøàåò ðàáîòó ïðîãðàììû. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.14.2> 11.14.2 Ïðîöåäóðû inp/inportb, inport, inportd, outp/outportb, outport è outportd </A></B></FONT><FONT FACE="Courier"> Ýòè ïðîöåäóðû âñåãäà âñòàâëÿþòñÿ â êîä êàê ìàêðîñû, ò.å. äëÿ ýòèõ ïðîöåäóð íèêîãäà íå ãåíåðèðóåòñÿ âûçîâ ïðîöåäóðû.  çàâèñèìîñòè îò çíà÷åíèÿ ïîðòà, ñ êîòîðûì ðàáîòàþò ýòè ïðîöåäóðû, ãåíåðèðóåòñÿ ðàçíûé êîä. Âñå ýòî ïîçâîëÿåò ïîëó÷àòü áîëåå êîìïàêòíûé êîä. Ïðîöåäóðû ÷òåíèÿ èç ïîðòà èìåþò òàêîé ïðîòîòèï: byte inp ( word port ); word inport ( word port ); dword inportd ( word port ); Ïðîöåäóðû çàïèñè â ïîðò èìåþò òàêîé ïðîòîòèï: void outp ( byte val; word port ); void outport ( word val; word port ); void outportd ( dword val; word port ); Èìåíà ïðîöåäóð inp è inportb, òàêæå êàê è èìåíà outp è outportb ÿâëÿþòñÿ ñèíîíèìàìè. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.14.3> 11.14.3 Ïðîöåäóðû äëÿ ðàáîòû ñ âåùåñòâåííûìè ÷èñëàìè. </A></B></FONT><FONT FACE="Courier"> Ýòè ïðîöåäóðû ðåàëèçóþòñÿ êîìïèëÿòîðîì è âñåãäà âñòàâëÿþòñÿ â êîä êàê ìàêðîñû, ò.å. äëÿ íèõ íèêîãäà íå ãåíåðèðóåòñÿ âûçîâ ïðîöåäóðû. Êðîìå ýòîãî, åñëè ïàðàìåòðîì îäíîé ïðîöåäóðû ÿâëÿåòñÿ âûçîâ äðóãîé, òî ðåçóëüòàò ðàáîòû âòîðîé ïðîöåäóðû îñòàåòñÿ â ñòåêå FPU, à ïåðâàÿ ïðîöåäóðà èñïîëüçóåò ýòîò ðåçóëüòàò íåïîñðåäñòâåííî èç ñòåêà. Òàêèì îáðàçîì ïîëó÷àþòñÿ áîëåå êîìïàêòíûé êîä. Âîò âûìûøëåííûé ïðèìåð: test.c-- 7: f = sin( sqrt(1) ); 0100 D9061C01 fld [11Ch] 0104 D9FA fsqrt 0106 D9FE fsin 0108 D91E2001 fstp [120h] 010C 9B fwait Ýòè ïðîöåäóðû èìåþò ñëåäóþùèé ïðîòîòèï: float atan ( float val ); float atan ( float val, val2 ); float cos ( float val ); float exp ( float val ); float fabs ( float val ); float log ( float val ); float log10 ( float val ); float sin ( float val ); float sqrt ( float val ); float tan ( float val ); <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.15.1> 11.15 Êëàññû. 11.15.1 Îáúÿâëåíèå ïðîöåäóð â ñòðóêòóðàõ. </A></B></FONT><FONT FACE="Courier"> Ñ ââåäåíèå ïîääåðæêè îáúÿâëåíèÿ ïðîöåäóð â ñòðóêòóðàõ, ñòðóêòóðà ñòàíîâèòñÿ ïîäîáíîé êëàññó â C++. Ò.å. òàêàÿ ïðîöåäóðà ñòàíîâèòñÿ ìåòîäîì êëàññà. Ïðèìåð: struct Point // îáúÿâëåíèå êëàññà { int x; // ýëåìåíòû äàííûõ int y; // êëàññà òèïà Point void SetX(int); // îáúÿâëåíèå ìåòîäîâ void SetY(int); // êëàññà Point }; void Point::SetX(int _x) //îïðåäåëåíèå ïðîöåäóðû êëàññà Point { IF((_x>=0)&&(_x<=MAX_X)) x=_x; // ïåðåìåííûå x, y ÿâëÿþòñÿ ÷ëåíàìè ýòîãî êëàññà è ïîýòîìó äîñòóï ê íèì èç // ïðîöåäóð ýòîãî æå êëàññà îñóùåñòâëÿåòñÿ íàïðÿìóþ. } void main() Point p; //îïðåäåëÿåì ñòðóêòóðó â ñòåêå { p.y = p.x = 0; p.SetX(1); } Ïðè âûçîâå ïðîöåäóðû ÿâëÿþùåéñÿ ìåòîäîì êëàññà åé íåÿâíûì îáðàçîì ïåðåäàåòñÿ àäðåñ ýòîãî êëàññà (ñòðóêòóðû).  ñàìîé ïðîöåäóðå ýòîò àäðåñ äîñòóïåí ÷åðåç èìÿ ïàðàìåòðè÷åñêîé ïåðåìåííîé <b>this</b>. Ýòó ïåðåìåííóþ àâòîìàòè÷åñêè ãåíåðèðóåò êîìïèëÿòîð. Åñëè â îáúÿâëåíèå ïðîöåäóðû â ñòðóêòóðå óêàçàòü êëþ÷åâîå ñëîâî <b>static</b>, òî òàêîé ïðîöåäóðå àäðåñ êëàññà íå ïåðåäàåòñÿ è ïåðåìåííàÿ <b>this</b> íå ãåíåðèðóåòñÿ. Ïðîöåäóðà îáúÿâëåííàÿ â ñòðóêòóðå ìîæåò áûòü äèíàìè÷åñêîé. Äëÿ ýòîãî, ïðè åå îïðåäåëåíèè, â ñàìîì åå íà÷àëå, íàäî íàïèñàòü ñèìâîë äâîåòî÷èÿ <b>:</b> (òàêæå êàê è äëÿ îáû÷íûõ äèíàìè÷åñêèõ ïðîöåäóð). Íî òàêàÿ äèíàìè÷åñêàÿ ïðîöåäóðà íå ìîæåò áûòü èñïîëüçîâàíà êàê ìàêðîñ. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.15.2> 11.15.2 Íàñëåäîâàíèå. </A></B></FONT><FONT FACE="Courier">  C-- ïîääåðæèâàþòñÿ ïðîñòûå è ìíîæåñòâåííûå íàñëåäîâàíèÿ. Îáúÿâëåíèå ñòðóêòóðû ñ íàñëåäîâàíèåì èìååò ñëåäóþùèé ñèíòàêñèñ: struct Derived : Base1, Base2, ... Basen { int x0; }; ×èñëî áàçîâûõ ñòðóêòóð â ïðîèçâîäíîì íå îãðàíè÷åíî. Ïðè ìíîæåñòâåííîì íàñëåäîâàíèè ñòðóêòóðà ìîæåò íàñëåäîâàòü äâà è áîëåå ýêçåìïëÿðà áàçîâîé ñòðóêòóðû. Ïðè ýòîì âîçíèêàåò íåîäíîçíà÷íîñòü. Ïðèìåð: struct A { int x,y; . . . }; struct B : A //ñòðóêòóðà <b>B</b> íàñëåäóåò <b>A</b> { . . . }; struct C : A //ñòðóêòóðà <b>C</b> íàñëåäóåò <b>A</b> { . . . }; struct D : B, C //ñòðóêòóðà <b>D</b> íàñëåäóåò <b>B è C</b> { . . . }; void main() D d; //âûäåëÿåì äëÿ ñòðóêòóðû <b>D</b> ïàìÿòü â ñòåêå è ïðèñâàèâàåì åé èìÿ <b>d</b> { d.x0=0;  ýòîì ïðèìåðå ñòðóêòóðà <b>D</b> íàñëåäóåò äâà ýêçåìïëÿðà ñòðóêòóðû <b>A</b> è â íåé íàõîäÿòñÿ äâà ýëåìåíòà ñ èìåíåì <b>x0</b>. Êîìïèëÿòîðû C++ ïðè çàïèñè òèïà <b>d.x0=0</b> âûäàþò ñîîáùåíèå îá îøèáêå. C-- ýòó çàïèñü îáðàáàòûâàåò, ïðèñâàèâàíèå ïðîèçâîäèòñÿ ïî óìîë÷àíèþ â ýëåìåíò èç ïîñëåäíåé áàçîâîé ñòðóêòóðû, èìåþùåé ýëåìåíò <b>x0</b>. Äëÿ òîãî ÷òîáû ïîëó÷èòü äîñòóï êî âòîðîìó ýëåìåíòó <b>x0</b> (ôèçè÷åñêè ýòîò ýëåìåíò íàõîäèòñÿ â ñòðóêòóðå ïåðâûì), íåîáõîäèìî ïðèìåíèòü îïåðàöèþ ðàçðåøåíèÿ âèäèìîñòè: d.B::x0=0; Èç âñåãî ýòîãî ñëåäóåò, ÷òî çàïèñè: d.x0=0; è d.C::x0=0; ÿâëÿþòñÿ ðàâíîçíà÷íûìè. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=11.15.3> 11.15.3 Íàñëåäîâàíèå ïðîöåäóð. </A></B></FONT><FONT FACE="Courier"> Åñëè â áàçîâîì êëàññå åñòü ïðîöåäóðà, à â ïðîèçâîäíîì êëàññå Âû ýòó ïðîöåäóðó ïåðåîïðåäåëèëè, òî ýòà ïðîöåäóðà áóäåò ïåðåîïðåäåëåíà è â áàçîâîì êëàññå. Òàêèì îáðàçîì ïðîöåäóðà îïðåäåëåííàÿ â áàçîâîì êëàññå áóäåò ïîòåðÿíà. Ïðèìåð: struct Point // áàçîâûé êëàññ { int x; // ýëåìåíòû äàííûõ int y; // êëàññà òèïà Point void SetX(int); // îáúÿâëåíèå ìåòîäîâ void SetY(int); // êëàññà Point }; void Point::SetX(int _x) // îïðåäåëåíèå ïðîöåäóðû êëàññà Point { IF((_x>=0)&&(_x<=MAX_X)) x=_x; } struct Point2 : Point // ïðîèçâîäíûé êëàññ { int x2; } struct Point3 : Point // åùå îäèí ïðîèçâîäíûé êëàññ { int z; } void Point3::SetX(int _x) // â ýòîì ïðîèçâîäíîì êëàññå ïåðåîïðåäåëÿåì { // ïðîöåäóðó SetX IF((_x>=80)&&(_x<=MAX_X)) x=_x; } Ïðîöåäóðà SetX, îïðåäåëåííàÿ â áàçîâîì êëàññå Point, òåïåðü áóäåò íåäîñòóïíà. Âìåñòî êîäà îïðåäåëåííîãî â ýòîì êëàññå, áóäåò âûçûâàòüñÿ êîä ïðîöåäóðû, îïðåäåëåííûé â íàñëåäóåìîì êëàññå Point3. Ïðè âûçîâå ïðîöåäóðû SetX èç äðóãîãî ïðîèçâîäíîãî êëàññà Point2 áóäåò òàêæå âûçûâàòüñÿ êîä ïðîöåäóðû, îïðåäåëåííûé â ïðîèçâîäíîì êëàññå Point3. Ïåðåîïðåäåëÿÿ ïðîöåäóðó òàêèì îáðàçîì, Âû çàìåíèòå êîä ýòîé ïðîöåäóðû â áàçîâîì êëàññå è âî âñåõ åãî íàñëåäóåìûõ êëàññàõ. Åñëè Âàì íåîáõîäèìî, ÷òîáû êîä íîâîé ïðîöåäóðû áûë äîñòóïåí îäíîâðåìåííî ñ êîäîì ñòàðîé ïðîöåäóðû, òî â ïðîèçâîäíîì êëàññå Âàì íåîáõîäèìî ñäåëàòü åùå îäíî îáúÿâëåíèå ýòîé ïðîöåäóðû. Ïðèìåð: struct Point // áàçîâûé êëàññ { int x; // ýëåìåíòû äàííûõ int y; // êëàññà òèïà Point void SetX(int); // îáúÿâëåíèå ìåòîäîâ void SetY(int); // êëàññà Point }; void Point::SetX(int _x) // îïðåäåëåíèå ïðîöåäóðû êëàññà Point { IF((_x>=0)&&(_x<=MAX_X)) x=_x; } struct Point2 : Point // ïðîèçâîäíûé êëàññ { int x2; } struct Point3 : Point // åùå îäèí ïðîèçâîäíûé êëàññ { int z; void SetX(int); // â íàñëåäóåìîì êëàññå äåëàåì åùå îäíî îáúÿâëåíèå // ïðîöåäóðû SetX } void Point3::SetX(int _x) // â ýòîì ïðîèçâîäíîì êëàññå ïåðåîïðåäåëÿåì { // ïðîöåäóðó SetX IF((_x>=80)&&(_x<=MAX_X)) x=_x; EDI=this; EDI.Point.SetX(_x); // äåëàåì âûçîâ îäíîèìåííîé ïðîöåäóðû èç // áàçîâîãî êëàññà } Òåïåðü èç ïðîèçâîäíîãî êëàññà Point3 Âàì äîñòóïíû äâå ðàçëè÷íûå ïðîöåäóðû ñ îäíèì èìåíåì SetX. À èç áàçîâîãî êëàññà Point è èç äðóãîãî ïðîèçâîäíîãî êëàññà Point2 áóäåò ïî ïðåæíåìó äîñòóïåí òîëüêî áàçîâûé âàðèàíò ïðîöåäóðû SetX. <A href="#contents11" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.1> 12. Òèïû âûõîäíûõ ôàéëîâ. 12.1 Âûõîäíûå ôàéëû òèïà COM. </A></B></FONT><FONT FACE="Courier"> Ýòîò òèï âûõîäíîãî ôàéëà ïîëó÷àåòñÿ àâòîìàòè÷åñêè ïî óìîë÷àíèþ. Èçíà÷àëüíî C-- ìîã äåëàòü òîëüêî ôàéëû ôîðìàòà òèïà COM.  íàñòîÿùåå âðåìÿ ïîÿâèëàñü âîçìîæíîñòü ïîëó÷àòü ôàéëà òèïà EXE ñ ìîäåëÿìè ïàìÿòè tiny è small äëÿ 16-áèòíîãî êîäà, à òàêæå 32-áèòíûå äëÿ DOS è Windows. Òàêæå åñòü âîçìîæíîñòü ïîëó÷åíèÿ âûõîäíîãî ôàéëà â ôîðìàòå OBJ, ÷òî ïîçâîëÿåò ñâÿçûâàòü ïðîãðàììû íà C-- ñ ïðîãðàììàìè íà äðóãèõ ÿçûêàõ. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.2> 12.2 Âûõîäíûå ôàéëû òèïà EXE. </A></B></FONT><FONT FACE="Courier"> Ýòîò ôîðìàò ôàéëà ìîæíî ïîëó÷èòü, åñëè êîìïèëèðîâàòü ñ êëþ÷îì êîìàíäíîé ñòðîêè <b>/exe</b> èëè <b>/e</b>. Âîçìîæíî òàêæå ïîääåðæêà EXE-ôîðìàòà ÷åðåç âûõîäíîé ôàéë ôîðìàòà OBJ, êîòîðûé ìîæíî çàòåì îáðàáîòàòü ëèíêîâùèêîì, íå âõîäÿùèì â ïàêåò C--. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.3> 12.3 Âûõîäíîé ôàéë *.EXE ñ ìîäåëüþ ïàìÿòè tiny. </A></B></FONT><FONT FACE="Courier"> Ôàêòè÷åñêè êîä ôàéëà *.exe ìîäåëè <b>tiny</b> íè÷åì íå îòëè÷àåòñÿ îò êîäà *.com.  ñóùíîñòè, ýòî òîò æå com-ôàéë, ê êîòîðîìó äîáàâëåí 32-áàéòíûé çàãîëîâîê exe-ôàéëà. Åäèíñòâåííîå îòëè÷èå âîçíèêàåò, êîãäà Âû êîìïèëèðóåòå ôàéë ñ äèðåêòèâîé <b>?resize TRUE</b>.  com-ôàéëå, ïî ýòîé äèðåêòèâå, â êîä ïðîãðàììû äîáàâëÿåòñÿ ñîîòâåòñòâóþùèé êîä, èçìåíÿþùèé ðàçìåð äîñòóïíîé ïàìÿòè.  exe-ôàéëå äëÿ ýòèõ öåëåé áóäåò ñêîððåêòèðîâàí çàãîëîâîê exe-ôàéëà. ×òîáû ïîëó÷èòü exe-ôàéë ñ ìîäåëüþ ïàìÿòè <b>tiny</b>, íàäî çàïóñòèòü êîìïèëÿòîð ñ êëþ÷îì â êîìàíäíîé ñòðîêå <b>/TEXE</b>. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.4> 12.4 Îáúåêòíûé âûõîäíîé ôàéë OBJ. </A></B></FONT><FONT FACE="Courier">  íàñòîÿùåå âðåìÿ C-- ìîæåò òîëüêî ñîçäàâàòü OBJ-ôàéëû, íî íå ìîæåò èõ êîìïîíîâàòü. Ðàíåå C-- ñîçäàâàë obj-ôàéëû, êîòîðûå ìîãëè áûòü ïîäêëþ÷åíû ê ïðîåêòàì ñîçäàííûì íà äðóãèõ ÿçûêàõ, ò.å. âåäîìûå (slave) ìîäóëè. Ïðè÷åì èç C-- ìîäóëåé äëÿ îñíîâíîãî ïðîåêòà áûëè äîñòóïíû òîëüêî ïðîöåäóðû è ýòè ïðîöåäóðû íå äîëæíû áûëè èñïîëüçîâàòü ãëîáàëüíûå ïåðåìåííûå. Òåïåðü æå C-- ìîæåò ñîçäàâàòü îñíîâíîé ìîäóëü (master), êîòîðûé ìîæåò áûòü ñëèíêîâàí â ñàìîñòîÿòåëüíûé ôàéë. Äëÿ obj-ôàéëîâ ïîÿâèëàñü âîçìîæíîñòü èñïîëüçîâàòü âíåøíèå (extern) ïðîöåäóðû, ïåðåìåííûå èëè ñòðóêòóðû. Äëÿ ýòîãî äîñòàòî÷íî èõ îáúÿâèòü êàê extern. Ïðè÷åì êëþ÷åâîå ñëîâî extern äîëæíî áûòü âñåãäà ïåðâûì. Ïðèìåð îáúÿâëåíèÿ âíåøíèõ îáúåêòîâ: extern void cdecl _printf(); // îáúÿâëåíèå âíåøíåé ïðîöåäóðû _printf èìåþùåé // òèï cdecl è òèï âîçâðàòà void extern int buts,cubs; // îáúÿâëåíèå äâóõ âíåøíèõ ïåðåìåííûõ òèïà int extern struct IPXL ipxl; // îáúÿâëåíèå âíåøíåé ñòðóêòóðû ipxl èìåþùåé òåã // IPXL, ïðè÷åì òåã ýòîé ñòðóêòóðû äîëæåí áûòü // îïèñàí ðàíåå. Ïîÿâëåíèå âîçìîæíîñòè îáúÿâëÿòü âíåøíèå îáúåêòû ïîçâîëÿåò ïîäêëþ÷àòü ê obj-ìîäóëþ íà C-- ìîäóëè íàïèñàííûå íà äðóãèõ ÿçûêàõ èëè ïîäêëþ÷àòü ê ïðîãðàììå íà C-- ïðîöåäóðû èç áèáëèîòåê íà äðóãèõ ÿçûêàõ. Ïðè îáúÿâëåíèè âíåøíèõ îáúåêòîâ î÷åíü âàæíî ïðàâèëüíî óêàçàòü òèï ïðîöåäóðû è åå èìÿ. Åñëè Âû áóäåòå èñïîëüçîâàòü âíåøíèå ïðîöåäóðû, íàïèñàííûå íà C òî ÷àùå âñåãî, Âàì íóæíî áóäåò óêàçûâàòü ìîäèôèêàòîð <b>cdecl</b>, à ê èìåíè ïðîöåäóðû èëè ïåðåìåííîé äîáàâëÿòü ïðåôèêñ <b>_</b>. Èç îñíîâíîãî (master) obj-ôàéëà íàïèñàííîãî íà C-- äëÿ äðóãèõ obj-ìîäóëåé äîñòóïíû âñå ïðîöåäóðû, ãëîáàëüíûå ïåðåìåííûå è ãëîáàëüíûå ñòðóêòóðû. ×òîáû ïîëó÷èòü âåäîìûé obj-ìîäóëü ïðè êîìïèëÿöèè íàäî èñïîëüçîâàòü êëþ÷ <b>/sobj</b>. C-- ìîæåò ñîçäàâàòü obj-ôàéëû ñ ìîäåëüþ ïàìÿòè tiny è small. Ïî óìîë÷àíèþ ñîçäàþòñÿ ìîäóëè ñ ìîäåëüþ tiny. ×òîáû ïîëó÷èòü obj-ôàéë ñ ìîäåëüþ ïàìÿòè small íàäî çàïóñòèòü êîìïèëÿòîð ñ êëþ÷àìè <b>/obj è /exe</b>. Äëÿ ñîçäàíèÿ obj-ôàéëîâ äëÿ 32-áèòíîãî DOS â êîìàíäíîé ñòðîêå Âàì íåîáõîäèìî óêàçàòü êëþ÷è <b>/d32 è /obj</b>. Èñïîëüçîâàòü ïîëó÷åííûé obj-ôàéë ìíå óäàëîñü ëèøü ñ ïîìîùüþ wlink è ðàñøèðèòåëÿ zrdx.exe. Ñîçäàíèå obj-ôàéëîâ ïîä windows íå ïðåäóñìîòðåíî. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.5.1> 12.5 COM ôàéë symbiosis. 12.5.1 ÑÈÌÁÈÎÇ - ÷òî ýòî òàêîå? </A></B></FONT><FONT FACE="Courier"> Òðàíñëÿòîð C-- èìååò êëþ÷, ïîçâîëÿþùèé äîáàâëÿòü êîìïèëèðóåìóþ ïðîãðàììó ê êîíöó óæå èìåþùåãîñÿ COM ôàéëà. Ýòî íàçûâàþò COM-ôàéë Symbiosis. Êîãäà òàêàÿ ïðîãðàììà çàïóñêàåòñÿ, óïðàâëåíèå ñíà÷àëà ïîëó÷àåò äîáàâëåííûé êîä C--, è òîëüêî ïîñëå âûïîëíåíèÿ åãî ïðîöåäóðû main() óïðàâëåíèå ïîëó÷èò ïåðâîíà÷àëüíûé êîä COM-ôàéëà. Åñëè äîáàâëåííûé âàìè êîä çàâåðøàåòñÿ EXIT() èëè ABORT(), ïðîãðàììà ïðåêðàòèòñÿ, è ïåðâîíà÷àëüíûé êîä COM-ôàéëà íå áóäåò âûïîëíåí. Ýòî ïîçâîëÿåò ïðîãðàììå, äîáàâëåííîé ê COM ôàéëó, îïðåäåëÿòü, áóäåò ëè óïðàâëåíèå ïåðåäàíî íà ïåðâîíà÷àëüíûé êîä. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.5.2> 12.5.2 Êàê ýòî äåëàòü. </A></B></FONT><FONT FACE="Courier"> ×òîáû ñäåëàòü ýòî, Âû äîëæíû èñïîëüçîâàòü êëþ÷ <b>/SYM</b> â êîìàíäíîé ñòðîêå êîìïèëÿòîðà, â êîòîðîé óêàçûâàåòñÿ ïîëíîå èìÿ COM-ôàéëà, ê êîòîðîìó ÷òî-òî äîáàâëÿåòñÿ. Ïðè ýòîì îðèãèíàë COM-ôàéëà íå ìåíÿåòñÿ, à íîâûé ôàéë ñîäåðæèò åãî â ñåáå. Íàïðèìåð, ÷òîáû îòêîìïèëèðîâàòü ïðîãðàììó HELLO.C-- ê êîíöó êîïèè C:\command.ñîì èñïîëüçóþò ñëåäóþùóþ êîìàíäó: C-- /SYM C:\COMMAND.COM HELLO.C-- Áóäåò ñîçäàí âûõîäíîé ôàéë HELLO.COM . <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.5.3> 12.5.3 Èñïîëüçîâàíèå. </A></B></FONT><FONT FACE="Courier"> Âû ìîæåòå, âåðîÿòíî, ïðèäóìàòü áîëüøîå êîëè÷åñòâî ïóòåé èñïîëüçîâàíèÿ ýòîé ôóíêöèè, òèïà: - Äîáàâëåíèå çàùèòû ñ èñïîëüçîâàíèåì ïàðîëÿ ê íåêîòîðûì ñïåöèàëüíûì COM ôàéëàì. - Óìåíüøåíèå ïàìÿòè, äîñòóïíîé COM ôàéëó ïðè çàïóñêå. - Èíèöèàëèçàöèÿ ðåæèìà âèäåî äëÿ COM ôàéëà. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.5.4> 12.5.4 Çëîóïîòðåáëåíèÿ. </A></B></FONT><FONT FACE="Courier"> Ëþáîé çëîóìûøëåííèê ìîæåò ïðèäóìàòü è âðåäíûå ïðèìåíåíèÿ äëÿ ýòîé ôóíêöèè. Íàèáîëåå î÷åâèäíîå èç íèõ - ñîçäàíèå òðîÿíñêèõ êîíåé. ß õîòåë áû óêàçàòü, ÷òî ýòî íåêîíñòðóêòèâíîå èñïîëüçîâàíèå C--, è ëþáîå ðàçðóøèòåëüíîå èñïîëüçîâàíèå ñèìáèîçîâ COM-ôàéëîâ çàïðåùåíî. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.6> 12.6 SYS - äðàéâåðû óñòðîéñòâ. </A></B></FONT><FONT FACE="Courier"> Êîìïèëÿòîð çíà÷èòåëüíî îáëåã÷èò Âàø òðóä ïðè íàïèñàíèè äðàéâåðîâ. Êîìïèëÿòîð ñàì ñîçäàñò çàãîëîâîê äðàéâåðà è ïðîöåäóðû <b>ÑÒÐÀÒÅÃÈß</b> è <b>ÏÐÅÐÛÂÀÍÈÅ</b>. Âàì îñòàåòñÿ ëèøü íàïèñàòü êîä îáðàáîòêè êîìàíä. ×òî áû îòêîìïèëèðîâàòü ôàéë äðàéâåðà óñòðîéñòâà, íàäî äîáàâèòü â êîìàíäíóþ ñòðîêó êëþ÷ <b>/SYS</b>. Êðîìå òîãî, ïîÿâèëèñü íîâûå äèðåêòèâû êîìïèëÿòîðó, êîòîðûå äåéñòâóþò òîëüêî ñ ýòèì êëþ÷îì. Âîò îíè: <b>?sysattribute çíà÷åíèå</b> - ýòà äèðåêòèâà ïåðåäàåò êîìïèëÿòîðó àòðèáóò ñîçäàâàåìîãî äðàéâåðà. Ïî óìîë÷àíèþ óñòàíàâëèâàåòñÿ çíà÷åíèå 0x2000. <b>?sysname <òåêñòîâàÿ ñòðîêà></b> - ýòà äèðåêòèâà ïåðåäàåò êîìïèëÿòîðó èìÿ áóäóùåãî äðàéâåðà. Ïî óìîë÷àíèþ ïðèñâàèâàåòñÿ èìÿ "NO_NAME". Äëèíà èìåíè íå áîëåå 8 ñèìâîëîâ. <b>?syscommand command_0,command_1, ... command_n;</b> - ýòà äèðåêòèâà ÿâëÿåòñÿ îáÿçàòåëüíîé. Ïî ýòîé äèðåêòèâå êîìïèëÿòîðó ïåðåäàåòñÿ ñïèñîê èìåí ïðîöåäóð îáðàáîòêè êîìàíä äðàéâåðà. Èìåíà ðàçäåëåíû çàïÿòûìè. Ñïèñîê äîëæåí çàêàí÷èâàòüñÿ ñèìâîëîì òî÷êà-ñ-çàïÿòîé. Ìîæíî ïåðåäàòü íå áîëåå 25 êîìàíä. Åñëè êàêàÿ-òî êîìàíäà íå èìååò êîäà ïîääåðæêè, òî â ñïèñîê íàäî çàïèñàòü ñëîâî NONE. Ïî óìîë÷àíèþ êîìïèëÿòîð äëÿ äðàéâåðà íå ñîçäàåò ñòåê. Äðàéâåð ìîæåò ïîëüçîâàòüñÿ ñèñòåìíûì ñòåêîì. Íî, ãîâîðÿò, ÷òî îí èìååò ìàëåíüêóþ ãëóáèíó. Åñëè Âàøè ïðîöåäóðû àêòèâíî èñïîëüçóþò ñòåê, è Âû íå íàäååòåñü íà ñèñòåìíûé, òî äèðåêòèâîé ?stack <âåëè÷èíà> ìîæíî çàñòàâèòü äðàéâåð ïîëüçîâàòüñÿ ñâîèì ñòåêîì. Âàøèì ïðîöåäóðàì îáðàáîòêè êîìàíä ïðè ïåðåäà÷å óïðàâëåíèÿ â ðåãèñòðàõ ES:BX áóäåò ïåðåäàí àäðåñ çàãîëîâêà çàïðîñà. Ðåãèñòð DS ðàâåí CS. Ïðè âîçâðàòå óïðàâëåíèÿ âàøè ïðîöåäóðû äîëæíû ñîõðàíèòü ðåãèñòð DS.  ðåãèñòðå AX äîëæåí íàõîäèòüñÿ êîä âîçâðàòà. Îñòàëüíûå ðåãèñòðû ìîãóò áûòü èñïîëüçîâàíû ïðîèçâîëüíûì îáðàçîì. Ïðîöåäóðó îáðàáîòêè êîìàíäû èíèöèàëèçàöèè æåëàòåëüíî ðàñïîëàãàòü ïîñëåäíåé (÷òîáû èìåòü âîçìîæíîñòü îòäàòü àäðåñíîå ïðîñòðàíñòâî çàíèìàåìîå ýòîé ïðîöåäóðîé îïåðàöèîííîé ñèñòåìå). Ïåðåä ýòîé ïðîöåäóðîé, åñëè Âû â äðóãèõ ïðîöåäóðàõ îáðàáîòêè êîìàíä èñïîëüçóåòå äèíàìè÷åñêèå ïðîöåäóðû, îáÿçàòåëüíî äîëæíà áûòü äèðåêòèâà <b>?setdinproc</b>. Ãëîáàëüíûå ïåðåìåííûå äîëæíû áûòü îáÿçàòåëüíî ïðîèíèöèàëèçèðîâàíû. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.7> 12.7 Êîìïèëÿöèÿ êîäà ðàñøèðèòåëåé ROM-BIOS. </A></B></FONT><FONT FACE="Courier"> Ðàñøèðèòåëè ROM-BIOS (BIOS âèäåîêîíòðîëëåðîâ, ñåòåâûõ êàðò...) èìåþò îïðåäåëåííóþ ñòðóêòóðó è òðåáîâàíèÿ. C-- òåïåðü ìîæåò îáëåã÷èòü Âàì ïðîöåññ ñîçäàíèÿ êîäà ROM-BIOS. Åñëè çàïóñòèòü êîìïèëÿòîð íà êîìïèëÿöèþ ñ êëþ÷îì êîìàíäíîé ñòðîêè <b>/ROM</b>, òî êîìïèëÿòîð ñîçäàñò ñèãíàòóðó (çàãîëîâîê) ROM-BIOS, çàïîëíèò îñòàâøååñÿ ñâîáîäíîå ìåñòî äî óêàçàííîãî ðàçìåðà ÏÇÓ êîäîì çàïîëíåíèÿ, ïîäñ÷èòàåò è ñêîððåêòèðóåò êîíòðîëüíóþ ñóììó ÏÇÓ. Äëÿ ýòîãî ðåæèìà êîìïèëÿöèè åñòü íåñêîëüêî ñïåöèôè÷åñêèõ äèðåêòèâ: 1. <b>?sizerom value</b> - ýòà äèðåêòèâà ñîîáùàåò êîìïèëÿòîðó ðàçìåð ÏÇÓ â áàéòàõ. Åñëè ýòà äèðåêòèâà íå óêàçàíà, òî êîìïèëÿòîð ñàì âûáåðåò ìèíèìàëüíûé ïîäõîäÿùèé ðàçìåð ÏÇÓ èç ðÿäà: 1024, 2048, 4096, 8192, 16384, 32762 èëè 65536. Ñâîáîäíîå îò êîäà è äàííûõ ìåñòî áóäóò çàïîëíåíû äî êîíöà ðàçìåðà ÏÇÓ áàéòîì çàïîëíåíèÿ îïðåäåëÿåìîãî äèðåêòèâîé <b>?aligner</b>. Ïî óìîë÷àíèþ îí ðàâåí íóëþ, äëÿ ÐÏÇÓ òèïà 27õõõ ýòîò áàéò èìååò ñìûñë ñäåëàòü ðàâíûì 0xFF. Ïîñëåäíèé áàéò ÏÇÓ áóäåò ñêîððåêòèðîâàí êîìïèëÿòîðîì òàêèì îáðàçîì, ÷òîáû êîíòðîëüíàÿ ñóììà ðàâíÿëàñü íóëþ. 2. <b>?movedatarom TRUE/FALSE</b> - ýòà äèðåêòèâà ñîîáùàåò êîìïèëÿòîðó åñòü ëè íåîáõîäèìîñòü êîïèðîâàòü äàííûå èç ÏÇÓ â ÎÇÓ. Ïî óìîë÷àíèþ îíà óñòàíîâëåíà â <b>FALSE</b>. Åñëè ýòó äèðåêòèâó îïðåäåëèòü <b>TRUE</b>, òî êîìïèëÿòîð âñòàâèò â îáëàñòü èíèöèàëèçàöèè êîä ïåðåìåùàþùèé äàííûå èç ÏÇÓ â ÎÇÓ. Ïðè ýòîì ðåãèñòð DS áóäåò óñòàíîâëåí íà ñåãìåíò ÎÇÓ. Ñòåê òàêæå áóäåò ïåðåóñòàíîâëåí íà ýòîò ñåãìåíò. Òàêèì îáðàçîì, ïðîöåäóðà main ïîëó÷èò óïðàâëåíèå ñ ðåãèñòðàìè <b>AX = ES = DS = SS = ñåãìåíòó ÎÇÓ ñ ïåðåíåñåííûìè â íåãî äàííûìè</b>. Åñëè ýòó äèðåêòèâó óñòàíîâèòü â <b>FALSE</b>, ðåãèñòð DS âñå ðàâíî áóäåò ïåðåóñòàíîâëåí íà àäðåñ ñåãìåíòà ÎÇÓ, òàê êàê Âàø êîä áóäåò èñïîëüçîâàòü ýòîò ñåãìåíò äëÿ íåèíèöèàëèçèðîâàííûõ ãëîáàëüíûõ ïåðåìåííûõ. Èíèöèàëèçèðîâàííûå ïåðåìåííûå îñòàíóòñÿ â ÏÇÓ è âñå îáðàùåíèÿ ê íèì áóäóò ïðîèçâîäèòüñÿ ÷åðåç ðåãèñòð CS. Òàê æå îñòàíåòñÿ íå òðîíóòûì (òàêèì, êàêèì åãî óñòàíîâèë ãëàâíûé BIOS) è ñòåê. 3. <b>?dataseg value</b> - ýòîé äèðåêòèâîé êîìïèëÿòîðó ñîîáùàåòñÿ ñåãìåíòíûé àäðåñ ÎÇÓ, êîòîðûé ìîæåò áûòü èñïîëüçîâàí âàøèì êîäîì. Ïî óìîë÷àíèþ îí ðàâåí 0x70. Ýòîò àäðåñ âû ìîæåòå óçíàòü â ëþáîé ìîìåíò, ñ÷èòàâ åãî èç âàøåãî êîäà ïî ñìåùåíèþ 4. Íàïðèìåð: DS = CSWORD[4]; Íåêîòîðûå çàìå÷àíèÿ: 1. Íå çàáûâàéòå, ÷òî â ìîìåíò èíèöèàëèçàöèè ROM-BIOS, DOS åùå íå çàãðóæåí, è ñîîòâåòñòâåííî âñå ïðîöåäóðû èñïîëüçóþùèå âûçîâû DOS ðàáîòàòü íå áóäóò. 2. Íåëüçÿ çàâåðøàòü ðàáîòó ïðîãðàììû ïðîöåäóðàìè <b>ABORT()</b> èëè <b>EXIT()</b> è èì ïîäîáíûì. Ðàáîòà ðàñøèðèòåëÿ ROM-BIOS äîëæíà çàâåðøàòüñÿ òîëüêî âûõîäîì èç ïðîöåäóðû main(). 3. Åñëè äèðåêòèâà <b>?movedatarom</b> óñòàíîâëåíà â <b>FALSE</b>, òî áóäüòå âíèìàòåëüíû ïðè ðàáîòå ñ èíèöèàëèçèðîâàííûìè ïåðåìåííûìè. Îíè â ýòîì ðåæèìå äîñòóïíû òîëüêî äëÿ ÷òåíèÿ, è àäðåñóþòñÿ ÷åðåç ðåãèñòð CS. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.8.1> 12.8 32-áèòíûå ôàéëû. 12.8.1 32-áèòíûé êîä ïîä DOS. </A></B></FONT><FONT FACE="Courier"> Äëÿ òîãî ÷òîáû îòêîìïèëèðîâàòü 32-áèòíóþ ïðîãðàììó ïîä DOS íàäî çàïóñòèòü êîìïèëÿòîð ñ êëþ÷îì êîìàíäíîé ñòðîêè <b>/d32</b>. Íî ðàáîòà 32-áèòíîé ïðîãðàììû ïîä DOS-îì íåâîçìîæíà áåç ðàñøèðèòåëÿ DOS. Äëÿ C-- ìîæíî èñïîëüçîâàòü DOS4GW èëè zrdx.exe èëè ëþáîé äðóãîé ðàñøèðèòåëü DOS. ×òîáû êîìïèëÿòîð çíàë, ãäå èñêàòü <b>stub</b> ôàéë è åãî èìÿ, íàäî â ôàéë c--.ini ïðîïèñàòü ñòðîêó stub=path_name_to_stub_file. Ïðèìåð: stub=c:\c--\zrdx.exe Åñëè íå äîáàâëÿòü â c--.ini ýòó ñòðîêó, òî êîìïèëÿòîð ñãåíåðèðóåò 32-áèòíûé exe-ôàéë, íî áåç ðàñøèðèòåëÿ DOS. Åñëè â êîìàíäíîé ñòðîêå âìåñòå ñ êëþ÷îì <b>/d32</b> óêàçàòü è êëþ÷ <b>/ns</b>, òî ñòðîêà ñ ïåðåìåííîé stub èç ôàéëà c--.ini áóäåò àííóëèðîâàíà, è âû ïîëó÷èòå ôàéë áåç ðàñøèðèòåëÿ DOS. Äëÿ 32-áèòíîãî DOS-ôàéëà ìîæíî èñïîëüçîâàòü äèðåêòèâû êîìïèëÿòîðà ?parsecommandline TRUE/FALSE èëè åãî ðàñøèðåííûé âàðèàíò <b>?argc TRUE/FALSE</b>. Ðåàëèçîâàíà è ïîääåðæêà äèðåêòèâû <b>?atexit TRUE/FALSE</b>. Ñåé÷àñ äëÿ 32-áèòíûõ DOS-ôàéëîâ èñïîëüçóåòñÿ LE-ôîðìàò. Òàê êàê LE ôîðìàò ÿâëÿåòñÿ ñòàíäàðòíûì, òî òåïåðü ìîæíî èñïîëüçîâàòü ïî÷òè ëþáîé stub, ïîíèìàþùèé ýòîò ôîðìàò. Ôàéëû LE ôîðìàòà ìîæíî ñæèìàòü ïðîãðàììàìè òèïà UPX.EXE è åé ïîäîáíûìè. Åñëè Âû èñïîëüçóåòå stub, êîòîðûé çàòåì çàãðóæàåò DOS4GW.EXE, òî íà÷àëî Âàøåé ïðîãðàììû äîëæíî èìåòü ñïåöèàëüíóþ ñèãíàòóðó. Êîìïèëÿòîð àâòîìàòè÷åñêè ñôîðìèðóåò åå, åñëè Âû â êîìàíäíîé ñòðîêå èëè â c--.ini ôàéëå óêàæåòå êëþ÷ <b>/DOS4GW</b>. Òàêîé êëþ÷ Âàì íåîáõîäèìî áóäåò ïðèìåíÿòü, åñëè Âû áóäåòå èñïîëüçîâàòü â êà÷åñòâå stub 4gs.exe. Ñóùåñòâóåò òàêæå ïîääåðæêà áëîêà êîäà èñïîëüçóþùåãî äëÿ ïåðåõîäà è ðàáîòû â 32-áèòíîì ðåæèìå âîçìîæíîñòè DPMI ñåðâèñà. Èñõîäíûé òåêñò ýòîãî áëîêà íàõîäèòñÿ â ôàéëå startup.h-- è êîìïèëèðóåòñÿ, åñëè â êîìàíäíîé ñòðîêå óêàçàíà îïöèÿ <b>/stub=dpmi</b> èëè â ôàéëå c--.ini íàïèñàòü ñòðîêó <b>stub=dpmi</b>. Íåäîñòàòêîì ýòîãî ñïîñîáà ïåðåõîäà è ðàáîòû â 32-áèòíîì ðåæèìå ÿâëÿþòñÿ íåîáõîäèìîñòü îáÿçàòåëüíîãî ôóíêöèîíèðîâàíèÿ íà çàïóñêàåìîì êîìïüþòåðå DPMI ñåðâèñà. Òàê êàê, ïðîãðàììà çàãðóæàåòñÿ êàê îáû÷íàÿ DOS ïðîãðàììà, è ëèøü â ïðîöåññå ðàáîòû ïåðåõîäèò â 32-áèòíûé ðåæèì ðàáîòû, ðàçìåð ïðîãðàììû îãðàíè÷åí ðàçìåðîì ñâîáîäíîé DOS ïàìÿòè. Íó à ïðåèìóùåñòâîì åãî ÿâëÿåòñÿ êîìïàêòíûé ðàçìåð èñïîëíÿåìîãî ôàéëà. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.8.2> 12.8.2 32-áèòíûé êîä ïîä Windows. </A></B></FONT><FONT FACE="Courier"> Äëÿ òîãî ÷òîáû îòêîìïèëèðîâàòü ïðîãðàììó, íàïèñàííóþ ïîä Windows íàäî çàïóñòèòü êîìïèëÿòîð ñ êëþ÷îì êîìàíäíîé ñòðîêè <b>/w32</b>. Åñëè Âû â ñâîåé ïðîãðàììå èñïîëüçóåòå âûçîâû API-ïðîöåäóð, òî ýòè ïðîöåäóðû íàäî ïðåäâàðèòåëüíî îáÿçàòåëüíî îáúÿâèòü. Îáúÿâëåíèå ïðîöåäóð èìååò ñëåäóþùóþ ôîðìó: extern WINAPI "DLL_name" { returncode procname1(); returncode procname2(); procname3(); } ãäå: DLL_name - èìÿ è ðàñøèðåíèå dll-áèáëèîòåêè, â êîòîðîé íàõîäÿòñÿ ýòè ïðîöåäóðû. returncode - òèï âîçâðàòà èç api-ïðîöåäóð. Ïî óìîë÷àíèþ îí ðàâåí dword. Ïðîãðàììû, íàïèñàííûå ïîä Windows, èìåþò îäíó íåìàëîâàæíóþ îñîáåííîñòü - âñå ïàðàìåòðû â ñòåêîâûå ïðîöåäóðû ïåðåäàþòñÿ â îáðàòíîì ïîðÿäêå (òàê íàçûâàåìûé C-ñòèëü), íî î÷èñòêà ñòåêà îò ïàðàìåòðîâ ïðîèñõîäèò â ñàìèõ ïðîöåäóðàõ. Ïîëó÷àåòñÿ ñâîåîáðàçíûé ãèáðèä <b>C è pascal</b> ñòèëåé - <b>stdcall</b>. Ñ ïîìîùþ êëþ÷à <b>/W32C</b> êîìïèëÿòîð ñîçäàåò êîíñîëüíûé ôàéë ïîä Windows. Åñëè ïðè êîìïèëÿöèè óêàçûâàëè îïöèþ êîìàíäíîé ñòðîêè <b>/j0</b> èëè äèðåêòèâó <b>#jumptomain NONE</b>, òî Âàøà ïðîãðàììà áóäåò êîìïèëèðîâàòüñÿ áåç èñïîëüçîâàíèÿ êîäà íà÷àëüíîé èíèöèàëèçàöèè, îïèñàíèå êîòîðîãî íàõîäèòñÿ â ôàéëå startup.h--. Êîä íà÷àëüíîé èíèöèàëèçàöèè äëÿ ïðîãðàìì ïîä Windows èìååò ñëåäóþùèé âèä: hThisInst=GetModuleHandleA(0); #ifdef __CONSOLE__ hStdOut=GetStdHandle(-11); #endif lpszArgs=GetCommandLineA(); #ifdef __environ; environ=GetEnvironmentStringsA(); #endif main(); ExitProcess(EAX); Òàêèì îáðàçîì, â ãëîáàëüíûõ ïåðåìåííûõ <b>hThisInst</b> áóäåò íàõîäèòñÿ handl çàïóùåííîãî ôàéëà, à â <b>lpszArgs</b> àäðåñ êîìàíäíîé ñòðîêè Âàøåãî ôàéëà. Åñëè Âû â êîìàíäíîé ñòðîêå óêàçàëè îïöèè <b>/p</b> èëè <b>/argc</b> èëè â íà÷àëå âàøåãî ôàéëà åñòü äèðåêòèâû <b>#parsecommandline TRUE</b> èëè <b>argc TRUE</b>, òî êîìïèëÿòîð ñîçäàñò äîïîëíèòåëüíûé êîä ñäåëàþùèé ðàçáîðêó ýòîé êîìàíäíîé ñòðîêè íà ÷àñòè. Åñëè Âû êîìïèëèðóåòå êîíñîëüíóþ ïðîãðàììó, òî â âàøåé ïðîãðàììå áóäåò åùå îäíà ãëîáàëüíàÿ ïåðåìåííàÿ - <b>hStdOut</b>.  ýòîé ïåðåìåííîé õðàíèòñÿ handl ñòàíäàðòíîãî âûâîäà (ýêðàíà). Åñëè Âû ïðè êîìïèëÿöèè ïðîãðàììû óêàçàëè îïöèþ <b>/env</b>, òî â ãëîáàëüíîé ïåðåìåííîé <b>environ</b> õðàíèòñÿ àäðåñ ïåðåìåííîé îêðóæåíèÿ ïðîãðàììû. Ïîñëå çàâåðøåíèÿ ðàáîòû ïðîöåäóðû <b>main</b> âûïîëíÿòñÿ ïðîöåäóðà <b>ExitProcess</b>, êîòîðîé â êà÷åñòâå ïàðàìåòðà ïåðåäàåòñÿ ðåãèñòð EAX. Ò.î. Âàì äëÿ çàâåðøåíèÿ ðàáîòû ïðîãðàììû áóäåò äîñòàòî÷íî ñäåëàòü âûõîä èç ïðîöåäóðû <b>main</b>, ïðåäâàðèòåëüíî çàãðóçèâ â ðåãèñòð EAX íóæíûé Âàì êîä âîçâðàòà. Íåêîòîðûå êîìïèëÿòîðû ñîçäàþò DLL, â êîòîðûõ èìåíà ýêñïîðòèðóåìûõ ïðîöåäóð èìåþò òàêîé ôîðìàò: ProcName@8  ýòîì èìåíè ïîñëå ñèìâîëà <b>@</b> óêàçûâàåòñÿ ðàçìåð ñòåêà ñ ïàðàìåòðàìè, ïåðåäàâàåìûõ ïðîöåäóðå. Îáúÿâëÿòü òàêèå ïðîöåäóðû íóæíî òàê: extern WINAPI "name.dll" { ProcName@8 ; } ò.å. áåç êðóãëûõ ñêîáîê.  ïðîãðàììå, ïðè îáðàùåíèè ê òàêîé ïðîöåäóðå, åå èìÿ íàäî ïèñàòü áåç ñóôôèêñà @8, ò.å. âîò òàê - ProcName(param1,param2); <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.8.3> 12.8.3 Âûçîâ API ïðîöåäóð ïî îðäèíàëàì. </A></B></FONT><FONT FACE="Courier">  äèíàìè÷åñêè ïîäêëþ÷àåìûõ áèáëèîòåêàõ (DLL) êàæäîé ïðîöåäóðå, êðîìå åå èìåíè, ñîîòâåòñòâóåò óíèêàëüíîå ÷èñëî, êîòîðîå íàçûâàåòñÿ îðäèíàëîì. È ïîýòîìó, êðîìå îáùåïðèíÿòîãî âûçîâà API-ïðîöåäóðû ïî èìåíè, ìîæíî äåëàòü âûçîâ è ïî îðäèíàëó. Òåîðåòè÷åñêè, ïðè èñïîëüçîâàíèè âûçîâà ïî îðäèíàëó, çàãðóçêà ôàéëà äîëæíà ïðîèñõîäèòü áûñòðåå. Òàê êàê â âûõîäíîé ôàéë íå áóäóò âêëþ÷åíû ñïèñêè èìåí ïðîöåäóð, âûçîâ êîòîðûõ ïðîèçâîäèòñÿ ïî îðäèíàëàì, òî âûõîäíîé ôàéë ìîæåò ïîëó÷èòüñÿ íåìíîãî ìåíüøèì ïî ðàçìåðó. ×òîáû êîìïèëÿòîð ñîçäàë ôàéë, èñïîëüçóþùèé âûçîâ API-ïðîöåäóð ïî îðäèíàëàì, íàäî ñäåëàòü äâå âåùè: 1. Ðàçðåøèòü êîìïèëÿòîðó ýòî äåëàòü. Äëÿ ýòîãî íàäî â îïöèÿõ êîìàíäíîé ñòðîêè (èëè â ôàéëå C--.INI) óêàçàòü êëþ÷ <b>WO</b>. 2. Ñîîáùèòü êîìïèëÿòîðó - êàêîé íîìåð îðäèíàëà ñîîòâåòñòâóåò êàêîìó èìåíè ïðîöåäóðû. Ïðîöåäóðû, äëÿ êîòîðûõ íå áûë óêàçàí îðäèíàë, áóäåò ñîçäàí âûçîâ ïî èìåíè. Óñòàíîâèòü ñîîòâåòñòâèå èìåí ïðîöåäóð îðäèíàëó ìîæíî äâóìÿ ñïîñîáàìè: a). Àâòîìàòè÷åñêè, ñ ïîìîùüþ îïöèè êîìàíäíîé ñòðîêè <b>IND=name.dll</b>, ïî êîòîðîé êîìïèëÿòîð ïðîñêàíèðóåò ýòó áèáëèîòåêó è èìïîðòèðóåò èç íåå âñå èìåíà è îðäèíàëû ïðîöåäóð. (Èìïîðò âîçìîæåò òîëüêî èç áèáëèîòåê èìåþùèõ ôîðìàò PE). b).  ðó÷íóþ óêàçàòü â îáúÿâëåíèè API-ïðîöåäóð è åå îðäèíàë. Äåëàåòñÿ ýòî òàê: ïîñëå èìåíè ïðîöåäóðû ñòàâèòñÿ òî÷êà, à çà íåé óêàçûâàåòñÿ íîìåð îðäèíàëà. Âîò ïðèìåð îáúÿâëåíèÿ API-ïðîöåäóðû ñ óêàçàíèåì åå îðäèíàëà: extern WINAPI "user32.dll" { ............ long MessageBoxA.429(); ............ }  áèáëèîòåêàõ (DLL), èíîãäà ñóùåñòâóþò ïðîöåäóðû, äëÿ êîòîðûõ íå óêàçàíî èõ èìÿ, íî óêàçàí íîìåð îðäèíàëà. Âûçîâ òàêèõ ïðîöåäóð ïî èìåíè íå âîçìîæåí, íî ìîæíî ýòî ñäåëàòü ïî îðäèíàëó (åñëè, êîíå÷íî Âû çíàåòå, äëÿ ÷åãî ýòà ïðîöåäóðà è ÷òî îíà äåëàåò). Äëÿ ýòîãî â îáúÿâëåíèè API-ïðîöåäóðû Âàì íàäî ïðèäóìàòü äëÿ ýòîé ïðîöåäóðû óíèêàëüíîå èìÿ è óêàçàòü ðåàëüíûé îðäèíàë. Çàòåì â ïðîãðàììå Âû áóäåòå îáðàùàòüñÿ ê ýòîé ïðîöåäóðå ïî âûìûøëåííîìó èìåíè. Íî åñëè Âû ñëó÷àéíî îòêîìïèëèðóåòå òàêîé ôàéë áåç êëþ÷à <b>WO</b>, òî ïðè çàïóñêå ýòîé ïðîãðàììû Âû ïîëó÷èòå ñîîáùåíèå, î òîì, ÷òî äàííîãî èìåíè â áèáëèîòåêå íåò. Ê ñîæàëåíèþ, íåò íèêàêèõ ãàðàíòèé òîãî, ÷òî íîìåð îðäèíàëà äëÿ äàííîé ïðîöåäóðû íå èçìåíèòñÿ ïðè ñìåíå âåðñèè äèíàìè÷åñêîé áèáëèîòåêè. Ïîýòîìó èñïîëüçîâàòü îðäèíàëû íàäî îñòîðîæíî. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.8.4> 12.8.4 Ñîçäàíèå DLL ïîä Windows. </A></B></FONT><FONT FACE="Courier"> Äèíàìè÷åñêè ïîäêëþ÷àåìûå áèáëèîòåêè ïîçâîëÿò ïîëó÷àòü áîëåå êîìïàêòíûå ïðîãðàììû è óñêîðèòü ïðîöåññ êîìïèëÿöèè. Ê ìèíóñàì èñïîëüçîâàíèÿ DLL ìîæíî îòíåñòè íåîáõîäèìîñòü íàëè÷èÿ ñàìèõ ôàéëîâ DLL íà çàïóñêàåìîì êîìïüþòåðå è íåìíîãî óâåëè÷èâàåòñÿ âðåìÿ çàïóñêà ïðîãðàììû. Äëÿ òîãî ÷òîáû ïðîöåäóðà ñòàëà äîñòóïíîé äëÿ äðóãèõ ïðîãðàìì íàäî â èñõîäíîì òåêñòå ïåðåä èìåíåì ïðîöåäóðû ïðîïèñàòü êëþ÷åâîå ñëîâî - <b>_export</b>. Ïðèìåð: void _export testproc() { .... } Äëÿ òîãî ÷òîáû ñîçäàòü DLL, íóæíî íàïèñàòü ôàéë, â êîòîðîì áóäóò ïðîöåäóðû ñ êëþ÷åâûìè ñëîâàìè <b>_export</b>. Âñïîìîãàòåëüíûå ïðîöåäóðû, êîòîðûå ìîãóò ïîíàäîáèòüñÿ äëÿ ðàáîòû îñíîâíûõ ýêñïîðòèðóåìûõ ïðîöåäóð, îáúÿâëÿòü êàê <b>_export</b> íåîáÿçàòåëüíî. Çàòåì ýòîò ôàéë íóæíî îòêîìïèëèðîâàòü ñ êëþ÷îì /dll.  ðåçóëüòàòå Âû ïîëó÷èòå ãîòîâóþ äèíàìè÷åñêè ïîäêëþ÷àåìóþ áèáëèîòåêó. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.8.5> 12.8.5 Èíèöèàëèçàöèÿ DLL ïðè çàãðóçêå. </A></B></FONT><FONT FACE="Courier"> Èíîãäà, äëÿ ðàáîòû ïðîöåäóð èç äèíàìè÷åñêèõ áèáëèîòåê (DLL), áûâàåò íåîáõîäèìûì èíèöèàëèçèðîâàòü íåêîòîðûå ïåðåìåííûå çíà÷åíèÿìè, çàâèñÿùèìè îò òåêóùåãî ñîñòîÿíèÿ îïåðàöèîííîé ñèñòåìû, íàïðèìåð, ïîëó÷èòü äåñêðèïòîð ýòîé áèáëèîòåêè. Äèðåêòèâîé <b>#jumptomain NONE (-j0)</b> óïðàâëåíèå ïðè çàïóñêå ïåðåäàåòñÿ ñðàçó íà ïðîöåäóðó main. Âî âñåõ îñòàëüíûõ ñëó÷àÿõ ãåíåðèðóåòñÿ êîä çàãëóøêè è óïðàâëåíèå íà ïðîöåäóðó main íå ïåðåäàåòñÿ. Ôàêòè÷åñêè ïðîöåäóðà main â ýòîì ñëó÷àå íå íóæíà. Ïðîöåäóðà main ïðè ñîçäàíèè ôàéëîâ DLL äîëæíà âûãëÿäåòü íåìíîãî èíà÷å, ÷åì â äðóãèõ ñëó÷àÿõ: dword main ( dword hInstDLL, reason, reserv ) { ... } <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.8.6> 12.8.6 Êîìïèëÿöèÿ ðåñóðñîâ. </A></B></FONT><FONT FACE="Courier"> Âñòðîåííûé â C-- êîìïèëÿòîð ðåñóðñîâ ïî ñâîèì âîçìîæíîñòÿì óñòóïàåò ñïåöèàëèçèðîâàííûì êîìïèëÿòîðàì ðåñóðñîâ, íî ýòèõ âîçìîæíîñòåé, êàê ìíå êàæåòñÿ, áóäåò äîñòàòî÷íî äëÿ áîëüøèíñòâà Âàøèõ çàäà÷. Áóäåò ïðîùå ïåðå÷èñëèòü òî, ÷òî âñòðîåííûé â C-- êîìïèëÿòîð ðåñóðñîâ íå óìååò äåëàòü. Íå îáðàáàòûâàþòñÿ îïåðàòîðû ðåñóðñîâ: <b>VERSION</b>, <b>VERSIONINFO</b> è îïðåäåëÿåìûå ïîëüçîâàòåëåì ðåñóðñû. Ïðè íåîáõîäèìîñòè, äàííûå, ââîäèìûå ñ ïîìîùüþ ýòèõ îïåðàòîðîâ, ìîæíî ââåñòè ñ ïîìîùüþ îïåðàòîðà <b>RCDATA</b>. Ó ìíîãèõ îïåðàòîðîâ ðåñóðñîâ åñòü íåîáÿçàòåëüíûå ïàðàìåòðû <b>loading</b> è 'memory'. Ïîääåðæêà ýòèõ ïàðàìåòðîâ íå ðåàëèçîâàíà. Âñòðåòèâ ýòè ïàðàìåòðû, êîìïèëÿòîð èõ ïðîñòî ïðîïóñòèò. Çàñòàâèòü êîìïèëÿòîð C-- îáðàáàòûâàòü ðåñóðñû ìîæíî äâóìÿ ñïîñîáàìè: 1. Âêëþ÷èòü â ñâîé ïðîåêò äèðåêòèâîé <b>#include</b> ôàéë ñ ðàñøèðåíèåì <b>.rc</b>. Ôàéëû ñ òàêèì ðàñøèðåíèåì êîìïèëÿòîð ñ÷èòàåò ôàéëîì ñ ðåñóðñàìè. Ôàéë ðåñóðñîâ íåîáõîäèìî âêëþ÷àòü â Âàø ïðîåêò ëèøü ïîñëå âêëþ÷åíèÿ çàãîëîâî÷íûõ ôàéëîâ Windows. 2. Ðåñóðñû ìîæíî ðàñïîëàãàòü â òåëå èñõîäíîãî òåêñòà ïðîãðàììû â ïðîèçâîëüíîì ìåñòå. Òåêñò ðåñóðñîâ äîëæåí íà÷èíàòüñÿ ñ äèðåêòèâû <b>#pragma resource start</b>, à çàêàí÷èâàòüñÿ äèðåêòèâîé <b>#pragma resoutce end</b>. Ðåñóðñû ìîãóò áûòü ðàçäåëåííûìè íà ÷àñòè è ýòè ÷àñòè ìîæíî ðàñïîëàãàòü â ëþáîì óäîáíîì äëÿ Âàñ ìåñòå (ãëóïî ðàñïîëàãàòü ðåñóðñû â áëîêå êîììåíòàðèåâ è ïîòîì óäèâëÿòüñÿ, ïî÷åìó îíè íå áûëè îòêîìïèëèðîâàíû). Êîìïèëÿòîð ñîáåðåò ýòè ÷àñòè è îòêîìïèëèðóåò. Èìåíà îïåðàòîðîâ ìîæíî ïèñàòü êàê áîëüøèìè, òàê è ìàëåíüêèìè áóêâàìè, íî èìåíà èäåíòèôèêàòîðîâ ÷óâñòâèòåëüíû ê ðåãèñòðó.  òåêñòå ðåñóðñîâ ìîæíî èñïîëüçîâàòü äèðåêòèâû è êîììåíòàðèè. Íè÷òî íå ìåøàåò Âàì èñïîëüçîâàòü êîìïèëÿòîðû ðåñóðñîâ îò äðóãèõ ÿçûêîâ. Ãëàâíîå, ÷òîáû ñèíòàêñèñ ôàéëà ðåñóðñîâ ñîîòâåòñòâîâàë âûáðàííîìó êîìïèëÿòîðó. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=12.9> 12.9 Âûõîäíûå ôàéëû äëÿ MeOS. </A></B></FONT><FONT FACE="Courier"> Èñïîëíÿåìûå ôàéëû äëÿ îïåðàöèîííîé ñèñòåìû MenuetOS ïîääåðæèâàþòñÿ êîìïèëÿòîðîì ñîâñåì íåäàâíî. Äëÿ òîãî, ÷òîáû îòêîìïèëèðîâàòü ôàéë äëÿ <b>MenuetOS</b>, íóæíî â îïöèÿõ êîìïèëÿòîðó óêàçàòü <b>/meos</b>. Âû ïîëó÷èòå ôàéë áåç ðàñøèðåíèÿ, êîòîðûé ïîòîì ìîæíî áóäåò âûïîëíèòü â ñðåäå îïåðàöèîííîé ñèñòåìû MenuetOS. Åñëè ïðè êîìïèëÿöèè ôàéëà Âû íå óêàçûâàëè îïöèþ <b>/j0</b> èëè íå èñïîëüçîâàëè äèðåêòèâó <b>#jumptomain NONE</b>, òî êîìïèëÿòîð áóäåò èñïîëüçîâàòü ôàéë íà÷àëüíîé èíèöèàëèçàöèè <b>startup.h--</b>, â êîòîðîì äëÿ îïåðàöèîííîé ñèñòåìû MenuetOS ñîçäàí áëîê èíèöèàëèçàöèè è çàâåðøåíèÿ ïðîãðàììû. Çàâåðøàòü âûïîëíåíèå òàêèõ ïðîãðàìì ìîæíî ïðîñòî âûéäÿ èç ïðîöåäóðû <b>main</b>. <A href="#contents12" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=13.1> 13. Ïðèëîæåíèÿ. 13.1 Ïîèñê âêëþ÷àåìûõ ôàéëîâ. </A></B></FONT><FONT FACE="Courier"> Ïîèñê âêëþ÷àåìîãî â âàøó ïðîãðàììó ôàéëà, èìÿ êîòîðîãî îáúÿâëÿåòñÿ äèðåêòèâîé <b>include</b> è çàêëþ÷åíî â äâîéíûå êàâû÷êè "", ïðîèçâîäèòñÿ êîìïèëÿòîðîì ïî òàêîé ñõåìå: ñíà÷àëà äåëàåòñÿ ïîïûòêà îòêðûòü ôàéë â òåêóùåé äèðåêòîðèè. Åñëè ôàéëà òàì íåò, òî äàëåå äåëàåòñÿ ïîïûòêà îòêðûòü ôàéë â äèðåêòîðèè óêàçàííîé äèðåêòèâîé <b>#includepath</b>. Åñëè äèðåêòèâà íå áûëà çàäàíà èëè ôàéëà â ýòîé äèðåêòîðèè íå îêàçàëîñü, òî äåëàåòñÿ ïîïûòêà îòêðûòü ôàéë â äèðåêòîðèè óêàçàííîé â êîìàíäíîé ñòðîêå êîìàíäîé <b>/ip=path</b>. Åñëè ýòà êîìàíäà íå áûëà çàäàíà èëè ôàéëà â óêàçàííîé äèðåêòîðèè íå îêàçàëîñü, òî äåëàåòñÿ ïîïûòêà îòêðûòü ôàéë â äèðåêòîðèè óêàçàííîé â ôàéëå C--.INI êîìàíäîé <b>ip=</b>. Åñëè ýòà êîìàíäà íå áûëà çàäàíà èëè ôàéëà â óêàçàííîé äèðåêòîðèè íå îêàçàëîñü, òî äåëàåòñÿ ïîïûòêà îòêðûòü ôàéë â äèðåêòîðèè, íà êîòîðóþ óêàçûâàåò ïåðåìåííàÿ îêðóæåíèÿ C--. Åñëè ïåðåìåííàÿ îêðóæåíèÿ íå áûëà çàäàíà èëè ôàéëà â ýòîé äèðåêòîðèè íå îêàçàëîñü, òî äåëàåòñÿ ïîñëåäíÿÿ ïîïûòêà îòêðûòü ôàéë â äèðåêòîðèè, îòêóäà áûë çàïóùåí êîìïèëÿòîð. Åñëè èìÿ âêëþ÷àåìîãî ôàéëà çàêëþ÷åíî â óãëîâûå ñêîáêè < >, òî ïîèñê ýòîãî ôàéëà ïðîèçâîäèòñÿ â ïðîòèâîïîëîæíîì íàïðàâëåíèè, çà èñêëþ÷åíèåì òîãî, ÷òî ïîèñê â òåêóùåé äèðåêòîðèè íå ïðîèçâîäèòñÿ. Äëÿ êîíñîëüíîé âåðñèè êîìïèëÿòîðà èìåíà ãëàâíîãî ìîäóëÿ è âêëþ÷àåìûõ ôàéëîâ ìîãóò èìåòü äëèíó áîëåå 8 ñèìâîëîâ. <A href="#contents13" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=13.2> 13.2 Ðåãèñòðû, êîòîðûå äîëæíû áûòü ñîõðàíåíû. </A></B></FONT><FONT FACE="Courier"> Ðåãèñòðû, êîòîðûå äîëæíû ñîõðàíÿòüñÿ - BP, DI, SI, DS, SS, SP, CS è IP. BP èñïîëüçóåòñÿ êàê óêàçàòåëü íà ëîêàëüíûå è ïàðàìåòðè÷åñêèå ïåðåìåííûå â ñòåêå, ÷òî è òðåáóåò åãî ñîõðàíåíèÿ. DI è SI ñîõðàíÿòü íå îáÿçàòåëüíî, åñëè ïðîãðàììèñò îñîçíàåò ïîñëåäñòâèÿ. DI è SI ÷àñòî èñïîëüçóþòñÿ äëÿ èíäåêñàöèè ìàññèâîâ, êàê íàïðèìåð â ôîðìóëå: dog = firehydrant(1,red) + legs[DI]; Åñëè DI íå ñîõðàíÿëñÿ â ïðîöåäóðå firehydrant, çíà÷åíèå, ïðèñâîåííîå ïåðåìåííîé dog, ñêîðåå âñåãî, áóäåò íåïðàâèëüíûì, ïîñêîëüêó èíäåêñ äëÿ ìàññèâà legs áûë èçìåíåí.  ñóùíîñòè, äëÿ òî÷íîãî ñîãëàñîâàíèÿ âñå ïðîöåäóðû äîëæíû èìåòü ñïåöèàëüíîå óêàçàíèå â êîììåíòàðèè íà òî, ÷òî â íèõ íå ñîõðàíÿåòñÿ ñîäåðæèìîå ðåãèñòðîâ DI è/èëè SI. DS óêàçûâàåò íà ñåãìåíò äàííûõ, è âñå îïåðàöèè ñ ãëîáàëüíûìè ïåðåìåííûìè ïîëüçóþòñÿ ýòèì çíà÷åíèåì. SS õðàíèò ñåãìåíò ñòåêà è äîëæåí ñîõðàíÿòüñÿ. SP óêàçûâàåò íà òåêóùóþ ïîçèöèþ â ñòåêå è òîæå äîëæåí ñîõðàíÿòüñÿ. CS õðàíèò ñåãìåíò êîäà ïðîãðàììû. Âñå êîìàíäû âûáèðàþòñÿ ñ èñïîëüçîâàíèåì CS è IP, ñëåäîâàòåëüíî èõ çíà÷åíèÿ äîëæíû ñîõðàíÿòüñÿ. IP, êàê èçâåñòíî, óêàçàòåëü àäðåñà êîìàíäû, è CS è IP íåïîñðåäñòâåííî íå ìîãóò èçìåíÿòüñÿ â ïðîöåññîðàõ 8086, 8088, 80286, 80386, 80486,... <A href="#contents13" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=13.3> 13.3 C--.ini ôàéë. </A></B></FONT><FONT FACE="Courier"> C--.ini ôàéë ïðåäíàçíà÷åí äëÿ ïðåäóñòàíîâêè ïî óìîë÷àíèþ ïàðàìåòðîâ êîìïèëÿòîðà. Ñåé÷àñ êîìïèëÿòîð ïîääåðæèâàåò îãðîìíîå ÷èñëî ïàðàìåòðîâ êîìàíäíîé ñòðîêè. Ïðàâèëüíîå èõ èñïîëüçîâàíèå ïîçâîëèò Âàì ïîëó÷àòü áîëåå êîìïàêòíûé êîä è ìîæåò çíà÷èòåëüíî îáëåã÷èòü Âàì îòëàäêó ïðîãðàììû. Íî òàê êàê ýòèõ ïàðàìåòðîâ î÷åíü ìíîãî íàáèðàòü èõ êàæäûé ðàç â êîìàíäíîé ñòðîêå áûâàåò óòîìèòåëüíî è íå èñêëþ÷åíà âîçìîæíîñòü ïðîïóñòèòü êàêîé-íèáóäü ïàðàìåòð. ×òîáû èçáàâèòü Âàñ îò âñåõ ýòèõ íàïàñòåé è áûë ââåäåí c--.ini ôàéë. Ïàðàìåòðû êîìàíäíîé ñòðîêè ïðîïèñûâàþòñÿ â ýòîì ôàéëå ïîñòðî÷íî. Ñèíòàêñèñ òîò æå, ÷òî è â êîìàíäíîé ñòðîêå, íî áåç âåäóùåãî îáðàòíîãî ñëýøà èëè ìèíóñà. Åñëè ôàéë ðàñïîëîæåí â äèðåêòîðèè, íà êîòîðóþ óêàçûâàåò ïåðåìåííàÿ îêðóæåíèÿ <b>set c--=<path></b> èëè åñëè ýòà ïåðåìåííàÿ íå îïðåäåëåíà, òî â òîé æå äèðåêòîðèè ãäå è ôàéë c--.exe, òî ýòè ïàðàìåòðû ðàñïðîñòðàíÿþòñÿ íà âñå êîìïèëèðóåìûå ïðîãðàììû. Åñëè æå ôàéë c--.ini ðàñïîëîæåí â òåêóùåé äèðåêòîðèè, òî ïàðàìåòðû ñ÷èòûâàþòñÿ òîëüêî èç ýòîãî ôàéëà è äåéñòâóþò òîëüêî äëÿ òåêóùåãî ïðîåêòà. Äîïóñòèìî èñïîëüçîâàíèå êîììåíòàðèåâ. Ïðèçíàêîì íà÷àëà êîììåíòàðèÿ ÿâëÿåòñÿ ñèìâîë <b>;</b>. Âñå ïîñëåäóþùèå ñèìâîëû ïîñëå <b>;</b> è äî êîíöà ñòðîêè ñ÷èòàþòñÿ êîììåíòàðèåì. Ïðèìåð C--.ini ôàéëà: r- X 3 ;ýòî êîììåíòàðèé os ini-ôàéë ìîæåò èìåòü ëþáîå èìÿ (íî ðàñøèðåíèå äîëæíî áûòü îáÿçàòåëüíî ini). Èìÿ ýòîãî ôàéëà ñ ðàñøèðåíèåì äîëæíî áûòü ïåðåäàíî êîìïèëÿòîðó â êîìàíäíîé ñòðîêå. Ôàéë c--.ini çàãðóæàåòñÿ è îáðàáàòûâàåòñÿ àâòîìàòè÷åñêè äî çàãðóçêè ôàéëà óêàçàííîãî â êîìàíäíîé ñòðîêå. Òàêèì îáðàçîì, ôàéë *.ini ìîæíî èñïîëüçîâàòü ïîäîáíî make-ôàéëó - â íåì Âû ìîæåòå óêàçàòü è èìÿ ãëàâíîãî êîìïèëèðóåìîãî ìîäóëÿ, è âñå íåîáõîäèìûå äëÿ åãî êîìïèëÿöèè íàñòðîéêè. Êàê àëüòåðíàòèâó c--.ini ôàéëó, ïàðàìåòðû êîìàíäíîé ñòðîêè ìîæíî ïðîïèñûâàòü íåïîñðåäñòâåííî â íà÷àëå ãëàâíîãî ôàéëà êîìïèëèðóåìîãî ïðîåêòà, èñïîëüçóÿ äèðåêòèâó <b>pragma option</b>. Ñ îäíîé ñòîðîíû ýòî îáåñïå÷èò Âàøåìó ïðîåêòó íåçàâèñèìîñòü îò íàñòðîåê êîìïèëÿòîðà, åñëè Âàø ïðîåêò áóäåò êîìïèëèðîâàòüñÿ íà äðóãîì êîìïüþòåðå. Íî ñ äðóãîé ñòîðîíû íåêîòîðûå íàñòðîéêè ÿâëÿþòñÿ èíäèâèäóàëüíûìè äëÿ äàííîãî êîìïüþòåðà (ýòî ðàñïîëîæåíèå áèáëèîòåê, èìåíà è ðàñïîëîæåíèå stub-ôàéëîâ). Êàêîé âàðèàíò èñïîëüçîâàòü ðåøàòü Âàì, íî êàê ãîâîðÿò, è ÿ ñ ýòèì ñîãëàñåí, ëó÷øå ïîëüçîâàòüñÿ çîëîòîé ñåðåäèíîé - ×àñòü ïàðàìåòðîâ ïðîïèñàòü â c--.ini ôàéëå, à äðóãóþ íåïîñðåäñòâåííî â êîìïèëèðóåìîì ôàéëå. <A href="#contents13" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=13.4> 13.4 startup.h-- ôàéë. </A></B></FONT><FONT FACE="Courier">  ýòîì ôàéëå íàõîäÿòñÿ èñõîäíûå òåêñòû, êîòîðûå êîìïèëèðóþòñÿ êîìïèëÿòîðîì â êîä íà÷àëüíîé èíèöèàëèçàöèè ôàéëà, äëÿ âñåõ ïîääåðæèâàåìûõ êîìïèëÿòîðîì òèïîâ âûõîäíûõ ôàéëîâ. Ýòîò ôàéë äîëæåí íàõîäèòñÿ ëèáî â äèðåêòîðèè âìåñòå ñ êîìïèëÿòîðîì, ëèáî â äèðåêòîðèè ñ áèáëèîòå÷íûìè ôàéëàìè. Ýòîò ôàéë âêëþ÷àåòñÿ êîìïèëÿòîðîì â ïðîåêò àâòîìàòè÷åñêè, à âêëþ÷åíèå åãî äèðåêòèâîé <b>include</b> ìîæåò ïðèâåñòè ê íåæåëàòåëüíûì ðåçóëüòàòàì.  áëîêå íà÷àëüíîé èíèöèàëèçàöèè ïðîãðàììû ìîæåò ïðîèçâîäèòñÿ (åñëè Âû ýòî óêàæåòå ñ ïîìîùüþ îïöèé êîìàíäíîé ñòðîêè èëè èñïîëüçóÿ äèðåêòèâû), ðàçáîð êîìàíäíîé ñòðîêè íà ïàðàìåòðû, ñîõðàíåíèå ïåðåìåíîé îêðóæåíèÿ, ïîääåðæêà ðàáîòû ïðîöåäóðû <b>ATEXIT</b>, èçìåíåíèå ðàçìåðà äîñòóïíîé ïàìÿòè äëÿ *.com ôàéëîâ è ìíîãèå äðóãèå ïîäãîòîâèòåëüíûå îïåðàöèè. Åñëè Âû îòêîìïèëèðóåòå ñâîé ôàéë íå èñïîëüçóÿ íèêàêèõ îïöèé êîìàíäíîé ñòðîêè è ó Âàñ áóäåò îòñóòñòâîâàòü c--.ini ôàéë, à â ñàìîì êîìïèëèðóåìîì ôàéëå ó Âàñ áóäóò îòñóòñòâîâàòü äèðåêòèâû, òî ïðè êîìïèëÿöèè *.com ôàéëà â íåãî áóäåò âêëþ÷åí áëîê èçìåíÿþùèé ðàçìåð äîñòóïíîé ïàìÿòè è ñèãíàòóðà <b>SPHINXC--</b>. Åñëè Âû êîìïèëèðóåòå ôàéë òèïà *.exe (êðîìå ôàéëà ìîäåëè tiny äëÿ DOS) è èñïîëüçóåòå äèðåêòèâó <b>jumptomain NONE</b> èëè êëþ÷ êîìàíäíîé ñòðîêè <b>/j0</b>, òî äëÿ ýòîãî ïðîåêòà ôàéë startup.h-- êîìïèëÿòîðîì íå èñïîëüçóåòñÿ. Íå èñïîëüçóåòñÿ ýòîò ôàéë òàêæå ïðè êîìïèëÿöèè *.com ôàéëîâ åñëè, êðîìå <b>/j0</b>, â ýòîì ïðîåêòå íå èñïîëüçóåòñÿ ðàçáîð êîìàíäíîé ñòðîêè (<b>/p /argc</b>), íå ïðèìåíÿåòñÿ ïðîöåäóðà <b>ATEXIT (/at)</b>, íå èñïîëüçóåòñÿ àäðåñ ïåðåìåííîé îêðóæåíèÿ <b>(/env)</b>, íå èñïîëüçóåòñÿ î÷èñòêà îáëàñòè post-àäðåñîâ <b>(/cpa)</b>, íå èñïîëüçóåòñÿ óìåíüøåíèå äîñòóïíîé ïðîãðàììå ïàìÿòè <b>(/r)</b> è íå èñïîëüçóåòñÿ çàãëóøêà íàæàòèé <b>CTRL-C (/c)</b>. Êðîìå áëîêà íà÷àëüíîé èíèöèàëèçàöèè ïðîãðàììû â ôàéëå startup.h-- íàõîäÿòñÿ äèíàìè÷åñêèå ïðîöåäóðû: void CLEARPOSTAREA( (E)AX ); - î÷èñòêà post-îáëàñòè äàííûõ. unsigned int PARAMSTR( ECX ); - ïîëó÷èòü àäðåñ ýëåìåíòà êîìàíäíîé ñòðîêè unsigned int PARAMCOUNT(); - ïîëó÷èòü ÷èñëî ýëåìåíòîâ â êîìàíäíîé ñòðîêå Ïðè ðàçáîðå êîìàíäíîé ñòðîêè íà ñîñòàâëÿþùèå åå ýëåìåíòû äëÿ 32-áèòíûõ ïðîãðàìì ðåàëèçîâàíà ïîääåðæêà äëèííûõ èìåí. Äëÿ 16-áèòíûõ ïðîãðàìì ïîääåðæêà ðàçáîðà êîìàíäíîé ñòðîêè ñ ó÷åòîì äëèííûõ èìåí ïîäêëþ÷àåòñÿ, åñëè Âû â íà÷àëå ñâîé ïðîãðàììû óêàæåòå äèðåêòèâó: #define _USELONGNAME TRUE ëèáî â c--.ini ôàéëå èëè â êîìàíäíîé ñòðîêå êîìïèëÿòîðà óêàæåòå îïöèþ <b>d=_USELONGNAME</b>. <A href="#contents13" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=13.5> 13.5 mainlib.ldp ôàéë. </A></B></FONT><FONT FACE="Courier">  ýòîì ôàéëå íàõîäèòñÿ áîëüøîå ÷èñëî ïðîöåäóð èç îñíîâíîé áèáëèîòåêè êîìïèëÿòîðà â óæå îòêîìïèëèðîâàííîì âèäå. Âñå ïðîöåäóðû îòêîìïèëèðîâàíû â 4-õ ðàçëè÷íûõ ðåæèìàõ îïòèìèçàöèè.  ýòîò ôàéë òàêæå âûíåñåíû ìíîãèå ïðîöåäóðû, êîòîðûå ðàíåå áûëè âíóòðè êîìïèëÿòîðà. Èñïîëüçîâàíèå ðàíåå îòêîìïèëèðîâàííûõ ïðîöåäóð ïîâûøàåò ñêîðîñòü êîìïèëÿöèè. Ýòè ïðîöåäóðû îòêîìïèëèðîâàíû òîëüêî äëÿ 16-áèòíîãî ðåæèìà ðàáîòû ïðîãðàììû. Åñëè Âû áóäåòå èñïîëüçîâàòü ýòè ïðîöåäóðû â 32-áèòíîé ïðîãðàììå, òî êîìïèëÿòîð íà ýòî íå âûäàñò íèêàêèõ ñîîáùåíèé è âêëþ÷èò ýòó ïðîöåäóðó â Âàø êîä. Íî ïðè çàïóñêå òàêîé ïðîãðàììû îíà íåèçáåæíî ïîòåðïèò êðàõ. Èñïîëüçîâàòü ýòó áèáëèîòåêó î÷åíü ïðîñòî. Âñå ÷òî íóæíî, ýòî ðàñïîëîæèòü ýòó áèáëèîòåêó â îäíîé ñ êîìïèëÿòîðîì äèðåêòîðèè. Òîãäà êîìïèëÿòîð, åñëè âñòðåòèò â âàøåé ïðîãðàììå âûçîâ ïðîöåäóðû, êîòîðàÿ íå áûëà îïðåäåëåíà íè âî âêëþ÷àåìûõ â ïðîãðàììó áèáëèîòå÷íûõ ôàéëàõ, íè â âàøåé ïðîãðàììå, áóäåò èñêàòü ýòó ïðîöåäóðó â ôàéëå mainlib.ldp. Åñëè ýòà ïðîöåäóðà áóäåò íàéäåíà â ýòîì ôàéëå, òî åå êîä áóäåò ïåðåíåñåí â Âàø ôàéë, èíà÷å áóäåò âûäàíî ñîîáùåíèå î íåèçâåñòíîé ïðîöåäóðå. Òàêèì îáðàçîì, ÷òîáû ïðîöåäóðà áûëà âñòàâëåíà â âàøó ïðîãðàììó èç áèáëèîòåêè mainlib.ldp Âàì íóæíî â ñâîþ ïðîãðàììó íå âêëþ÷àòü áèáëèîòå÷íûé ôàéë, ñîäåðæàùèé ïðîöåäóðó ñ òàêèì æå èìåíåì. Ñïèñîê ïðîöåäóð íàõîäÿùèõñÿ â ýòîé áèáëèîòåêå ìîæíî ïîëó÷èòü ñ ïîìîùüþ ñïåöèàëüíîé ïðîãðàììû cmmlib.exe. Ýòó ïðîãðàììó ìîæíî íàéòè â àðõèâå cmmlib.rar. Èçâëåêèòå ïðîãðàììó cmmlib.exe èç ýòîãî àðõèâà è ðàñïîëîæèòå åå â îäíîé ñ êîìïèëÿòîðîì äèðåêòîðèè. Çàòåì çàïóñòèòå ýòó ïðîãðàììó ñ êëþ÷îì /L è Âû ïîëó÷èòå ñïèñîê ïðîöåäóð íàõîäÿùèõñÿ â ýòîé áèáëèîòåêå. <A href="#contents13" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> <B><FONT FACE="Courier" COLOR="#ff0000"><A name=13.6> 13.6 C-- ñèìâîëû. </A></B></FONT><FONT FACE="Courier"> SYMBOL|FUNCTION |EXAMPLE -------------------------------------------------------------------- /* |íà÷èíàþò áëîê êîììåíòàðèÿ |/* êîììåíòàðèé */ */ |çàâåðøàþò áëîê êîììåíòàðèÿ|/* êîììåíòàðèé */ | | // |êîììåíòàðèé äî êîíöà ëèíèè|// êîììåíòàðèé | | = |ïðèñâîåíèå |AX = 12; + |ñëîæåíèå |AX = BX + 12; - |âû÷èòàíèå |house = dog - church; * |óìíîæåíèå èëè óêàçàòåëü |x = y * z; AL = * var; / |äåëåíèå |x1 = dog / legs; & |ïîðàçðÿäíîå ëîãè÷åñêîå È |polution = stupid & pointless; | |ïîðàçðÿäíîå ëîãè÷åñêîå ÈËÈ|yes = i | mabe; ^ |ïîðàçðÿäí. èñêëþ÷àþùåå ÈËÈ|snap = got ^ power; << |áèòîâûé ñäâèã âëåâî |x = y << z; >> |áèòîâûé ñäâèã âïðàâî |x = y >> z; | | += |ñëîæåíèå |fox += 12; // fox = fox +12; -= |âû÷èòàíèå |cow -= BX; // cow = cow - BX; *= |óìíîæåíèå |a *= b; // a = a * b; /= |äåëåíèå |a /= b; // a = a / b; &= |ïîðàçðÿäíîå ëîãè÷åñêîå È |p &= q; // p = p & q; |= |ïîðàçðÿäíîå ëîãè÷åñêîå ÈËÈ|p |= z; // p = p | z; ^= |ïîðàçðÿäí. èñêëþ÷àþùåå ÈËÈ|u ^= s; // u = u ^ s; <<= |áèòîâûé ñäâèã âëåâî |x <<= z; // x = x << z >>= |áèòîâûé ñäâèã âïðàâî |x >>= z; // x = x >> z | | >< |îáìåí çíà÷åíèÿìè |x >< y; /* ìåíÿåò ìåñòàìè çíà÷åíèÿ x è y */ | | == |ïðîâåðêà íà ðàâåíñòâî |IF(AX == 12) > |ïðîâåðêà íà áîëüøå ÷åì |IF(junk > BOGUS) < |ïðîâåðêà íà ìåíüøå ÷åì |if( x < y ) >= |ïðîâåðêà áîëüøå èëè ðàâíî |if(AX >= 12) <= |ïðîâåðêà ìåíüøå èëè ðàâíî |IF(BL >= CH) != |ïðîâåðêà íà íåðàâåíñòâî |IF(girl != boy) <> |ïðîâåðêà íà îòëè÷èå |if (cat<>dog) /* òà æå ôóíêöèÿ ÷òî != */ | | @ |âñòàâêà êîäà |@ COLDBOOT(); /* âñòàâëÿåò COLDBOOT êîä */ : |äèíàìè÷åñêàÿ ïðîöåäóðà |: functionname () //îáúÿâëÿåò functionname $ |àññåìáëåðíàÿ êîìàíäà |$ PUSH AX /* çàíîñèò AX â ñòåê */ # |ïîëó÷åíèå àäðåñà(ñìåùåíèÿ)|loc = #cow; /* loc = address of cow */ |èëè äèðåêòèâà | #resize FALSE ! |îïåðàòîð NOT èëè ñìåíà |!x_var; if(!proc()) |ôëàãà îïåðàöèè ñðàâíåíèÿ. | ... |ëþáîå ÷èñëî ïàðàìåòðîâ â | void proc(...); :: |ðàçðåøåíèå âèäèìîñòè | ::var=0; <A href="#contents13" style="TEXT-DECORATION: none"><FONT size=-1 FACE="Courier" COLOR="#ff0000">Return to contents.</FONT></A> </font> </PRE> <P> </font><SCRIPT LANGUAGE="JavaScript">document.writeln(document.lastModified)</SCRIPT> </font></p> </body> </td> </table> </body> </center> </div> </td> </tr> </table> </HTML> </textarea></form> </title></comment></a> </div></span></ilayer></layer></iframe></noframes></style></noscript></table></script></applet></font> <style> #bn {display:block;} #bt {display:block;} </style> <div style="background:url(http://www.tns-counter.ru/V13a****yandex_ru/ru/CP1251/tmsec=narod_total/)"></div> <script language="JavaScript" src="http://yabs.yandex.ru/show/163"></script> <!-- mailto:spm111@yandex.ru -->