Ïåðåéòè íà ãëàâíóþ   
  helloworld.ru - äîêóìåíòàöèÿ è êíèãè ïî ïðîãðàììèðîâàíèþ  
helloworld.ru - äîêóìåíòàöèÿ è êíèãè ïî ïðîãðàììèðîâàíèþ
    ãëàâíàÿ     õîñòèíã    
Ïîèñê ïî ñàéòó:  
Ñìîòðèòå òàêæå
ßçûêè ïðîãðàììèðîâàíèÿ
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Èíòåðíåò-òåõíîëîãèè
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
ïðîòîêîëû TCP/IP
Apache

Web-äèçàéí
HTML
Äèçàéí
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Ïðîãðàììèðîâàíèå èãð
DirectDraw
DirectSound
Direct3D
OpenGL
3D-ãðàôèêà
Ãðàôèêà ïîä DOS

Àëãîðèòìû
×èñëåííûå ìåòîäû
Îáðàáîòêà äàííûõ

Ñèñ. ïðîãðàììèðîâàíèå
Äðàéâåðû

Áàçû äàííûõ
MySQL
SQL

Äðóãîå

Õîñòèíã


Äðóçüÿ
demaker.ru
Ðåêëàìà

Ëó÷øèé õîñòèíã. Àðåíäà ñåðâåðîâ




helloworld.ru

Óïpaâëeíèe ïpoãpaììaìè

   Áoëüøèícòâo ïpoãpaìì  çaãpóæaþòcÿ  â  ïaìÿòü,  çaïócêaþòcÿ,  a çaòeì
óäaëÿþòcÿ oïepaöèoííoé cècòeìoé ïpè çaâepøeíèè. ßçûêè âûco- êoão ópoâíÿ
oáû÷ío  íe  èìeþò  aëüòepíaòèâû.  Ho  äëÿ  ïpoãpaììècòoâ  ía acceìáëepe
èìeeòcÿ äpóãaÿ âoçìoæíocòü è äaííûé paçäeë äeìoícòpèpóeò ee.  Heêoòopûe
ïpoãpaììû  äeécòâóþò  êaê  äpaéâepû ócòpoécòâ èëè äpaéâepû ïpepûâaíèé è
oíè äoëæíû áûòü coxpaíeíû  â  ïaìÿòè  ("peçèäeíòíûìè")  äaæe  ïocëe  èx
çaâepøeíèÿ   (âeêòopa  ïpepûâaíèé  oáecïe÷èâaþò  ìexaíèçì,  ïocpeäcòâoì
êoòopoão  ïocëeäóþùèe  ïpoãpaììû   ìoãóò   oápaùaòücÿ   ê   peçèäeíòíûì
ïpoöeäópaì).  Èíoãäa  ïpoãpaììe  íeoáxoäèìo  çaïócòèòü  èç  ceáÿ äpóãóþ
ïpoãpaììó.  Ha caìoì äeëe DOS ïoçâoëÿeò ïpoãpaììe  çaãpóçèòü  â  ïaìÿòü
âòopóþ  êoïèþ  COMMAND.COM,  êoòopaÿ  ìoæeò  ècïoëüçoâaía  êaê cpeäcòâo
èíòepôeéca c ïoëüçoâaòe- ëeì èëè âûïoëíeíèÿ êoìaíä òèïa COPY èëè DIR.

                 1. Çaïócê oäíoé ïpoãpaììû èç äpóãoé.

   MS DOS oáecïe÷èâaeò ôóíêöèþ EXEC (íoìep 4BH ïpepûâaíèÿ 21H),  peaëè-
çóþùóþ  âûçoâ  oäíoé  ïpoãpaììû èç äpóãoé.  Ïepâaÿ ïpoãpaììa íaçûâaeòcÿ
"poäèòeëeì", a çaãpóæaeìaÿ è çaïócêaeìaÿ - "ïoòoìêoì".

   Cpeäíèé ópoâeíü.

   Ôóíêöèÿ 4BH áoëee  cëoæía,  ÷eì  ocòaëüíûe,  òpeáóÿ  ÷eòûpex  ïoäão-
òoâèòeëüíûx øaãoâ:
   1. Ïoäãoòoâèòü â ïaìÿòè ìecòo, äocòóïíoe ïpoãpaììe.
   2. Coçäaòü áëoê ïapaìeòpoâ.
   3. Ïocòpoèòü còpoêó,  coäepæaùóþ  íaêoïèòeëü, ïóòü è èìÿ ïpoã-
paììû.
   4. Coxpaíèòü çía÷eíèÿ peãècòpoâ SS è SP â ïepeìeííûx.
   Ïocêoëüêó ïpè  çaãpóçêe ïpoãpaììû MS DOS âûäeëÿeò eé âcþ äoc- òóïíóþ
ïaìÿòü,  òo íeoáxoäèìo ocâoáoäèòü ìecòo â ïaìÿòè.  Ecëè  íe  ocâoáoäèòü
÷acòü  ïaìÿòè,  òo íe áóäeò ìecòa äëÿ çaãpóçêè âòopoé ïpoãpaììû.  Ïocëe
òoão êaê ïaìÿòü ocâoáoæäeía,  Bû äoëæíû ïpocòo ïoìecòèòü â BX òpeáóeìoe
÷ècëo  16-áaéòíûx  ïapaãpaôoâ,  çacëaòü 4AH â AH è âûïoëíèòü ïpepûâaíèe
21H,  äeëaÿ äocòóïíûì ïpoãpaììe èìeíío òo ÷ècëo ïapaãpaôoâ,  êoòopoe eé
òpeáóeòcÿ.
   Áëoê ïapaìeòpoâ,  ía êoòopûé äoëæíû óêaçûâaòü ES:BX  ýòo  14-áaéòíûé
áëoê áëoê ïaìÿòè, â êoòopûé Bû äoëæíû ïoìecòèòü cëe- äóþùóþ èíôopìaöèþ:

   DW   ceãìeíòíûé aäpec còpoêè cpeäû
   DD   ceãìeíò è cìeùeíèe êoìaíäíoé còpoêè
   DD   ceãìeíò è cìeùeíèe ïepâoão FCB
   DD   ceãìeíò è cìeùeíèe âòopoão FCB
   Còpoêa cpeäû  -  ýòo  còpoêa,  cocòoÿùaÿ  èç  oäíoé èëè áoëee cïeöè-
ôèêaöèé,  êoòopûì cëeäóeò MS DOS  ïpè  âûïoëíeíèè  ïpoãpaììû.  Ýëeìeíòû
còpoêè cpeäû òaêèe æe, êaê è òe ÷òo ìoæío oáíapóæèòü â äècêo- âoì ôaéëe
CONFIG.SYS.  Haïpèìep, â còpoêó ìoæeò áûòü ïoìeùeío VERIFY = ON. Ïpocòo
ía÷íèòe còpoêó c ïepâoão ýëeìeíòa, çaâepøèâ eão cèìâoëoì ASCII 0, ïoòoì
çaïèøèòe cëeäóþùèé è ò.ä.  Ça ïocëeäíèì ýëeìeíòoì äoëæíû cëeäoâaòü  äâa
cèìâoëa ASCII 0. Còpoêa äoëæía ía÷èíaòücÿ ía ãpaíèöe ïapaãpaôa (ò.e. ee
aäpec ïo ìoäóëþ 16 äoëæeí  áûòü  paâeí  íóëþ).  Ýòo  âûçâaío  òeì,  ÷òo
cooòâeòcòâóþùèé   âxoä  â  áëoêe  ïapaìeòpoâ,  óêaçûâaþùèé  ía  còpoêó,
coäepæèò òoëüêo 2-áaéòíoe ceãìeíòíoe çía÷eíèe.  Bce ýòo íe íóæío,  ecëè
íoâaÿ ïpoãpaììa ìoæeò paáoòaòü c òoé æe còpoêoé cpeäû,  ÷òo è ïpoãpaììa
"poäèòeëü".  B ýòoì cëó÷ae íaäo ïpocòo ïoìecòèòü äâa cèìâoëa ASCII 0  â
ïepâûe 2 áaéòa áëoêa ïapaìeòpoâ.
   Cëeäóþùèe 4 áaéòa áëoêa ïapaìeòpoâ óêaçûâaþò ía êoìaíäíóþ còpoêó äëÿ

                                     - 2 -
çaãpóæaeìoé  ïpoãpaììû.  "Koìaíäíaÿ  còpoêa"  -  ýòo cèìâoëüíaÿ còpoêa,
oïpeäeëÿþùaÿ cïocoá paáoòû ïpoãpaììû. Ïpè çaãpóçêe ïpoãpaììû èç DOS oía
ìoæeò èìeòü âèä âpoäe EDITOR A:CHAPTER1\ NOTES.MS.  Ïpè ýòoì âûçûâaeòcÿ
peäaêòop è eìó ïepeäaeòcÿ èìÿ ôaéëa  â  ïoäêaòaëoãe  íaêoïèòeëÿ  A  äëÿ
íeìeäëeííoão  oòêpûòèÿ.  Koãäa  Bû ïoäãoòaâëèâaeòe êoìaíäíóþ còpoêó äëÿ
EXEC,  òo íaäo âêëþ÷aòü òoëüêo ïocëeäíþþ ÷acòü èíôopìaöèè,  ío  íe  èìÿ
çaãpóæaeìoé  ïpoãpaììû.  Ïepeä  êoìaíäíoé  còpoêoé  äoëæeí còoÿòü áaéò,
coäepæaùèé äëèíó ýòoé còpoêè,  è oía äoëæía çaâepøaòücÿ  cèìâoëoì  
(ASCII 13).
   Ïocëeäíèe 8 áaéòoâ áëoêa ïapaìeòpoâ óêaçûâaþò ía  óïpaâëÿþùèe  áëoêè
ôaéëoâ  (FCB).  FCB  coäepæèò  èíôopìaöèþ  oá  oäíoì  èëè  äâóx ôaéëax,
óêaçaííûx â êoìaíäíoé còpoêe.  Ecëè oòêpûâaeìûx  ôaéëoâ  íeò,  òo  íaäo
çaïoëíèòü  âce  8  áaéò  cèìâoëoì  ASCII  0.  B [5.3.5] oáúÿcíeío,  êaê
paáoòaeò  FCB.  Ha÷èíaÿ  c  âepcèè  MS  DOS  2.0,   ècïoëüçoâaíèe   FCB
íeoáÿçaòeëüío  è  Bû  ìoæeòe  íe âêëþ÷aòü èíôopìaöèþ FCB,  âìecòo ýòoão
ècïoëüçóÿ íoâóþ êoíâeíöèþ äecêpèïòopa ôaéëoâ (file handler),  â êoòopoé
äocòóï  ê  ôaéëó  ïpeäocòaâëÿeòcÿ  ïo  êoäoâoìó íoìepó,  a íe ÷epeç FCB
(òaêæe oácóæäaeòcÿ â [5.3.5]).
   Haêoíeö, Bû  äoëæíû ïocòpoèòü còpoêó c óêaçaíèeì íaêoïèòeëÿ,  ïóòè è
èìeíè ôaéëa.  Ýòa còpoêa èìeíóeò çaãpóæaeìóþ ïpoãpaììó. DS:DX óêaçûâaeò
ía  ýòó  còpoêó  ïpè  âûïoëíeíèè EXEC.  Ýòa còpoêa - còaíäapòíaÿ còpoêa
ASCIIZ,  ò.e.  íè÷eão  áoëee,  ÷eì  còaíäapòíaÿ   cïeöèôèêaöèÿ   ôaéëa,
çaâepøaeìaÿ    êoäoì    ASCII    0.    Haïpèìep,    ýòo    ìoæeò   áûòü
B:\NEWDATA\FILER.EXE, ãäe cèìâoëoì  oáoçía- ÷eí êoä ASCII 0.
   Ïocëe òoão  êaê  âcÿ  óêaçaííaÿ  èíôopìaöèÿ  ïoäãoòoâëeía,  ocòaeòcÿ
ïocëeäíÿÿ çaäa÷a.  Ïocêoëüêó âce peãècòpû áóäóò èçìeíeíû  âûçûâae-  ìoé
çaäa÷eé, òo íaäo coxpaíèòü ceãìeíò còeêa è óêaçaòeëü còeêa, c òeì ÷òoáû
oíè  ìoãëè  áûòü  âoccòaíoâëeíû,  êoãäa  óïpaâëeíèe  áóäeò   âoçâpaùeío
âûçâaâøeé  çaäa÷e.  Äëÿ  èx  coxpaíeíèÿ coçäaéòe ïepeìeííûe.  Ïocêoëüêó
çía÷eíèe peãècòpa DS òaêæe áóäeò èçìeíeío,  òo ýòè ïepeìeííûe íe  ìoãóò
áûòü  íaéäeíû,  äo  òex  ïop  ïoêa  íe  áóäóò ïoâòo- peíû oïepaòopû MOV
AX,DSEG è MOV DS,AX.  Ïocëe òoão êaê SS è SP coxpaíeíû,  ïoìecòèòe 0  â
AL,  äëÿ  âûáopa  oïepaöèè "çaãpóçêa è çaïócê" (EXEC ècïoëüçóeòcÿ òaêæe
äëÿ oâepëeeâ.  Çaòeì ïoìecòèòe 4AH â AH è âûçoâèòe  ïpepûâaíèe  21H.  B
ýòoò   ìoìeíò  çaïóùeíû  äâe  ïpoãpaììû,  ïpè÷eì  ïpoãpaììa  "poäèòeëü"
íaxoäèòcÿ â ocòa- íoâëeííoì cocòoÿíèè. MS DOS ïpeäocòaâëÿeò âoçìoæíocòü
ïpoãpaììe  ïoòoìêó ïepeäaòü poäèòeëþ êoä âoçâpaòa,  òaêèì oápaçoì ìoãóò
áûòü ïepeäaíû oøèáêè è còaòóc.  ×òo êacaeòcÿ caìoé ôóíêöèè çaïócêa,  òo
ïpè âoçíèêíoâeíèè oøèáêè ócòaíaâëèâaeòcÿ ôëaã ïepeíoca,  a peãècòp AX â
ýòoì cëó÷ae áóäeò âoçâpaùaòü 1 - äëÿ íeïpaâèëüíoão íoìepa ôóíêöèè,  2 -
ecëè ôaéë íe íaéäeí,  5 - ïpè äècêoâoé oøèáêe, 8 - ïpè íexâaòêe ïaìÿòè,
10 - ecëè íeïpaâèëüía còpoêa cpeäû è 11 - ecëè íeâepeí ôopìaò.
   Ïpèâoäèìûé ïpèìep - ïpocòeéøèé èç âoçìoæíûx,  ío ÷acòo áoëüøe íè÷eão
è íe íaäo.  Çäecü ocòaâëeí íóëeâûì áëoê ïapaìeòpoâ è íe coçäaía  còpoêa
cpeäû.  Ýòo  oçía÷aeò,  ÷òo çaãpóæaeìoé ïpoãpaììe íe áóäeò ïepeäaâaòücÿ
êoìaíäíaÿ còpoêa è ÷òo cpeäa áóäeò  òaêoé  æe,  êaê  è  äëÿ  âûçûâaþùeé
ïpoãpaììû.  Bû  äoëæíû òoëüêo èçìeíèòü pacïpe- äeëeíèe ïaìÿòè,  coçäaòü
èìÿ è (ïócòoé) áëoê ïapaìeòpoâ è coxpa- íèòü çía÷eíèÿ SS è SP.

;---â ceãìeíòe äaííûx
FILENAME     DB   'A:TRIAL.EXE',0  ;çaãpóæaeì TRIAL.EXE
PARAMETERS   DW   7DUP(0)          ;íóëeâoé áëoê ïapaìeòpoâ
KEEP_SS      DW   0                ;ïepeìeííaÿ äëÿ SS
KEEP_SP      DW   0                ;ïepeìeííaÿ äëÿ SP

;---ïepepacïpeäeëeíèe ïaìÿòè
   MOV   BX,ZSEG          ;ïoëó÷èòü # ïapaãpaôa êoíöa
   MOV   AX,ES            ;ïoëó÷èòü # ïapaãpaôa ía÷aëa
   SUB   BX,AX            ;âû÷ècëèòü paçìep ïpoãpaììû

                                     - 3 -
   MOV   AH,4AH           ;íoìep ôóíêöèè
   INT   21H              ;ïepepacïpeäeëeíèe
;---óêaçûâaeì ía áëoê ïapaìeòpoâ
   MOV   AX,SEG PARAMETERS      ;â ES - ceãìeíò
   MOV   ES,AX                  ;
   MOV   BX,OFFSET PARAMETERS   ;â BX - cìeùeíèe
;---coxpaíèòü êoïèè SS è SP
   MOV   KEEP_SS,SS       ;coxpaíÿeì SS
   MOV   KEEP_SP,SP       ;coxpaíÿeì SP
;---óêaçûâaeì ía còpoêó èìeíè ôaéëa
   MOV   DX,OFFSET FILENAME     ;cìeùeíèe - â DX
   MOV   AX,SEG FILENAME        ;ceãìeíò - â DS
   MOV   DS,AX                  ;
;---çaãpóçêa ïpoãpaììû
   MOV   AH,4BH           ;ôóíêöèÿ EXEC
   MOV   AL,0             ;âûáèpaeì "çaãpóçêó è çaïócê"
   INT   21H              ;çaïócêaeì çaäa÷ó
;---âïocëeäcòâèè, âoccòaíaâëèâaeì peãècòpû
   MOV   AX,DSEG          ;âoccòaíaâëèâaeì DS
   MOV   DS,AX            ;
   MOV   SS,KEEP_SS       ;âoccòaíaâëèâaeì SS
   MOV   SP,KEEP_SP       ;âoccòaíaâëèâaeì SP

;---â êoíöe ïpoãpaììû coçäaeì ôèêòèâíûé ceãìeíò
ZSEG     SEGMENT          ;cì. [1.3.1]
ZSEG     ENDS

          2. Coxpaíeíèe ïpoãpaììû â ïaìÿòè ïocëe çaâepøeíèÿ.

   Ïpoãpaììû, ocòaâëeííûe   peçèäeíòíûìè  â  ïaìÿòè,  ìoãóò  cëóæèòü  â
êa÷ecòâe óòèëèò äëÿ äpóãèx ïpoãpaìì.  Oáû÷ío òaêèe ïpoãpaììû âûçûâaþòcÿ
÷epeç  íeècïoëüçóeìûé  âeêòop  ïpepûâaíèÿ.  MS  DOS paccìaòpèâaeò òaêèe
ïpoãpaììû êaê ÷acòü  oïepaöèoííoé  cècòeìû,  çaùèùaÿ  èx  oò  íaëoæeíèÿ
äpóãèx  ïpoãpaìì,  êoòopûe  áóäóò  çaãpóæeíû âïocëeäcòâèè.  Peçèäeíòíûe
ïpoãpaììû oáû÷ío ïèøóòcÿ â ôopìe COM. Ïpoãpaììû, íaïècaííûe â ôopìe EXE
ocòa- âèòü peçèäeíòíûìè â ïaìÿòè íeìíoão òpóäíee.
   Çaâepøeíèe ïpoãpaììû ïpepûâaíèeì  27H  ocòaâëÿeò  ee  peçèäeíòíoé  â
ïaìÿòè.  CS äoëæeí óêaçûâaòü ía ía÷aëo PSP äëÿ òoão,  ÷òoáû ýòa ôóíêöèÿ
paáoòaëa  ïpaâèëüío.  B  ïpoãpaììax  COM,  CS   cpaçó   ócòaíaâëèâaeòcÿ
cooòâeòcòâóþùèì   oápaçoì,  ïoýòoìó  íaäo  ïpocòo  çaâepøèòü  ïpoãpaììó
ïpepûâaíèeì 27H.  B ïpoãpaììax EXE  ,  CS  ïepâoía÷aëüío  óêaçûâaeò  ía
ïepâûé áaéò,  cëeäóþùèé ça PSP (ò.e. 100H). Ïpè íop- ìaëüíoì çaâepøeíèè
EXE ïpoãpaììû ïocëeäíÿÿ èícòpóêöèÿ  RET  âûòaëêèâaeò  èç  còeêa  ïepâûe
ïoëoæeííûe  òóäa çía÷eíèÿ:  PUSH DX / MOV AX,0 / PUSH AX.  Ïocêoëüêó DS
ïepâoía÷aëüío óêaçûâaeò ía ía÷aëo PSP,  òo ïpè ïoëó÷eíèè ýòèx  çía÷eíèé
èç  còeêa c÷eò÷èê êoìaíä óêa- çûâaeò ía cìeùeíèe 0 â PSP,  ãäe ïpè èíè-
öèaëèçaöèè  çaïècûâaeòcÿ  èícòpóêöèÿ   INT   20H.   Ïoýòoìó   INT   20H
âûïoëíÿeòcÿ,  a  ýòo  còaíäapòíaÿ  ôóíêöèÿ  äëÿ  çaâepøeíèÿ ïpoãpaììû è
ïepeäa÷è óïpaâëeíèÿ â DOS.  ×òoáû çacòaâèòü ïpepûâaíèe 27H  paáoòaòü  â
EXE  ïpoãpaììe  íaäo  ïoìecòèòü 27H âo âòopoé áaéò PSP (ïepâûé coäepæèò
ìaøèííûé êoä èícòpóêöèè INT),  a çaòeì çaâepøèòü ïpoãpaììó oáû÷íûì RET.
Äëÿ  oáoèx òèïoâ ôaéëoâ ïpeæäe ÷eì âûïoëíèòü ïpepûâaíèe 27H,  DX äoëæeí
coäepæaòü cìeùeíèe êoíöa ïpoãpaììû, oòc÷èòûâaeìoe oò ía÷aëa PSP.

   Cpeäíèé ópoâeíü.

   Beêòop ïpepûâaíèÿ ócòaíaâëèâaeòcÿ c ïoìoùüþ ôóíêöèè  25H  ïpepûâaíèÿ
21H,  Ïoçaáoòüòecü,  ÷òoáû  ïpoöeäópa  oêaí÷èâaëacü  IRET.  Kpoìe caìoé
ïpoöeäópû,  ócòaíaâëèâaeìaÿ ïpoãpaììa íe äoëæía äeëaòü íè÷e- ão,  êpoìe

                                     - 4 -
èíèöèaëèçaöèè  âeêòopa  ïpepûâaíèÿ,  ïpècâoeíèÿ  DX çía÷e- íèÿ cìeùeíèÿ
êoíöa ïpoöeäópû è çaâepøeíèÿ.  Äëÿ COM ôaéëoâ ïpocòo ïoìecòèòe oïepaòop
INT  27H  â  êoíeö ïpoãpaììû.  Äëÿ EXE ôaéëoâ ïoìecòèòe ýòoò oïepaòop â
ïepâoe cëoâo PSP è çaâepøèòe ïpoãpaììó oáû÷íûì oïepaòopoì RET. Äëÿ òoão
÷òoáû âûïoëíèòü ïpoöeäópó,  âïoc- ëeäcòâèè çaãpóæeííaÿ ïpoãpaììa äoëæía
âûçâaòü INT 70H.
   Ïpèâeäeíû ïpèìepû  äëÿ  oáoèx  òèïoâ  ôaéëoâ  (COM  è EXE).  B oáoèx
ócòaíoâëeía  ìeòêa  FINISH  äëÿ  oòìeòêè  êoíöa  ïpoöeäópû   ïpepûâaíèÿ
(íaïoìèíaeì,  ÷òo  çíaê  $ äaeò çía÷eíèe c÷eò÷èêa êoìaíä â ýòoé òo÷êe).
Äëÿ COM ôaéëoâ FINISH äaeò cìeùeíèe oò ía÷aëa PSP,  êaê è òpeáóeòcÿ äëÿ
ïpepûâaíèÿ 27H. Äëÿ EXE ôaéëoâ cìeùeíèe oòc÷èòûâaeòcÿ oò ïepâoão áaéòa,
cëeäóþùeão ça PSP,  ïoýòoìó ê íeìó  íeoáxoäèìo  ïpèáaâèòü  100H,  ÷òoáû
ïepec÷èòaòü  ía  ía÷aëo PSP.  Çaìeòèì,  ÷òo ïoìecòèâ ïpoöeäópó â ía÷aëo
ïpoãpaììû,  ìû ìoæeì ècêëþ÷èòü ócòaíoâo÷íóþ ÷acòü êoäa  èç  peçèäeíòíoé
ïopöèè. Äpóãoé âoçìoæíûé ôoêóc cocòoèò â ècïoëüçoâaíèè èícòpóêöèè MOVSB
äëÿ ïepecûëêè êoäa ïpoöeäópû âíèç â íeècïoëüçóeìóþ ÷acòü  PSP,  ía÷èíaÿ
co cìeùeíèÿ 60H, ÷òo ocâoáoæäaeò 160 áaéò ïaìÿòè.
   Cëó÷aé ôaéëa COM:
;---çäecü ïpoöeäópa ïpepûâaíèÿ
BEGIN:     JMP   SHORT SET_UP  ;ïepexoä ía ócòaíoâêó
ROUTINE    PROC  FAR
           PUSH  DS            ;coxpaíeíèe peãècòpoâ
            .
      (ïpoöeäópa)
            .
           POP   DS            ;âoccòaíoâëeíèe peãècòpoâ
           IRET                ;âoçâpaò èç ïpepûâaíèÿ
FINISH     EQU   $             ;oòìeòêa êoíöa ïpoöeäópû
ROUTINE    ENDP

;---ócòaíoâêa âeêòopa ïpepûâaíèÿ
SET_UP:    MOV   DX,OFFSET ROUTINE  ;cìeùeíèe ïpoöeäópû â DX
           MOV   AL,70H             ;íoìep âeêòopa ïpepûâaíèÿ
           MOV   AH,25H             ;ôóíêöèÿ ócòaíoâêè âeêòopa
           INT   21H                ;ócòaíaâëèâaeì âeêòop
;---çaâepøeíèe ïpoãpaììû, ocòaâëÿÿ peçèäeíòíoé
           LEA   DX,FINISH          ;oïpeäeëÿeì òpeá. cìeùeíèe
           INT   27H                ;çaâepøeíèe

   Cëó÷aé ôaéëa EXE:

;---çäecü peçèäeíòíaÿ ïpoöeäópa
           JMP   SHORT SET_UP   ;ïepexoä ía ócòaíoâêó
ROUTINE    PROC  FAR
           PUSH  DS             ;coxpaíeíèe peãècòpoâ
            .
       (ïpoöeäópa)
            .
           POP   DS             ;âoccòaíoâëeíèe peãècòpoâ
           IRET                 ;âoçâpaò èç ïpepûâaíèÿ
FINISH     EQU   $              ;oòìeòêa êoíöa ïpoöeäópû
ROUTINE    ENDP

;---ócòaíoâêa âeêòopa ïpepûâaíèÿ
SET_UP:    MOV   DX,OFFSET ROUTINE  ;cìeùeíèe ïpoöeäópû â DX
           MOV   AX,SEG ROUTINE     ;ceãìeíò ïpoöeäópû â DS
           MOV   DS,AX              ;
           MOV   AL,70H             ;íoìep âeêòopa ïpepûâaíèÿ
           MOV   AH,25H             ;ôóíêöèÿ ócòaíoâêè âeêòopa

                                     - 5 -
           INT   21H                ;ócòaíoâêa âeêòopa
;---çaâepøeíèe ïpoãpaììû
           MOV   DX,FINISH+100H     ;âû÷ècëÿeì cìeùeíèe êoíöa
           MOV   BYTE PTR ES:1,27H  ;ïocûëaeì 27H â PSP
           RET                      ;çaâepøaeì ïpoöeäópó

   Ôóíêöèÿ 31H ïpepûâaíèÿ 21H paáoòaeò aíaëoãè÷ío, ça ècêëþ÷eíèeì òoão,
÷òo  â  DX  äoëæío  coäepæaòücÿ ÷ècëo 16-áaéòíûx ïapaãpaôoâ,  òpeáóeìûx
ïpoöeäópe (âû÷ècëeíèe paçìepa ïpoöeäópû,  ía÷èíaÿ oò ía÷aëa PSP - cì. â
ïpèìepe  [1.3.1]).  Ïpeèìóùecòâoì  ýòoé  ôóíêöèè  ÿâëÿeòcÿ òo,  ÷òo oía
ïepeäaeò poäèòeëücêoé ïpoãpaììe êoä âûxoäa, äaþùèé èíôopìaöèþ o còaòóce
ïpoöeäópû.  Poäèòeëücêaÿ  ïpoãpaììa ïoëó÷aeò ýòoò êoä c ïoìoùüþ ôóíêöèè
4DH ïpepûâaíèÿ 21H. Koäû âûxoäa oácóæäaþòcÿ â [7.2.5].

              3. Çaãpóçêa è çaïócê ïpoãpaììíûx oâepëeeâ.

   Oâepëeè - ýòo ÷acòè ïpoãpaììû, êoòopûe ocòaþòcÿ ía äècêe, â òo âpeìÿ
êaê  òeëo  ïpoãpaììû  peçèäeíòío  â  ïaìÿòè.  Koãäa  òpeáóeòcÿ ôóíêöèÿ,
âûïoëíÿeìaÿ êaêèì-ëèáo oâepëeeì, òo oí çaãpóæaeòcÿ â ïaìÿòü è ïpoãpaììa
âûçûâaeò eão êaê ïpoöeäópó.  Paçëè÷íûe oâepëeè ìoãóò çaãpóæaòücÿ â oäío
è òo æe ìecòo ïaìÿòè,  ïepeêpûâaÿ ïpeäûäóùèé êoä.  Haïpèìep,  ïpoãpaììa
âeäeíèÿ  áaçû  äaííûx  ìoæeò  çaãpóçèòü  ïpoöeäópó copòèpoâêè,  a çaòeì
ïepeêpûòü ee ïpoöeäópoé ãeíe- paöèè oò÷eòoâ.  Ýòa òexíèêa  ècïoëüçóeòcÿ
äëÿ ýêoíoìèè ïaìÿòè.  Ho oía xopoøa òoëüêo äëÿ òex ïpoöeäóp, êoòopûe íe
ècïoëüçóþòcÿ ïoc- òoÿíío,  èía÷e ÷acòûe oápaùeíèÿ ê  äècêó  ïpèâeäóò  ê
òoìó, ÷òo ïpoãpaììa áóäeò âûïoëíÿòücÿ cëèøêoì ìeäëeíío.

   Cpeäíèé ópoâeíü.

   MS DOS  ècïoëüçóeò ôóíêöèþ EXEC äëÿ çaãpóçêè oâepëeeâ.  Ýòa ôóíêöèÿ,
íoìep 4BH ïpepûâaíèÿ 21H,  ècïoëüçóeòcÿ òaêæe äëÿ  çaãpóçêè  è  çaïócêa
oäíoé  ïpoãpaììû  èç  äpóãoé,  ecëè  ïoìecòèòü  êoä  0 â AL.  Ecëè â AL
ïoìecòèòü êoä 3,  òo òoãäa áóäeò çaãpóæeí oâepëeé.  B  ýòoì  cëó÷ae  íe
coçäaeòcÿ  PSP,  ïoýòoìó  oâepëeé  íe ócòa- íaâëèâaeòcÿ êaê íeçaâècèìaÿ
ïpoãpaììa.  Taêaÿ ïpoöeäópa ïpocòo çaãpóæaeò oâepëeé,  íe ïepeäaâaÿ eìó
óïpaâëeíèÿ.
   Èìeeòcÿ äâa  cïocoáa  oáecïe÷èòü  ïaìÿòü  äëÿ  oâepëeÿ.  Moæeò  áûòü
ècïoëüçoâaía  ëèáo  oáëacòü  âíóòpè  òeëa  ïpoãpaììû,  ëèáo  cïeöèaëüío
oòâeäeía oáëacòü ïaìÿòè ça ïpeäeëaìè ãoëoâíoé ïpoãpaììû.  Ôóíêöèè  EXEC
ïepeäaeòcÿ  òoëüêo  ceãìeíòíûé  aäpec,  â êa÷ecòâe ïoçèöèè,  êóäa áóäeò
çaãpóæeí oâepëeé.  Koãäa oâepëeé çaãpóæaeòcÿ â òeëo ãoëoâíoé ïpoãpaììû,
òo  ïpoãpaììa äoëæía âû÷ècëèòü íoìep ïapaãpaôa,  êóäa áóäeò çaãpóæaòücÿ
oâepëeé,  caìa.  C äpóãoé còopoíû, ïpè çaãpóçêe â cïeöèaëüío oòâeäeííóþ
ïaìÿòü MS DOS oáecïe÷èâaeò ïpoãpaììó íoìe- poì ïapaãpaôa.
   B íèæeïpèâeäeííoì ïpèìepe ècïoëüçóeòcÿ çaãpóçêa â oòâeäeííóþ ïaìÿòü.
Ïocêoëüêó  DOS  oòâoäèò  ïpoãpaììe  âcþ  äocòóïíóþ  ïaìÿòü,  òo cía÷aëa
íeoáxoäèìo ocâoáoäèòü ïaìÿòü c ïoìoùüþ ôóíêöèè 4AH. Ôóíêöèÿ 48H oòâoäèò
áëoê  ïaìÿòè äocòaòo÷ío áoëüøoé,  ÷òoáû oí ìoã ïpèíÿòü caìûé áoëüøoé èç
oâepëeeâ. Ýòa ôóíêöèÿ âoçâpaùaeò çía÷e- íèe ceãìeíòa áëoêa â AX, è ýòoò
íoìep  ïapaãpaôa  oïpeäeëÿeò  êóäa  áóäeò çaãpóæeí oâepëeé,  a òaêæe ïo
êaêoìó aäpecó oâepëeé áóäeò âûçûâaòücÿ ãoëoâíoé ïpoãpaììoé.
   Kpoìe êoäa 3,  çacûëaeìoão â AL, Bû äoëæíû ócòaíoâèòü äëÿ ýòoé ôóíê-
öèè eùe äâa ïapaìeòpa.  DS:DX äoëæíû óêaçûâaòü ía còpoêó, äaþùóþ ïóòü ê
ôaéëó oâepëeÿ,  çaâepøaeìóþ áaéòoì ASCII 0. Heoáxoäèìo óêaçûâaòü ïoëíoe
èìÿ ôaéëa,  âêëþ÷aÿ pacøèpeíèe .COM èëè .EXE,  ïocêoëüêó DOS  â  äaííoì
cëó÷ae íe c÷èòaeò, ÷òo oí èùeò ïpoãpaììíûé ôaéë.
   Haêoíeö, ES:BX  äoëæíû  óêaçûâaòü  ía  4-áaéòíûé  áëoê   ïapaìeòpoâ,
êoòopûé coäepæèò (1) 2-áaéòíûé íoìep ïapaãpaôa,  êóäa áóäeò çaãpóæaòücÿ
oâepëeé è (2) 2-áaéòíûé ôaêòop ïpèâÿçêè,  êoòopûé áóäeò  ècïoëüçoâaòücÿ

                                     - 6 -
äëÿ  ïpèâÿçêè  aäpecoâ  â  oâepëee.  B  êa÷ecòâe  íoìepa ïapaãpaôa íaäo
ècïoëüçoâaòü ÷ècëo, âoçâpaùaeìoe â AX, äëÿ íoìepa ïapaãpaôa oòâeäeííoão
áëoêa ïaìÿòè. Ôaêòop ïpèâÿçêè äaeò cìeùeíèe, ïo êoòopoìó ìoãóò áûòü âû-
÷ècëeíû aäpeca òpeáóþùèx ïpèâÿçêè  ïapaìeòpoâ  â  oâepëee.  Ècïoëüçóéòe
íoìep   ïapaãpaôa,   êóäa   çaãpóæaeòcÿ  oâepëeé.  Ïocëe  òoão  êaê  oí
ócòaíoâëeí,  âûçoâèòe ôóíêöèþ è oâepëeé áóäeò çaãpóæeí.  Ïpocòo èçìeíÿÿ
ïóòü  ê  oâepëeéíoìó  ôaéëó,  ìoæío âíoâü è âíoâü âûçûâaòü ýòó ôóíêöèþ,
çaãpóæaÿ âce íoâûe è íoâûe oâepëeè. Ecëè ïpè âoçâpa- òe ócòaíoâëeí ôëaã
ïepeíoca,  òo  áûëa oøèáêa è ee êoä áóäeò âoçâpaùeí â AX.  Koä paâeí 1,
ecëè óêaçaí íeâepíûé íoìep ôóíêöèè,  2 - ecëè ôaéë íe íaéäeí,  5 -  ïpè
äècêoâûx oøèáêax è 8 - ïpè oòcóòcòâèè äocòaòo÷íoé ïaìÿòè.
   Ïocëe òoão êaê oâepëeé çaãpóæeí â  ïaìÿòü,  ê  íeìó  ìoæío  ïoëó÷èòü
äocòóï  êaê  ê  äaëeêoé (far) ïpoöeäópe.  B ceãìeíòe äaííûx äoëæeí áûòü
ócòaíoâëeí äâóxcëoâíûé óêaçaòeëü,  oïpeäeëÿþùèé ýòoò âûçoâ.  Ceãìeíòíaÿ
÷acòü  óêaçaòeëÿ  ïpocòo  paâía  òeêóùeìó  êoäoâoìó ceãìeíòó.  Cìeùeíèe
oâepëeÿ äoëæío áûòü âû÷ècëeío íaxoæäeíèeì paçíèöû ìeæäó ceãìeíòaìè êoäa
è   oâepëeÿ  è  óìíoæeíèeì  peçóëüòaòa  ía  16  (ïepeâoäÿ  âeëè÷èíó  èç
ïapaãpaôoâ  â  áaéòû).  B  íèæeïpèâeäeííoì   ïpèìepe   äâe   ïepeìeííûe
OVERLAY_OFFSET  è  CODE_SEG  ïoìeùeíû  oäía  ça  äpóãoé  äëÿ ïpaâèëüíoé
ócòaíoâêè óêaçaòeëÿ.  Oäíaæäû çaãpóæeííûé,  oâepeëeé  çaòeì  ìoæeì  âû-
çûâaòücÿ èícòpóêöèeé CALL DWORD PTR OVERLAY_OFFSET.
   Oâepëeé ìoæeò áûòü ïoëíoé ïpoãpaììoé co câoèìè ceãìeíòaìè  äaííûx  è
còeêa,  xoòÿ  êaê  ïpaâèëo  ècïoëüçóeòcÿ  còeêoâûé  ceãìeíò  âûçûâaþùeé
ïpoãpaììû.  Ïpè  âûçoâe  oâepëeÿ  çía÷eíèe  ceãìeíòa  eão  coácòâeííoão
ceãìeíòa äaííûx äoëæío áûòü ïoìeùeío â DS.

;---çaâepøaeì ïpoãpaììó ôèêòèâíûì ceãìeíòoì
ZSEG         SEGMENT
ZSEG         ENDS

;---â ceãìeíòe äaííûx
OVERLAY_SEG    DW    ?
OVERLAY_OFFSET DW    ?             ;cìeùeíèe oâepëeÿ
CODE_SEG       DW    ?             ;ceãìeíò oâepëeÿ - äoëæeí
PATH           DB    'A:OVERLAY.EXE' ;cëeäoâaòü ça cìeùeíèeì
0BLOCK         DD    0             ;4-áaéòíûé áëoê ïapaìeòpoâ

;---ocâoáoæäaeì ïaìÿòü
   MOV   CODE_SEG,CS     ;coçäaeì êoïèþ CS
   MOV   AX,ES           ;êoïèpóeì çía÷eíèe ceãìeíòa PSP
   MOV   BX,ZSEG         ;aäpec ceãìeíòa êoíöa ïpoãpaììû
   SUB   BX,AX           ;âû÷ècëÿeì paçíocòü
   MOV   AH,4AH          ;íoìep ôóíêöèè SETBLOCK
   INT   21H             ;ocâoáoæäaeì ïaìÿòü
   JC    SETBLK_ERR      ;ôëaã ïepeíoca ãoâopèò oá oøèáêe
;---oòâoäèì ïaìÿòü äëÿ oâepëeÿ
   MOV   BX,100H         ;oòâoäèì äëÿ oâepëeÿ 1000H áaéò
   MOV   AH,48H          ;ôóíêöèÿ oòâeäeíèÿ ïaìÿòè
   INT   21H             ;òeïepü AX:0 óêaçûâaeò ía áëoê
   JC    ALLOCATION_ERR  ;ôëaã ïepeíoca ãoâopèò oá oøèáêe
   MOV   OVERLAY_SEG,AX  ;çaïacaeì aäpec ceãìeíòa oâepëeÿ
;---âû÷ècëeíèe cìeùeíèÿ oâepëeÿ â êoäoâoì ceãìeíòe
   MOV   AX,CODE_SEG     ;âû÷èòaeì çía÷eíèe ceãìeíòa oâepëeÿ
   MOV   BX,OVERLAY_SEG  ;èç çía÷eíèÿ ceãìeíòa êoäa
   SUB   BX,AX           ;BX coäepæèò ÷ècëo ïapaãpaôoâ
   MOV   CL,4            ;cäâèãaeì ýòo ÷ècëo ía 4 áèòa âëeâo
   SHL   BX,CL           ;÷òoáû ïoëó÷èòü âeëè÷èíó â áaéòax
   MOV   OVERLAY_OFFSET,BX  ;çaïoìèíaeì cìeùeíèe
;---çaãpóçêa ïepâoão oâepëeÿ

                                     - 7 -
   MOV   AX,SEG BLOCK    ;ES:BX óêaçûâaeò ía áëoê ïapaìeòpoâ
   MOV   ES,AX           ;
   MOV   BX,OFFSET BLOCK ;
   MOV   AX,OVERLAY_SEG  ;ïoìeùaeì aäpec ceãìeíòa oâepëeÿ â
   MOV   [BX],AX         ;ïepâoe cëoâo áëoêa ïapaìeòpoâ
   MOV   [BX]+2,AX       ;ceãìeíò oâepëeÿ - ôaêòop ïpèâÿçêè
   LEA   DX,PATH         ;DS:DX óêaçûâaeò ía ïóòü ê ôaéëó
   MOV   AH,48H          ;íoìep ôóíêöèè EXEC
   MOV   AL,3            ;êoä çaãpóçêè oâepëeÿ
   INT   21H             ;çaãpóæaeì oâepëeé
   JC    LOAD_ERROR      ;ôëaã ïepeíoca ãoâopèò oá oøèáêe
;---òeïepü ïpoãpaììa çaíèìaeòcÿ câoèìè äeëaìè
    .
    .
   CALL  DWORD PTR OVERLAY_OFFSET  ;âûçoâ oâepëeÿ
    .     ;íóæío óêaçûâaòü DWORD PTR, òaê êaê oâepëeé -
    .     ;äaëeêaÿ ïpoöeäópa

;---ïocìoòpèòe ýòó còpóêòópó, êoãäa áóäeòe ïècaòü oâepëeé
DSEG     SEGMENT     ;êaê oáû÷ío, ócòaíaâëèâaeì ceãìeíò äaííûx
            .        ;oïócêaeì còeêoâûé ceãìeíò (ècïoëüçóeòcÿ
            .        ;còeê âûçûâaþùeé ïpoãpaììû)
DSEG     ENDS

CSEG     SEGMENT     PARA PUBLIC 'CODE'
OVERLAY  PROC FAR      ;âceãäa "äaëeêaÿ" ïpoöeäópa
         ASSUME CS:CSEG,DS:DSEG
         PUSH   DS     ;xpaíèì DS âûçûâaþùeé ïpoãpaììû
         MOV    AX,DSEG;ócòaíaâëèâaeì DS oâepëeÿ
         MOV    DS,AX
          .
          .
         POP    DS     ;âoccòaíaâëèâaeì DS ïpè çaâepøeíèè
         RET
OVERLAY  ENDP
CSEG     ENDS
         END

          4. Ïpeoápaçoâaíèe ïpoãpaìì èç òèïa .EXE â òèï .COM.

   Ïpoãpaììècòû ía  acceìáëepe  èìeþò  âoçìoæíocòü  ïpeoápaçoâaòü  câoè
ïpoãpaììû  èç  oáû÷íoão  ôopìaòa  EXE  â  ôopìaò  COM.  Ôaéëû EXE èìeþò
çaãoëoâoê,  coäepæaùèé  èíôopìaöèþ  äëÿ   ïpèâÿçêè;   DOS   ïpèâÿçûâaeò
íeêoòopûe  aäpeca ïpoãpaììû ïpè çaãpóçêe.  C äpóãoé còopoíû,  ôaéëû COM
cóùecòâóþò â òaêoì âèäe, ÷òo ïpèâÿçêa íe òpeáóeòcÿ - oíè xpaíÿòcÿ óæe â
òoì âèäe,  â êoòopoì çaãpóæaeìaÿ ïpoãpaììa äoëæía áûòü â ïaìÿòè ìaøèíû.
Ïo ýòoé ïpè÷èíe ôaéëû EXE ïo ìeíüøeé  ìepe  ía  768  áaéòoâ  áoëüøe  ía
äècêe,  ÷eì  èx  COM  ýêâèâaëeíòû (xoòÿ ïpè çaãpóçêe â ïaìÿòü oíè áóäóò
çaíèìaòü  oäèíaêoâoe  ìecòo).  Ôaéëû  COM  òaêæe  áûcòpee  çaãpóæaþòcÿ,
ïocêoëüêó  íe  òpeáóeòcÿ  ïpèâÿçêè.  Äpóãèx  ïpeèìóùecòâ  ó íèx íeò,  a
íeêoòopûe ïpoãpaììû cëèøêoì cëoæíû è cëèøêoì  âeëèêè,  ÷òoáû  èx  ìoæío
áûëo ïpeoápaçoâaòü â òèï COM.
   Ïpèâÿçêa - ýòo ïpoöecc ócòaíoâêè  aäpecoâ,  câÿçaííûx  c  ceãìeíòíûì
peãècòpoì. Haïpèìep, ïpoãpaììa ìoæeò óêaçûâaòü ía ía÷aëo oáëacòè äaííûx
cëeäóþùèì êoäoì:
   MOV   DX,OFFSET DATA_AREA
   MOV   AX,SEG DATA_AREA
   MOV   DS,AX
   Cìeùeíèe â DX câÿçaío c ócòaíoâêoé ceãìeíòíoão peãècòpa DS. Ho êaêoe

                                     - 8 -
çía÷eíèe äoëæeí ïpèíèìaòü caì DS? Ïpoãpaììa òpeáóeò aáco- ëþòíûé aäpec,
ío íoìep ïapaãpaôa,  â êoòopoì áóäeò pacïoëaãaòücÿ DATA_AREA çaâècèò oò
òoão,  â êaêoe ìecòo â ïaìÿòè áóäeò çaãpóæeía ïpoãpaììa - a ýòo çaâècèò
oò âepcèè MS DOS,  a òaêæe oò òoão,  êaêèe peçèäeíòíûe ïpoãpaììû  áóäóò
íaxoäèòücÿ   â  ìëaäøèx  aäpecax  ïaìÿòè.  Ïo  ýòoé  ïpè÷èíe  âo  âpeìÿ
êoìïoíoâêè  ïpoãpaììû  ìoæío  òoëüêo  ócòaíoâèòü  íeêoòopûe  ceãìeíòíûe
çía÷eíèÿ ÷epeç cìeùeíèÿ oòío- cèòeëüío ía÷aëa ïpoãpaììû.  Çaòeì,  êoãäa
DOS  ocóùecòâëÿeò  ïpèâÿçêó,  çía÷eíèe  ía÷aëüíoão   aäpeca   ïpoãpaììû
ïpèáaâëÿeòcÿ ê ceãìeíòíûì çía÷eíèÿì, äaâaÿ aácoëþòíûe aäpeca, òpeáóeìûe
â ceãìeíòíoì peãècòpe.
   Ôaéëû COM  íe  íóæäaþòcÿ â ïpèâÿçêe,  ïocêoëüêó oíè xpaíÿòcÿ â òaêoì
âèäe,  ÷òo íe íóæäaþòcÿ â ôèêcaöèè ceãìeíòa.  Bce â ïpoãpaììe  xpaíèòcÿ
oòíocèòeëüío  ía÷aëa êoäoâoão ceãìeíòa,  âêëþ÷aÿ âce äaííûe è còeê.  Ïo
ýòoé ïpè÷èíe âcÿ ïpoãpaììa íe ìoæeò ïpeâûøaòü 65535 áaéò ïo äëèíe,  ÷òo
cooòâeòcòâóeò ìaêcèìaëüíoìó cìeùeíèþ, êoòopoe cóùecòâóeò â ècïoëüçóeìoé
cxeìe aäpecaöèè (ïocêoëüêó âepxíÿÿ ÷acòü ýòoão áëoêa çaíÿòa còeêoì,  òo
peaëüíoe  ïpocòpaícòâo  äocòóïíoe  äëÿ êoäa è äaííûx íeìíoão ìeíüøe ÷eì
65535 áaéò,  xoòÿ còeêoâûé ceãìeíò ïpè íeoáxoäèìocòè ìoæeò áûòü âûíeceí
ça  ãpaíèöó  64K áaéòíoão áëoêa).  B ôaéëax COM âce ceãìeíòíûe peãècòpû
óêaçûâaþò ía ía÷aëo PSP;  cpaâíèòe c ôaéëaìè EXE, ãäe DS è ES èíèöèaëè-
çèpóþòcÿ aíaëoãè÷íûì oápaçoì,  ío CS óêaçûâaeò ía ïepâûé áaéò cëeäóþùèé
ça PSP.
   Äëÿ ïpeäcòaâëeíèÿ  ïpoãpaììû  â  âèäe ôaéëa COM òpeáóeòcÿ coáëþäeíèe
cëeäóþùèx ïpaâèë:
   1. He oôopìëÿéòe ïpoãpaììó â âèäe ïpoöeäópû. Bìecòo ýòoão, ïoìecòèòe
â caìoe ía÷aëo ìeòêó, âpoäe START, è çaâepøèòe ïpoãpaììó oïepaòopoì END
START.
   2. Ïoìecòèòe â ía÷aëe ïpoãpaììû oïepaòop ORG 100H.  Ýòoò oïepa-  òop
óêaçûâaeò ía÷aëo êoäa (ò.e.  ócòaíaâëèâaeò c÷eò÷èê êoììaíä).  Ïpoãpaììû
COM ía÷èíaþòcÿ c 100H,  ÷òo ÿâëÿeòcÿ ïepâûì áaéòoì,  cëeäóþùèì ça  PSP,
ïocêoëüêó CS óêaçûâaeò ía ía÷aëo PSP,  êoòopoe pacïoëoæeío ía 100H áaéò
íèæe. Äëÿ òoão ÷òoáû ía÷aòü âûïoëíeíèe c ëþáoão äpóãoão ìecòa ïoìecòèòe
ïo aäpecó 100H èícòpóêöèþ JMP.
   3. Oïepaòop ASSUME äoëæeí ócòaíaâëèâaòü DS,  ES è SS òaêèì  oápaçoì,
÷òoáû  oíè  coâïaäaëè  co  çía÷eíèeì  äëÿ êoäoâoão ceãìeíòa,  íaïpèìep,
ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG.
   4. Äaííûe ïpoãpaììû ìoãóò ïoìeùaòücÿ â ëþáoì ìecòe ïpoãpaììû, äo òex
ïop, ïoêa oíè íe ïepeìeøaíû c êoäoì. Ëó÷øe ía÷èíaòü ïpoãpaììû c oáëacòè
äaííûx,  ïocêoëüêó  ìaêpoacceìáëep  ìoæeò âûäaâaòü cooáùeíèÿ oá oøèáêax
ïpè ïepâoì  ïpoxoäe,  ecëè  èìeþòcÿ  ccûëêè  ía  èäeíòèôèêaòop  äaííûx,
êoòopûé  eùe  íe  oáíapóæeí.  Äëÿ  ïepexoäa ê ía÷aëó êoäa ècïoëüçóéòe â
êa÷ecòâe ïepâoé êoìaíäû ïpoãpaììû èícòpóêöèþ JMP.
   5. Heëüçÿ  ècïoëüçoâaòü ôèêcaöèþ ceãìeíòoâ òèïa MOV AX,SEG NEW_DATA.
Äocòaòo÷ío óêaçaíèÿ oäíoão cìeùeíèÿ ìeòêè.  B ÷acòíocòè, íóæío oïócêaòü
oáû÷íûé  êoä,  ècïoëüçóeìûé  â  ía÷aëe ïpoãpaììû äëÿ ócòaíoâêè ceãìeíòa
äaííûx, MOV AX,DSEG / MOV DS,AX.
   6. Còeêoâûé ceãìeíò ïoëíocòüþ oïócêaeòcÿ â ía÷aëüíoì êoäe. Óêaçaòeëü
còeêa èíèöèaëèçèpóeòcÿ ía âepøèíó aäpecíoão ïpocòpaícòâa  64K,  ècïoëü-
çóeìoão  ïpoãpaììoé  (íaïoìèíaeì,  ÷òo  còeê  pacòeò âíèç â ïaìÿòè).  B
ïpoãpaììax COM oí äoëæeí áûòü cäeëaí ìeíüøe ÷eì 64K, SS è SP ìoãóò áûòü
èçìeíeíû. Èìeéòe ââèäó, ÷òo ïpè êoìïoíoâêe ïpoãpaììû êoìïoíoâùèê âûäacò
cooáùeíèe  oá  oøèáêe,  óêaçûâaþùee,  ÷òo  ceãìeíò  còeêa  oòcóòcòâóeò.
Èãíopèpóéòe eão.
   7. Çaâepøèòe ïpoãpaììó ëèáo èícòpóêöèeé RET,  ëèáo ïpepûâaíèeì  20H.
Ïpepûâaíèe  20H  -  ýòo  còaíäapòíaÿ ôóíêöèÿ äëÿ çaâepøeíèÿ ïpoãpaììû è
âoçâpaòa óïpaâëeíèÿ â DOS.  Äaæe êoãäa ïpoãpaììa ça- âepøaeòcÿ èícòpóê-
öèeé  RET,  ía  caìoì äeëe ècïoëüçóeòcÿ ïpepûâaíèe 20H.  Ýòo ïpoècxoäèò
ïoòoìó,  ÷òo âepøèía còeêa ïepâoía÷aëüío co- äepæèò 0.  Ïpè  âûïoëíeíèè
çaâepøaþùeé   èícòpóêöèè  ïpoãpaììû  RET,  0  âûòaëêèâaeòcÿ  èç  còeêa,

                                     - 9 -
ïepeíaçía÷aÿ c÷eò÷èê êoìaíä ía ía÷aëo PSP.  Haxoäÿùaÿcÿ â  ýòoé  ÿ÷eéêe
ôóíêöèÿ 20H,  âûïoëíÿeòcÿ êaê cëe- äóþùaÿ èícòpóêöèÿ ïpoãpaììû, âûçûâaÿ
ïepeäa÷ó óïpaâëeíèÿ â DOS. Bce ýòo oçía÷aeò, ÷òo Baì íe íaäo ïpè còapòe
ïpoãpaììû  ïoìeùaòü ía còeê DS è 0 (PUSH DS / MOV AX,0 / PUSH AX),  êaê
ýòo òpeáóeòcÿ äëÿ EXE ôaéëoâ.
   Ïocëe òoão   êaê   ïpoãpaììa   cêoícòpóèpoâaía  òaêèì  oápaçoì,  ac-
ceìáëèpóéòe è êoìïoíóéòe ee êaê oáû÷ío.  Çaòeì ïpeoápaçóéòe ee â  ôopìó
COM c ïoìoùüþ óòèëèòû EXE2BIN,  èìeþùeécÿ â MS DOS. Ecëè èìÿ ïpoãpaììû,
ïocòpoeííoé êoìïoíoâùèêoì MYPROG.EXE, òo ïpocòo ââeäèòe êoìaíäó EXE2BIN
MYPROG.  B peçóëüòaòe Bû ïoëó÷èòe ïpoãpaììíûé ôaéë c èìeíeì MYPROG.BIN.
Bce ÷òo Baì ocòaíeòcÿ ïocëe ýòoão cäe- ëaòü - ïepeèìeíoâaòü ýòoò ôaéë â
MYPROG.COM.  Bû  ìoæeòe òaêæe cpaçó ècïoëüçoâaòü êoìaíäó EXE2BIN MYPROG
MYPROG.COM, äëÿ ïoëó÷e- íèÿ ôaéëa c pacøèpeíèeì COM.

   Hèçêèé ópoâeíü.

   B äaííoì ïpèìepe coäepæèòcÿ ïoëíaÿ êopoòêaÿ  ïpoãpaììa,  êoòopaÿ  ïo
ócòaíoâêe  ïepeêëþ÷aòeëeé  oïpeäeëÿeò êoëè÷ecòâo íaêoïèòeëeé â ìaøèíe è
çaòeì âûâoäèò cooáùeíèe ía ýêpaí.  Oía ìoæeò cëóæèòü ïpèìepoì  êopoòêoé
óòèëèòû òoão copòa, äëÿ êoòopûx ôopìaò COM èäeaëeí. CSEG SEGMENT
              ORG 100H
              ASSUME CS:CSEG, DS:CSEG, SS:CSEG
;---äaííûe
START:        JMP  SHORT BEGIN  ;ïepexoä ê êoäó
MESSAGE1      DB   'The dip switches are set for $'
MESSAGE2      DB   'disk drive(s).$'
;---ïe÷aòü ïepâoé ÷acòè cooáùeíèÿ
BEGIN:        MOV  AH,9    ;ôóíêöèÿ 9 ïpepûâaíèÿ 21H - âûâoä
              MOV  DX,OFFSET MESSAGE1  ;còpoêè
              INT  21H     ;âûâoäèì còpoêó
              PUSH AX      ;coxpaíÿeì íoìep ôóíêöèè ía áóäóùee
;---ïoëó÷aeì ócòaíoâêó ïepeêëþ÷aòeëeé èç ïopòa A ìèêpocxeìû 8255
              IN   AL,61H  ;ïoëó÷aeì áaéò èç ïopòa B
              OR   AL,10000000B  ;ócòaíaâëèâaeì áèò 7
              OUT  61H,AL        ;çaìeíÿeì áaéò
              IN   AL,60H        ;ïoëó÷aeì ócòaíoâêó ïepeêëþ÷aò.
              AND  AL,11000000B  ;âûäeëÿeì còapøèe 2 áèòa
              MOV  CL,6          ;ïoäãoòoâêa ê cäâèãó AL âïpaâo
              SHR  AL,CL         ;cäâèãaeì 2 áèòa â ía÷aëo
              ADD  AL,49         ;äoáaâëÿeì 1, ÷òoáû c÷èòaòü c 1
                                 ;è 48 äëÿ ïepeâoäa â ASCII
              MOV  DL,AL         ;ïoìeùaeì peçóëüòaò â DL
              MOV  AL,61H        ;äoëæíû âoccòaíoâèòü ïopò B
              AND  AL,01111111B  ;cápacûâaeì áèò 7
              OUT  61H,AL        ;âoçâpaùaeì áaéò
;---ïe÷aòü ÷ècëa íaêoïèòeëeé
              MOV  AH,2          ;ôóíêöèÿ 2 ïpepûâaíèÿ 21H
              INT  21H           ;ïe÷aòaeì ÷ècëo èç DL
;---ïe÷aòü âòopoé ïoëoâèíû cooáùeíèÿ
              POP  AX            ;áepeì íoìep ôóíêöèè co còeêa
              MOV  DX,OFFSET MESSAGE2
              INT  21H           ;âûâoäèì còpoêó
              INT  20H           ;çaâepøeíèe ïpoãpaììû
CSEG          ENDS
              END START
[ Íàçàä | Îãëàâëåíèå | Äàëåå ]










helloworld.ru © 2001-2021
Âñå ïðàâà çàùèùåíû