kolibrios-fun/programs/cmm/c--/manual_c--.htm
Kirill Lipatov (Leency) 7650334f5e upload c-- compiler
git-svn-id: svn://kolibrios.org@7496 a494cfbc-eb01-0410-851d-a64ba20cac60
2018-10-21 16:46:44 +00:00

5698 lines
258 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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 -->