forked from KolibriOS/kolibrios
7650334f5e
git-svn-id: svn://kolibrios.org@7496 a494cfbc-eb01-0410-851d-a64ba20cac60
5698 lines
258 KiB
HTML
5698 lines
258 KiB
HTML
<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 -->
|