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