net. Imejte vvidu, chto ustanovka pereklyuchatelej mozhet byt' nevernoj, chto ogranichivaet dostovernost' takogo podhoda. Dlya opredeleniya chisla 16-bajtnyh paragrafov, dostupnyh dlya DOS, ispol'zujte funkciyu 4AH preryvaniya 21H. ES dolzhen imet' to zhe znachenie, chto pri starte zadachi: ;---opredelenie chisla paragrafov dostupnyh dlya DOS MOV AH,4AH ;ukazyvaem nuzhnuyu funkciyu MOV BX,0FFFFH ;trebuem slishkom bol'shuyu pamyat' INT 21H ;BX soderzhit chislo dostupnyh paragrafov AT ispol'zuet funkciyu 88H preryvaniya 15H dlya proverki nalichiya rasshirennoj pamyati, kotoraya ishchet pamyat' vne adresnogo prostranst- va processora v obychnom rezhime adresacii. Govoryat, chto ona ishchet pamyat' za otmetkoj 1 megabajta. Pri etom na sistemnoj plate dol- zhno byt' ot 512 do 640 kilobajt pamyati, chtoby eta funkciya rabo- tala. CHislo kilobajtnyh blokov rasshirennoj pamyati vozvrashchaetsya v AX. Nizkij uroven'. Pervyj primer proveryaet chislo bankov pamyati po 64K v pervyh desyati 64-kilobajtnyh segmentah pamyati. Esli Vy budete proveryat' starshie 6 bankov pamyati, to imejte vvidu, chto imeyutsya videobufer, nachinaya s B000:0000 (i, vozmozhno, A000:0000) i PZU, nachinaya s F000:0000 (i, vozmozhno, C000:0000). ;---proverka kazhdogo banka pamyati: CLI ;zapret apparatnyh preryvanij MOV AX,CS ;poluchaem znachenie kodovogo segmenta AND AX,0FFFH ;sbrasyvaem starshie 4 bita MOV ES,AX ;pomeshchaem ukazatel' v ES MOV DI,0 ;DI schitaet chislo bankov pamyati MOV CX,10 ;budem proveryat' 10 bankov MOV BL,'X' ;dlya proverki ispol'zuem 'X' NEXT: MOV DL,ES:[0] ;sohranyaem znachenie testiruemoj yachejki MOV ES:[0],BL ;pomeshchaem 'X' v etu yachejku MOV DH,ES:[0] ;chitaem testiruemuyu yachejku MOV ES:[0],DL ;vosstanavlivaem znachenie CMP DH,'X' ;sovpadaet s tem, chto pisali? JNE GO_AHEAD ;esli net, to bank otsutstvuet INC DI ;uvelichivaem chislo bankov GO_AHEAD: MOV AX,ES ;gotovim uvelichenie ukazatelya ADD AX,1000H ;ukazyvaem na sleduyushchie 64K MOV ES,AX ;vozvrashchaem ukazatel' v ES LOOP NEXT ;obrabatyvaem sleduyushchij bank STI ;razreshaem apparatnye preryvaniya Razdel 2. Upravlenie preryvaniyami. Preryvaniya eto gotovye procedury, kotorye komp'yuter vyzyvaet dlya vypolneniya opredelennoj zadachi. Sushchestvuyut apparatnye i prog- rammnye preryvaniya. Apparatnye preryvaniya iniciiruyutsya apparatu- roj, libo s sistemnoj platy, libo s karty rasshireniya. Oni mogut byt' vyzvany signalom mikroshemy tajmera, signalom ot printera, nazhatiem klavishi na klaviature i mnozhestvom drugih prichin. Appa- ratnye preryvaniya ne koordiniruyutsya s rabotoj programmnogo obes- pecheniya. Kogda vyzyvaetsya preryvanie, to processor ostavlyaet svoyu rabotu, vypolnyaet preryvanie, a zatem vozvrashchaetsya na prezhnee mesto. Dlya togo chtoby imet' vozmozhnost' vernut'sya tochno v nuzhnoe mesto programmy, adres etogo mesta (CS:IP) zapominaetsya na steke, vmeste s registrom flagov. Zatem v CS:IP zagruzhaetsya adres prog- rammy obrabotki preryvaniya i ej peredaetsya upravlenie. Programmy obrabotki preryvanij inogda nazyvayut drajverami preryvanij. Oni vsegda zavershayutsya instrukciej IRET (vozvrat iz preryvaniya), kotoraya zavershaet process, nachatyj preryvaniem, vozvrashchaya starye znacheniya CS:IP i registra flagov, tem samym davaya programme voz- mozhnost' prodolzhit' vypolnenie iz togo zhe sostoyaniya. S drugoj storony, programmnye preryvaniya na samom dele nichego ne preryvayut. Na samom dele eto obychnye procedury, kotorye vyzy- vayutsya Vashimi programmami dlya vypolneniya rutinnoj raboty, takoj kak priem nazhatiya klavishi na klaviature ili vyvod na ekran. Odna- ko eti podprogrammy soderzhatsya ne vnutri Vashej programmy, a v operacionnoj sisteme i mehanizm preryvanij daet Vam vozmozhnost' obratit'sya k nim. Programmnye preryvaniya mogut vyzyvat'sya drug iz druga. Naprimer, vse preryvaniya obrabotki vvoda s klaviatury DOS ispol'zuyut preryvaniya obrabotki vvoda s klaviatury BIOS dlya polu- cheniya simvola iz bufera klaviatury. Otmetim, chto apparatnoe pre- ryvaenie mozhet poluchit' upravlenie pri vypolnenii programmnogo preryvaniya. Pri etom ne voznikaet konfliktov, tak kak kazhdaya podprogramma obrabotki preryvaniya sohranyaet znacheniya vseh ispol'- zuemyh eyu registrov i zatem vosstanavlivaet ih pri vyhode, tem samym ne ostavlyaya sledov togo, chto ona zanimala processor. Adresa programm preryvanij nazyvayut vektorami. Kazhdyj vektor imeet dlinu chetyre bajta. V pervom slove hranitsya znachenie IP, a vo vtorom - CS. Mladshie 1024 bajt pamyati soderzhat vektora prery- vanij, takim obrazom imeetsya mesto dlya 256 vektorov. Vmeste vzya- tye oni nazyvayutsya tablicej vektorov. Vektor dlya preryvaniya 0 nachinaetsya s yachejki 0000:0000, preryvaniya 1 - s 0000:0004, 2 - s 0000:0008 i t.d. Esli posmotret' na chetyre bajta, nachinaya s adre- sa 0000:0020, v kotoryh soderzhitsya vektor preryvaniya 8H (preryva- nie vremeni sutok), to Vy obnaruzhite tam A5FE00F0. Imeya vvidu, chto mladshij bajt slova raspolozhen snachala i chto poryadok IP:CS, eto 4-bajtnoe znachenie perevoditsya v F000:FEA5. |to startovyj adres programmy PZU, vypolnyayushchej preryvanie 8H. Na ris. 1-2 poka- zana shema vypolneniya programmoj preryvaniya 21H. 1.2.1 Programmirovanie kontrollera preryvanij 8259. Dlya upravleniya apparatnymi preryvaniyami vo vseh tipah IBM PC ispol'zuetsya mikroshema programmiruemogo kontrollera preryvanij Intel 8259. Poskol'ku v kkazhdyj moment vremeni mozhet postupit' ne odin zapros, mikroshema imeet shemu prioritetov. Imeetsya 8 urov- nej prioritetov, krome AT, u kotorogo ih 16, i obrashcheniya k soot- vetstvuyushchim urovnyam oboznachayutsya sokrashcheniyami ot IRQ0 do IRQ7 (ot IRQ0 do IRQ15), chto oznachaet zapros na preryvanie. Maksimal'nyj prioritet sootvetstvuet urovnyu 0. Dobavochnye 8 urovnej dlya AT obrabatyvayutsya vtoroj mikroshemoj 8259; etot vtoroj nabor urovnej imeet prioritet mezhdu IRQ2 i IRQ3. Zaprosy na preryvanie 0-7 sootvetstvuyut vektoram preryvanij ot 8H do 0FH; dlya AT zaprosy na preryvaniya 8-15 obsluzhivayutsya vektorami ot 70H do 77H. Nizhe pri- vedeny naznacheniya etih preryvanij: Apparatnye preryvaniya v poryadke prioriteta. IRQ 0 tajmer 1 klaviatura 2 kanal vvoda/vyvoda 8 chasy real'nogo vremeni (tol'ko AT) 9 programmno perevodyatsya v IRQ2 (tol'ko AT) 10 rezerv 11 rezerv 12 rezerv 13 mat. soprocessor (tol'ko AT) 14 kontroller fiksirovannogo diska (tol'ko AT) 15 rezerv 3 COM1 (COM2 dlya AT) 4 COM2 (modem dlya PCjr, COM1 dlya AT) 5 fiksirovannyj disk (LPT2 dlya AT) 6 kontroller disket 7 LPT1 Preryvaniyu vremeni sutok [2.1.0] dan maksimal'nyj prioritet, poskol'ku esli ono budet postoyanno teryat'sya, to budut nevernymi pokazaniya sistemnyh chasov. Preryvanie ot klaviatury [3.1.0] vyzy- vaetsya pri nazhatii ili otpuskanii klavishi; ono vyzyvaet cep' sobytij, kotoraya obychno zakanchivaetsya tem, chto kod klavishi pome- shchaetsya v bufer klaviatury (otkuda on zatem mozhet byt' poluchen programmnymi preryvaniyami). Mikroshema 8259 imeet tri odnobajtnyh registra, kotorye uprav- lyayut vosem'yu liniyami apparatnyh preryvanij. Registr zaprosa na preryvanie (IRR) ustanavlivaet sootvetstvuyushchij bit, kogda liniya preryvaniya signaliziruet o zaprose. Zatem mikroshema avtomatiches- ki proveryaet ne obrabatyvaetsya li drugoe preryvanie. Pri etom ona zaprashivaet informaciyu registra obsluzhivaniya (ISR). Dopolnitel'- naya cep' otvechaet za shemu prioritetov. Nakonec, pered vyzovom preryvaniya, proveryaetsya registr maski preryvanij (IMR), chtoby uznat' razresheno li v dannyj moment preryvanie dannogo urovnya. Kak pravilo programmisty obrashchayutsya tol'ko k registru maski pre- ryvanij cherez port 21H [1.2.2] i komandnomu registru preryvanij cherez port 20H [1.2.3]. 1.2.2 Zapret/razreshenie otdel'nyh apparatnyh preryvanij. Programmy na aasemblere mogut zapretit' apparatnye preryvaniya, perechislennye v [1.2.1]. |to maskiruemye preryvaniya; drugie appa- ratnye preryvaniya, voznikayushchie pri nekotoryh oshibkah (takih kak delenie na nol') ne mogut byt' maskirovany. Imeyutsya dve prichiny dlya zapreta apparatnyh preryvanij. V pervom sluchae vse preryvaniya blokiruyutsya s tem chtoby kriticheskaya chast' koda byla vypolnena celikom, prezhde chem mashina proizvedet kakoe-libo drugoe dejstvie. Naprimer, preryvaniya zapreshchayut pri izmenenii vektora apparatnogo preryvaniya, izbegaya vypolneniya preryvaniya kogda vektor izmenen tol'ko napolovinu. Vo vtorom sluchae maskiruyutsya tol'ko opredelennye apparatnye preryvaniya. |to delaetsya kogda nekotorye opredelennye preryvaniya mogut vzaimodejstvovat' s operaciyami, kritichnymi k vremenam. Naprimer, tochno rasschitannaya po vremeni procedura vvoda/vyvoda ne mozhet sebe pozvolit' byt' prervannoj dlitel'nym diskovym preryva- niem. Nizkij uroven'. Vypolnenie preryvanij zavisit ot znacheniya flaga preryvaniya (bit 9) v registre flagov. Kogda etot bit raven 0, to razresheny vse preryvaniya, kotorye razreshaet maska. Kogda on raven 1, to vse apparatnye preryvaniya zapreshcheny. CHtoby zapretit' preryvaniya, ustanoviv etot flag v 1, ispol'zuetsya instrukciya CLI. Dlya ochistki etogo flaga i vosstanovleniya preryvanij - instrukciya STI. Izbe- gajte otklyucheniya preryvanij na dlitel'nyj period. Preryvanie vremeni sutok proishodit 18.2 raza v sekundu i esli k etomu pre- ryvaniyu byl bolee chem odin zapros v to vremya, kogda apparatnye preryvaniya byli zapreshcheny, to lishnie zaprosy budut otbrosheny i sistemnoe vremya budet opredelyat'sya nepravil'no. Imejte vvidu, chto mashina avtomaticheski zapreshchaet apparatnye preryvaniya pri vyzove programmnyh preryvanij i avtomaticheski razreshaet ih pri vozvrate. Kogda Vy pishete svoi programmnye pre- ryvaniya, to Vy mozhete nachat' programmu s instrukcii STI, esli Vy mozhete dopustit' apparatnye preryvaniya. Otmetim takzhe, chto esli za instrukciej CLI ne sleduet STI, to eto privedet k ostanovke mashiny, tak kak vvod s klaviatury budet zamorozhen. Dlya maskirovaniya opredelennyh apparatnyh preryvanij nuzhno prosto poslat' trebuemuyu cepochku bitov v port s adresom 21H, kotoryj sootvetstvuet registru maski preryvanij (IMR). Registr maski na vtoroj mikrosheme 8259 dlya AT (IRQ8-15) imeet adres porta A1H. Ustanovite te bity registra, kotorye sootvetstvuyut nomeram preryvanij, kotorye Vy hotite maskirovat'. |tot registr mozhno tol'ko zapisyvat'. Nizheprivedennyj primer blokiruet disko- voe preryvanie. Ne zabud'te ochistit' registr v konce programmy, inache obrashchenie k diskam budet zapreshcheno i posle zaversheniya prog- rammy. ;---maskirovanie 6-go bita registra maski preryvanij MOV AL,01000000B ;maskiruem bit 6 OUT 21H,AL ;posylaem v registr maski preryvanij . MOV AL,0 ; OUT 21H,AL ;ochishchaem IMR v konce programmy 1.2.3 Napisanie sobstvennogo preryvaniya. Imeetsya neskol'ko prichin dlya napisaniya sobstvennogo preryva- niya. Vo-pervyh, bol'shinstvo iz gotovyh preryvanij, obespechivaemyh operacionnoj sistemoj, nichto inoe, kak obychnye procedury, dostup- nye dlya vseh programm, i Vy mozhete pozhelat' dobavit' svoe v etu biblioteku. Naprimer, mnogie Vashi programmy mogut ispol'zovat' proceduru, vyvodyashchuyu stroki na ekran vertikal'no. Vmesto togo, chtoby vklyuchat' ee v kazhduyu programmu v kachestve procedury Vy mozhete ustanovit' ee kak preryvanie, napisav programmu, kotoraya ostanetsya rezidentnoj v pamyati posle zaversheniya [1.3.4]. Togda Vy mozhete ispol'zovat' INT 80H vmesto WRITE_VERTICALLY (imejte vvi- du, chto vyzov preryvaniya neskol'ko medlennej, chem vyzov procedu- ry). Vtoroj prichinoj napisaniya preryvaniya mozhet byt' ispol'zovanie kakogo-libo otdel'nogo apparatnogo preryvaniya. |to preryvanie avtomaticheski vyzyvaetsya pri vozniknovenii opredelennyh uslovij. V nekotoryh sluchayah BIOS inicializiruet vektor etogo preryvaniya tak, chto on ukazyvaet na proceduru, kotoraya voobshche nichego ne delaet (ona soderzhit odin operator IRET). Vy mozhete napisat' svoyu proceduru i izmenit' vektor preryvanij, chtoby on ukazyval na nee. Togda pri vozniknovenii apparatnogo preryvaniya budet vypolnyat'sya Vasha procedura. Odna iz takih procedur eto preryvanie vremeni sutok [2.1.0], kotoroe avtomaticheski vyzyvaetsya 18.2 raza v se- kundu. Obychno eto preryvanie tol'ko obnovlyaet pokazanie chasov, no Vy mozhete dobavit' k nemu lyuboj kod, kotoryj Vy pozhelaete. Esli Vash kod proveryaet pokazaniya chasov i vstupaet v igru v opredelen- nye momenty vremeni, to vozmozhny operacii v real'nom vremeni. Drugie vozmozhnosti - eto napisanie procedur obrabotki Ctrl-Break [3.2.8], PrtSC [3.2.9] i vozniknoveniya oshibochnyh situacij [7.2.5]. Preryvaniya printera [6.3.1] i kommunikacionnye [7.1.8] pozvolyayut komp'yuteru bystro pereklyuchat'sya mezhdu operaciyami vvo- da/vyvoda i drugoj obrabotkoj. Nakonec, Vy mozhete zahotet' napisat' preryvanie, kotoroe pol- nost'yu zamenit odnu iz procedur operacionnoj sistemy, prisposob- lennoe k Vashim programmnym nuzhdam. V [1.2.4] pokazano kak napi- sat' preryvanie vnutri preryvaniya, kotoroe pozvolyaet Vam modifi- cirovat' sushchestvuyushchie procedury. Srednij uroven'. Funkciya 25H preryvaniya 21H ustanavlivaet vektor preryvaniya na ukazannyj adres. Adresa imeyut razmer dva slova. Starshee slovo soderzhit znachenie segmenta (CS), mladshee soderzhit smeshchenie (IP). CHtoby ustanovit' vektor, ukazyvayushchim na odnu iz Vashih procedur, nuzhno pomestit' segment procedury v DS, a smeshchenie v DX (sleduya poryadku nizheprivedennogo primera). Zatem pomestite nomer preryva- niya v AL i vyzovite funkciyu. Lyubaya procedura preryvaniya dolzhna zavershat'sya ne obychnoj instrukciej RET, a IRET. (IRET vytalkivaet iz steka tri slova, vklyuchaya registr flagov, v to vremya kak RET pomeshchaet na stek tol'ko dva. Esli Vy popytaetes' testirovat' takuyu proceduru kak obychnuyu proceduru, no konchayushchuyusya IRET, to Vy ischerpaete stek.) Otmetim, chto funkciya 25H avtomaticheski zapre- shchaet apparatnye preryvaniya v processe izmeneniya vektora, poetomu ne sushchestvuet opasnosti, chto posredi dorogi proizojdet apparatnoe preryvanie, ispol'zuyushchee dannyj vektor. ;---ustanovka preryvaniya PUSH DS ;sohranyaem DS MOV DX,OFFSET ROUT ;smeshchenie dlya procedury v DX MOV AX,SEG ROUT ;segment procedury MOV DS,AX ;pomeshchaem v DS MOV AH,25H ;funkciya ustanovki vektora MOV AL,60H ;nomer vektora INT 21H ;menyaem preryvanie POP DS ;vosstanavlivaem DS ;---procedura preryvaniya ROUT PROC FAR PUSH AX ;sohranyaem vse izmenyaemye registry . . POP AX ;vosstanavlivaem registry MOV AL,20H ;eti dve stroki nado ispol'zovat' OUT 20H,AL ;tol'ko dlya apparatnyh preryvanij IRET ROUT ENDP V konce koda kazhdogo iz Vashih apparatnyh preryvanij Vy dolzhny vklyuchit' sleduyushchie 2 strochki koda: MOV AL,20H OUT 20H,AL |to prosto sovpadenie, chto chisla (20H) odni i te zhe v obeih strokah. Esli apparatnoe preryvanie ne zakanchivaetsya etimi stro- kami, to mikroshema 8259 ne ochistit informaciyu registra obsluzhi- vaniya, s tem chtoby byla razreshena obrabotka preryvanij s bolee nizkimi urovnyami, chem tol'ko chto obrabotannoe. Otsutstvie etih strok legko mozhet privesti k krahu programmy, tak kak preryvaniya ot klaviatury skoree vsego okazhutsya zamorozhennymi i dazhe Ctrl-Alt-Del okazhetsya bespoleznym. Otmetim, chto eta dobavka ne nuzhna dlya teh vektorov preryvanij, kotorye yavlyayutsya rasshireniyami sushchestvuyushchih preryvanij, takim kak preryvanie 1CH, kotoroe dobav- lyaet kod k preryvaniyu vremeni sutok [2.1.7]. Kogda programma zavershaetsya, dolzhny byt' vosstanovleny origi- nal'nye vektora preryvanij. V protivnom sluchae posleduyushchaya prog- ramma mozhet vyzvat' dannoe preryvanie i peredat' upravlenie na to mesto v pamyati, v kotorom Vashej procedury uzhe net. Funkciya 35 preryvaniya 21H vozvrashchaet tekushchee znachenie vektora preryvaniya, pomeshchaya znachenie segmenta v ES, a smeshchenie v BX. Pered ustanovkoj svoego preryvaniya poluchite tekushchee znachenie vektora, ispol'zuya etu funkciyu, sohranite eti znacheniya, i zatem vosstanovite ih s pomoshch'yu funkcii 25H (kak vyshe) pered zaversheniem svoej programmy. Naprimer: ;---v segmente dannyh: KEEP_CS DW 0 ;hranit segment zamenyaemogo preryvaniya KEEP_IP DW 0 ;hranit smeshchenie preryvaniya ;---v nachale programmy MOV AH,25H ;funkciya polucheniya vektora MOV AL,1CH ;nomer vektora INT 21H ;teper' segment v ES, smeshchenie v BX MOV KEEP_IP,BX ;zapominaem smeshchenie MOV KEEP_CS,ES ;zapominaem segment ; ---v konce programmy CLI PUSH DS ;DS budet razrushen MOV DX,KEEP_IP ;podgotovka k vosstanovleniyu MOV AX,KEEP_CS ; MOV DS,AX ;podgotovka k vosstanovleniyu MOV AH,25H ;funkciya ustanovki vektora MOV AL,1CH ;nomer vektora INT 21H ;vosstanavlivaem vektor POP DS ;vosstanavlivaem DS STI Imeetsya para lovushek, kotoryh sleduet izbegat' pri napisanii preryvaniya. Esli novaya procedura preryvaniya dolzhna imet' dostup k dannym, to neobhodimo pozabotit'sya, chtoby DS byl pravil'no usta- novlen (obychno preryvanie mozhet ispol'zovat' stek vyzyvayushchej programmy). Drugaya nepriyatnost' mozhet zaklyuchat'sya v tom, chto pri zavershenii programmy po Ctrl-Break vektor preryvaniya ne budet vosstanovlen, esli tol'ko Vy ne predusmotrite, chtoby programma reakcii na Ctrl-Break vypolnyala etu proceduru [3.2.8]. Nizkij uroven'. Opisannye vyshe funkcii MS DOS prosto poluchayut ili izmenyayut paru slov v mladshih yachejkah pamyati. Smeshchenie vektora mozhet byt' vychisleno prostym umnozheniem nomera vektora na 4. Naprimer, chtoby poluchit' adres preryvaniya 16H v ES:BX: ;---poluchenie adresa preryvaniya 16H SUB AX,AX ;ustanavlivaem ES na nachalo pamyati MOV ES,AX ; MOV DI,16H ;nomer preryvaniya v DI SHL DI,1 ;umnozhaem na 2 SHL DI,1 ;umnozhaem na 2 MOV BX,ES:[DI] ;berem mladshij bajt v BX MOV AX,ES:[DI]+2 ;berem starshij bajt v ES MOV ES,AX ; Ne rekomenduetsya pryamo ustanavlivat' vektor preryvanij, obhodya funkciyu DOS. V chastnosti v mnogozadachnoj srede operacionnaya sis- tema mozhet podderzhivat' neskol'ko tablic vektorov preryvanij i real'nyj fizicheskij adres tablicy mozhet byt' izvesten tol'ko DOS. 1.2.4 Dopolnenie k sushchestvuyushchemu preryvaniyu. Hotya i ne chasto, no inogda byvaet polezno dobavit' kod k su- shchestvuyushchemu preryvaniyu. V kachestve primera rassmotrim programmy, kotorye preobrazuyut odno nazhatie klavishi v dlinnye opredelyaemye pol'zovatelem simvol'nye stroki (makroopredeleniya klaviatury). |ti programmy ispol'zuyut fakt, chto ves' vvod s klaviatury postu- paet postupaet cherez funkciyu 0 preryvaniya 16H BIOS [3.1.3]. Vse preryvaniya vvoda s klaviatury DOS vyzyvayut preryvanie BIOS dlya polucheniya simvola iz bufera klaviatury. Poetomu neobhodimo modi- ficirovat' lish' preryvanie 16H, takim obrazom, chtoby ono sluzhilo shlagbaumom dlya makroopredelenij, posle chego lyubaya programma budet poluchat' makroopredeleniya, nezavisimo ot togo, kakoe preryvanie vvoda s klaviatury ona ispol'zuet. Konechno, modificirovat' preryvaniya BIOS i DOS neprosto, pos- kol'ku BIOS raspolozhena v PZU, a DOS postupaet bez listinga i oni ogranicheny razmerami otvedennoj dlya nih pamyati. No Vy mozhete napisat' proceduru, kotoraya predshestvuet i/ili sleduet za soot- vetstvuyushchim preryvaniem, i eta procedura mozhet vyzyvat'sya pri vyzove preryvaniya DOS ili BIOS. Naprimer, v sluchae preryvaniya 16H, Vam nuzhno napisat' proceduru i ukazat' na nee vektorom pre- ryvaniya dlya 16H. Original'noe znachenie vektora 16H tem vremenem perenositsya v kakoj-libo neispol'zuemyj vektor, skazhem, 60H. Novaya procedura prosto vyzyvaet preryvanie 60H, chtoby ispol'zo- vat' original'noe preryvanie 16H; poetomu kogda programma vyzy- vaet preryvanie 16H, upravlenie peredaetsya Vashej procedure, koto- raya zatem vyzyvaet original'noe preryvanie 16H, kotoraya po zaver- shenii opyat' vozvrashchaet upravlenie Vashej procedure, a iz nee uzhe Vy vozvrashchaetes' v to mesto programmy, iz kotorogo byl vyzov preryvaniya 16H. Posle togo kak eto sdelano, v novoj procedure mozhet soderzhat'sya lyuboj kod, kak do, tak i posle vyzova preryva- niya 60H. Na ris. 1-3 pokazana diagramma etoj procedury. Vot krat- kaya svodka neobhodimyh dejstvij: 1. Sozdat' novuyu proceduru, vyzyvayushchuyu preryvanie 60H. 2. Perenesti vektor preryvaniya dlya 16H v 60H. 3. Izmenit' vektor 16H, chtoby on ukazyval na novuyu proceduru. 4. Zavershit' programmu, ostavlyaya ee rezidentnoj [1.3.4]. Razdel 3. Upravlenie programmami. Bol'shinstvo programm zagruzhayutsya v pamyat', zapuskayutsya, a zatem udalyayutsya operacionnoj sistemoj pri zavershenii. YAzyki vyso- kogo urovnya obychno ne imeyut al'ternativy. No dlya programmistov na assemblere imeetsya drugaya vozmozhnost' i dannyj razdel demonstri- ruet ee. Nekotorye programmy dejstvuyut kak drajvery ustrojstv ili drajvery preryvanij i oni dolzhny byt' sohraneny v pamyati ("rezidentnymi") dazhe posle ih zaversheniya (vektora preryvanij obespechivayut mehanizm, posredstvom kotorogo posleduyushchie programmy mogut obrashchat'sya k rezidentnym proceduram). Inogda programme neobhodimo zapustit' iz sebya druguyu programmu. Na samom dele DOS pozvolyaet programme zagruzit' v pamyat' vtoruyu kopiyu COMMAND.COM, kotoraya mozhet ispol'zovana kak sredstvo interfejsa s pol'zovate- lem ili vypolneniya komand tipa COPY ili DIR. Programmy mogut byt' v dvuh formatah: .EXE ili .COM. Programmy pervogo tipa mogut byt' bol'she 64K, no oni trebuyut nekotoroj obrabotki pered tem, kak DOS zagruzit ih v pamyat'. S drugoj sto- rony COM programmy sushchestvuyut pryamo v tom formate, kotoryj nuzhen dlya zagruzki v pamyat'. COM programmy osobenno polezny dlya korot- kih utilit. V oboih sluchayah kod, sostavlyayushchij programmu, predva- ryaetsya v pamyati prefiksom programmnogo segmenta (PSP). |to ob- last' razmerom 100H bajt, kotoraya soderzhit informaciyu neobhodimuyu DOS dlya raboty programmy; PSP takzhe obespechivaet mesto dlya fajlo- vyh operacij vvoda/vyvoda [5.3.5]. Pri zagruzke EXE fajla i DS i ES ukazyvayut na PSP. Dlya COM fajlov CS takzhe snachala ukazyvaet na PSP. Otmetim, chto MS DOS 3.0 imeet funkciyu, kotoraya vozvrashchaet nomer segmenta PSP. |to funkciya 62H preryvaniya 21H; ej nichego ne nado podavat' na vhode, a v BX vozvrashchaetsya nomer paragrafa. Odna iz prichin, po kotoroj interesno polozhenie PSP, sostoit v tom, chto ego pervoe slovo soderzhit nomer preryvaniya DOS, kotoroe budet privodit' k zaversheniyu programmy. Kogda vypolnyaetsya posled- nij operator RET programmy, to znacheniya na vershine steka ukazy- vayut schetchiku komand (registr IP) na nachalo PSP, takim obrazom kod zaversheniya vypolnyaetsya kak sleduyushchaya instrukciya programmy. Dal'nejshee obsuzhdenie etogo smotrite v punktah [1.3.4] i [1.3.6]. Dlya spravki privodim znachenie polej PSP: Smeshchenie Razmer polya Znachenie 0H DW nomer funkcii DOS zaversheniya programmy 2H DW razmer pamyati v paragrafah 4H DW rezerv 6H DD dlinnyj vyzov funkcii dispatchera DOS AH DD adres zaversheniya (IP,CS) EH DD adres vyhoda po Ctrl-Break (IP,CS) 12H DD adres vyhoda po kriticheskoj oshibke 16H 22 bajta rezerv 2CH DW nomer paragrafa stroki sredy 2EH 46 bajtov rezerv 5CH 16 bajtov oblast' parametrov 1 (format FCB) 6CH 20 bajtov oblast' parametrov 2 (format FCB) 80H 128 bajtov oblast' DTA po umolchaniyu/poluchaet komandnuyu stroku programmy 1.3.1 Manipulyacii s pamyat'yu. Kogda MS DOS zagruzhaet programmu, to ona pomeshchaetsya v mladshuyu oblast' pamyati, srazu zhe za COMMAND.COM i ustanovlennymi drajve- rami ustrojstv ili drugimi utilitami, kotorye rezidentny v pamya- ti. V etot moment vremeni vsya pamyat' za programmoj otvedena etoj programme. Esli programme nuzhna pamyat' dlya sozdaniya oblasti dan- nyh, to ona mozhet priblizhenno vychislit' gde v pamyati konchaetsya ee kod i zatem pomestit' trebuemuyu oblast' dannyh v lyuboe mesto za koncom koda. Dlya opredeleniya adresa konca programmy pomestite v konce programmy psevdosegment tipa: ZSEG SEGMENT ; ZSEG ENDS V assemblere IBM PC ZSEG budet poslednim segmentom, tak kak segmenty raspolagayutsya v alfavitnom poryadke. S drugimi assemble- rami nuzhno dejstvitel'no pomestit' eti stroki v konce programmy. V samoj programme dostatochno postavit' operator MOV AX,ZSEG i AX budet ukazyvat' na pervyj svobodnyj segment pamyati za programmoj. Takoj podhod budet rabotat' do teh por, poka programma ne budet predpolagat' o nalichii pamyati, kotoroj na samom dele net. On ne budet takzhe rabotat' v mnogopol'zovatel'skoj srede, kogda neskol'ko programm mogut delit' mezhdu soboj odnu i tu zhe oblast' adresov. Dlya resheniya etoj problemy MS DOS imeet vozmozhnost' ots- lezhivat' 640K sistemnoj pamyati i otvodit' po trebovaniyu programmy bloki pamyati lyubogo razmera. Blok pamyati - eto prosto nepreryvnaya oblast' pamyati, ego maksimal'nyj razmer opredelyaetsya razmerom dostupnoj pamyati, v chastnosti, on mozhet byt' bol'she odnogo seg- menta (64K). Esli zatrebovan slishkom bol'shoj blok, to DOS vydaet soobshchenie ob oshibke. Lyubaya vozmozhnost' perekrytiya blokov isklyuche- na. Krome togo MS DOS mozhet osvobozhdat', urezat' ili rasshiryat' sushchestvuyushchie bloki. Hotya programma ne obyazana ispol'zovat' eti sredstva, no udobno i predusmotritel'no delat' eto. Nekotorye funkcii DOS trebuyut, chtoby byli ispol'zovany sredstva upravleniya pamyat'yu DOS, naprimer, zavershenie rezidentnoj programmy [1.3.4] ili vyzov drugoj programmy iz dannoj [1.3.2]. Prezhde chem otvesti pamyat', sushchestvuyushchij blok (vsya pamyat' ot nachala programmy do konca) dolzhen byt' obrezan do razmera prog- rammy. Zatem, pri sozdanii bloka, DOS sozdaet 16-bajtnyj uprav- lyayushchij blok pamyati, kotoryj raspolozhen neposredstvenno pered blokom pamyati. Pervye 5 bajtov etogo bloka imeyut sleduyushchee znache- nie: bajt 0 ASCII 90 - esli poslednij blok v cepochke, inache ASCII 77. bajty 1-2 0 esli blok osvobozhden bajty 3-4 razmer bloka v 16-bajtnyh paragrafah DOS obrashchaetsya k blokam po cepochke. Adres pervogo bloka hra- nitsya vo vnutrennej peremennoj. Znachenie etoj peremennoj pozvo- lyaet DOS opredelit' polozhenie pervogo otvedennogo bloka, a iz informacii, soderzhashchejsya v nem, mozhet byt' najden sleduyushchij blok i t.d., kak pokazano na ris. 1-4. Kak tol'ko Vy nachali ispol'zo- vat' sistemu raspredeleniya pamyati DOS, to Vy obyazany priderzhi- vat'sya ee. Esli programma izmenit soderzhimoe upravlyayushchego bloka, to cepochka budet razorvana i DOS nachnet vydavat' soobshcheniya ob oshibke. MS DOS obespechivaet tri funkcii raspredeleniya pamyati, nomera ot 48H do 4AH preryvaniya 21H. Funkciya 48H otvodit blok pamyati, a 49H - osvobozhdaet blok pamyati. Tret'ya funkciya ("SETBLOCK") me- nyaet razmer pamyati, otvedennoj dlya programmy; eta funkciya dolzhna byt' ispol'zovana pered dvumya ostal'nymi. Posle ee vypolneniya mozhno spokojno otvodit' i osvobozhdat' bloki pamyati. Programma dolzhna osvobodit' vse otvedennye eyu bloki pered zaversheniem. Inache eta pamyat' budet nedostupnoj dlya posleduyushchego ispol'zova- niya. Srednij uroven'. Vse tri funkcii raspredeleniya pamyati preryvaniya 21H ispol'zuyut 16-bitnyj adres nachala bloka pamyati, s kotorym oni operiruyut. |tot adres sootvetstvuet segmentu, s kotorogo nachinaetsya blok (blok vsegda nachinaetsya so smeshcheniya 0 dannogo segmenta). Takim obrazom real'nyj adres yachejki nachala bloka raven etomu adresu, umnozhennomu na 16. Takzhe, dlya vseh treh funkcij, BX soderzhit chislo 16-bajtnyh razdelov pamyati (paragrafov), kotorye budut otvodit'sya ili osvobozhdat'sya. Esli funkciya ne mozhet byt' vypolne- na, to ustanavlivaetsya flag perenosa, a v AX vozvrashchaetsya kod oshibki, ob®yasnyayushchij prichinu. Vozmozhny tri koda oshibki: 7 razrushen upravlyayushchij blok pamyati 8 nedostatochno pamyati dlya vypolneniya funkcii 9 nevernyj adres bloka pamyati Funkciya otvedeniya bloka ispol'zuet kody 7 i 8, a osvobozhdeniya - 7 i 9, v to vremya kak funkciya izmeneniya bloka ispol'zuet vse tri koda. V sleduyushchem primere snachala otvoditsya blok, razmerom 1024 bajta. Pri etom BX soderzhit trebuemoe chislo 16-bajtnyh paragra- fov, a pri zavershenii startovyj adres bloka raven AX:0 (t.e. smeshchenie 0 v segmente so znacheniem, soderzhashchimsya v AX). Vtoraya chast' primera osvobozhdaet etot zhe blok, kak i trebuetsya pri za- vershenii programmy. V dannom sluchae znachenie poluchennoe v AX pomeshchaetsya v ES. DOS sledit za razmerom bloka i znaet kakoe koli- chestvo paragrafov nado osvobodit'. ;---otvedenie bloka razmerom 1024 bajta MOV AH,48H ;nomer funkcii MOV BX,64 ;trebuem 64 paragrafa INT 21H ;pytaemsya otvesti blok JC ERROR ;obrabatyvaem oshibku v sluchae neudachi MOV BLOCK_SEG,AX;inache sohranyaem adres bloka . ;---osvobozhdaem tot zhe blok MOV AX,BLOCK_SEG ;poluchaem startovyj adres bloka MOV ES,AX ;pomeshchaem ego v ES MOV AH,49H ;nomer trebuemoj funkcii INT 21H ;osvobozhdaem blok pamyati Nakonec, privedem primer ispol'zovaniya funkcii 4AH. ES soder- zhit znachenie segmenta PSP, t.e. samogo pervogo bajta pamyati, s kotorogo zagruzhena programma. |to znachenie prisvaivaetsya ES pri starte zadachi. Dlya ispol'zovaniya SETBLOCK nado libo vyzyvat' etu funkciyu v samom nachale programmy (prezhde chem ES budet izmenen), libo sohranit' ego nachal'noe znachenie dlya posleduyushchego ispol'zo- vaniya. BX soderzhit trebuemyj razmer bloka v 16-bajtnyh paragrafah. Dlya opredeleniya etogo razmera pomestite dobavochnyj "iskustvennyj" segment v konec programmy. V makroasssemblere IBM PC segmenty raspolagayutsya v alfavitnom poryadke, poetomu Vy mozhete pomestit' ego v lyuboe mesto programmy, pri uslovii, chto ego imya eto chto-to vrode "ZSEG". V drugih assemblerah dejstvitel'no pomeshchajte fik- tivnyj segment v konec programmy. Programma mozhet prochitat' pozi- ciyu etogo segmenta i, sravnivaya ee so startovym segmentom, polu- chit' kolichestvo pamyati, trebuemoe samoj programme. V moment zag- ruzki programmy i ES i DS soderzhat nomer paragrafa samogo nachala programmy v prefikse programmnogo segmenta; dlya COM fajlov CS takzhe ukazyvaet na etu poziciyu, no dlya EXE fajlov eto ne tak. ;---osvobozhdenie pamyati (ES imeet znachenie pri starte) MOV BX,ZSEG ;poluchaem # paragrafa konca programmy + 1 MOV AX,ES ;poluchaem # paragrafa nachala programmy SUB BX,AX ;vychislyaem razmer programmy v paragrafah MOV AH,4AH ;nomer funkcii INT 21H ;osvobozhdaem pamyat' JC MEMORY_ERROR ;proveryaem na oshibku ;--- ZSEG SEGMENT ZSEG ENDS 1.3.2 Zapusk odnoj programmy iz drugoj. MS DOS obespechivaet funkciyu EXEC (nomer 4BH preryvaniya 21H), realizuyushchuyu vyzov odnoj programmy iz drugoj. Pervaya programma nazyvaetsya "roditelem", a zagruzhaemaya i zapuskaemaya - "potomkom". Vysokij uroven'. V Bejsik versii 3.0 vvedena komanda SHELL. So znachitel'nymi ogranicheniyami ona pozvolyaet bejsikovskoj programme zagruzit' i vypolnit' druguyu programmu. Format etoj komandy SHELL kom_stroka. Komandnaya stroka mozhet byt' prosto imenem programmy ili ona mozhet soderzhat' krome imeni parametry, kotorye obychno sleduyut za imenem programmy v komandnoj stroke. Esli kom_stroka ne ukazana, to zagruzhaetsya kopiya COMMAND.COM i poyavlyaetsya zapros operacionnoj sistemy. V etot moment mozhno vypolnit' lyubuyu komandu MS DOS, a po zaversheniyu vernut' upravlenie bejsikovskoj programme, vvedya ko- mandu EXIT. Imeetsya ryad ogranichenij pri ispol'zovanii SHELL. Esli zagru- zhaemaya programma menyaet rezhim raboty displeya, to on ne budet avtomaticheski vosstanovlen pri vozvrate. Pered zagruzkoj program- my vse fajly dolzhny byt' zakryty, i eto ne mozhet byt' programma, kotoraya ostaetsya rezidentnoj posle zaversheniya. Obsuzhdenie ryada drugih problem soderzhitsya v rukovodstve po Bejsiku. Srednij uroven'. Funkciya 4BH bolee slozhna, chem ostal'nye, trebuya chetyreh podgo- tovitel'nyh shagov: 1. Podgotovit' v pamyati mesto, dostupnoe programme. 2. Sozdat' blok parametrov. 3. Postroit' stroku, soderzhashchuyu nakopitel', put' i imya prog- rammy. 4. Sohranit' znacheniya registrov SS i SP v peremennyh. Poskol'ku pri zagruzke programmy MS DOS vydelyaet ej vsyu dos- tupnuyu pamyat', to neobhodimo osvobodit' mesto v pamyati. Esli ne osvobodit' chast' pamyati, to ne budet mesta dlya zagruzki vtoroj programmy. V [1.3.1] ob®yasneno kak eto sdelat' s pomoshch'yu funkcii SETBLOCK. Posle togo kak pamyat' osvobozhdena, Vy dolzhny prosto pomestit' v BX trebuemoe chislo 16-bajtnyh paragrafov, zaslat' 4AH v AH i vypolnit' preryvanie 21H, delaya dostupnym programme imenno to chislo paragrafov, kotoroe ej trebuetsya. Blok parametrov, na kotoryj dolzhny ukazyvat' ES:BX eto 14-bajtnyj blok blok pamyati, v kotoryj Vy dolzhny pomestit' sle- duyushchuyu informaciyu: DW segmentnyj adres stroki sredy DD segment i smeshchenie komandnoj stroki DD segment i smeshchenie pervogo FCB DD segment i smeshchenie vtorogo FCB Stroka sredy - eto stroka, sostoyashchaya iz odnoj ili bolee speci- fikacij, kotorym sleduet MS DOS pri vypolnenii programmy. |lemen- ty stroki sredy takie zhe, kak i te chto mozhno obnaruzhit' v disko- vom fajle CONFIG.SYS. Naprimer, v stroku mozhet byt' pomeshcheno VERIFY = ON. Prosto nachnite stroku s pervogo elementa, zavershiv ego simvolom ASCII 0, potom zapishite sleduyushchij i t.d. Za posled- nim elementom dolzhny sledovat' dva simvola ASCII 0. Stroka dolzhna nachinat'sya na granice paragrafa (t.e. ee adres po modulyu 16 dol- zhen byt' raven nulyu). |to vyzvano tem, chto sootvetstvuyushchij vhod v bloke parametrov, ukazyvayushchij na stroku, soderzhit tol'ko 2-bajt- noe segmentnoe znachenie. Vse eto ne nuzhno, esli novaya programma mozhet rabotat' s toj zhe strokoj sredy, chto i programma "rodi- tel'". V etom sluchae nado prosto pomestit' dva simvola ASCII 0 v pervye 2 bajta bloka parametrov. Sleduyushchie 4 bajta bloka parametrov ukazyvayut na komandnuyu stroku dlya zagruzhaemoj programmy. "Komandnaya stroka" - eto sim- vol'naya stroka, opredelyayushchaya sposob raboty programmy. Pri zagruz- ke programmy iz DOS ona mozhet imet' vid vrode EDITOR A:CHAPTER1\ NOTES.MS. Pri etom vyzyvaetsya redaktor i emu peredaetsya imya fajla v podkataloge nakopitelya A dlya nemedlennogo otkrytiya. Kogda Vy podgotavlivaete komandnuyu stroku dlya EXEC, to nado vklyuchat' tol'- ko poslednyuyu chast' informacii, no ne imya zagruzhaemoj programmy. Pered komandnoj strokoj dolzhen stoyat' bajt, soderzhashchij dlinu etoj stroki, i ona dolzhna zavershat'sya simvolom <VK> (ASCII 13). Poslednie 8 bajtov bloka parametrov ukazyvayut na upravlyayushchie bloki fajlov (FCB). FCB soderzhit informaciyu ob odnom ili dvuh fajlah, ukazannyh v komandnoj stroke. Esli otkryvaemyh fajlov net, to nado zapolnit' vse 8 bajt simvolom ASCII 0. V [5.3.5] ob®yasneno, kak rabotaet FCB. Nachinaya s versii MS DOS 2.0, ispol'- zovanie FCB neobyazatel'no i Vy mozhete ne vklyuchat' informaciyu FCB, vmesto etogo ispol'zuya novuyu konvenciyu deskriptora fajlov (file handler), v kotoroj dostup k fajlu predostavlyaetsya po kodovomu nomeru, a ne cherez FCB (takzhe obsuzhdaetsya v [5.3.5]). Nakonec, Vy dolzhny postroit' stroku s ukazaniem nakopitelya, puti i imeni fajla. |ta stroka imenuet zagruzhaemuyu programmu. DS:DX ukazyvaet na etu stroku pri vypolnenii EXEC. |ta stroka - standartnaya stroka ASCIIZ, t.e. nichego bolee, chem standartnaya specifikaciya fajla, zavershaemaya kodom ASCII 0. Naprimer, eto mozhet byt' B:\NEWDATA\FILER.EXE<NUL>, gde simvolom <NUL> obozna- chen kod ASCII 0. Posle togo kak vsya ukazannaya informaciya podgotovlena, ostaetsya poslednyaya zadacha. Poskol'ku vse registry budut izmeneny vyzyvae- moj zadachej, to nado sohranit' segment steka i ukazatel' steka, s tem chtoby oni mogli byt' vosstanovleny, kogda upravlenie budet vozvrashcheno vyzvavshej zadache. Dlya ih sohraneniya sozdajte peremen- nye. Poskol'ku znachenie registra DS takzhe budet izmeneno, to eti peremennye ne mogut byt' najdeny, do teh por poka ne budut povto- reny operatory MOV AX,DSEG i MOV DS,AX. Posle togo kak SS i SP sohraneny, pomestite 0 v AL, dlya vybora operacii "zagruzka i zapusk" (EXEC ispol'zuetsya takzhe dlya overleev [1.3.5]). Zatem pomestite 4AH v AH i vyzovite preryvanie 21H. V etot moment zapu- shcheny dve programmy, prichem programma "roditel'" nahoditsya v osta- novlennom sostoyanii. MS DOS predostavlyaet vozmozhnost' programme potomku peredat' roditelyu kod vozvrata, takim obrazom mogut byt' peredany oshibki i status. V [7.2.5] ob®yasneno kak eto sdelat'. CHto kasaetsya samoj funkcii zapuska, to pri vozniknovenii oshibki ustanavlivaetsya flag perenosa, a registr AX v etom sluchae budet vozvrashchat' 1 - dlya nepravil'nogo nomera funkcii, 2 - esli fajl ne najden, 5 - pri diskovoj oshibke, 8 - pri nehvatke pamyati, 10 - esli nepravil'na stroka sredy i 11 - esli neveren format. Privodimyj primer - prostejshij iz vozmozhnyh, no chasto bol'she nichego i ne nado. Zdes' ostavlen nulevym blok parametrov i ne sozdana stroka sredy. |to oznachaet, chto zagruzhaemoj programme ne budet peredavat'sya komandnaya stroka i chto sreda budet takoj zhe, kak i dlya vyzyvayushchej programmy. Vy dolzhny tol'ko izmenit' raspre- delenie pamyati, sozdat' imya i (pustoj) blok parametrov i sohra- nit' znacheniya SS i SP. ;---v segmente dannyh FILENAME DB 'A:TRIAL.EXE',0 ;zagruzhaem TRIAL.EXE PARAMETERS DW 7DUP(0) ;nulevoj blok parametrov KEEP_SS DW 0 ;peremennaya dlya SS KEEP_SP DW 0 ;peremennaya dlya SP ;---pereraspredelenie pamyati MOV BX,ZSEG ;poluchit' # paragrafa konca MOV AX,ES ;poluchit' # paragrafa nachala SUB BX,AX ;vychislit' razmer programmy MOV AH,4AH ;nomer funkcii INT 21H ;pereraspredelenie ;---ukazyvaem na blok parametrov MOV AX,SEG PARAMETERS ;v ES - segment MOV ES,AX ; MOV BX,OFFSET PARAMETERS ;v BX - smeshchenie ;---sohranit' kopii SS i SP MOV KEEP_SS,SS ;sohranyaem SS MOV KEEP_SP,SP ;sohranyaem SP ;---ukazyvaem na stroku imeni fajla MOV DX,OFFSET FILENAME ;smeshchenie - v DX MOV AX,SEG FILENAME ;segment - v DS MOV DS,AX ; ;---zagruzka programmy MOV AH,4BH ;funkciya EXEC MOV AL,0 ;vybiraem "zagruzku i zapusk" INT 21H ;zapuskaem zadachu ;---vposledstvii, vosstanavlivaem registry MOV AX,DSEG ;vosstanavlivaem DS MOV DS,AX ; MOV SS,KEEP_SS ;vosstanavlivaem SS MOV SP,KEEP_SP ;vosstanavlivaem SP ;---v konce programmy sozdaem fiktivnyj segment ZSEG SEGMENT ;sm. [1.3.1] ZSEG ENDS 1.3.3 Ispol'zovanie komand interfejsa s pol'zovatelem iz programmy. Programma mozhet imet' v svoem rasporyazhenii polnyj nabor komand interfejsa s pol'zovatelem DOS, takih kak DIR ili CHKDSK. Kogda eti komandy ispol'zuyutsya iz programmy, zagruzhaetsya i zapuskaetsya vtoraya kopiyu COMMAND.COM. Hotya takoj podhod mozhet sekonomit' mnogo usilij pri programmirovanii, dlya ego uspeshnoj realizacii trebuetsya dostatochnoe kolichestvo pamyati dlya etoj vtoroj kopii i Vasha programma mozhet popast' v lovushku esli pamyati nedostatochno. Vysokij uroven'. Bejsik 3.0 mozhet zagruzit' vtoruyu kopiyu COMMAND.COM s pomoshch'yu operatora SHELL. SHELL obsuzhdaetsya v [1.3.2]. COMMAND.COM zagru- zhaetsya kogda ne ukazano imya fajla, poetomu vvodya prosto SHELL, Vy poluchaete zapros MS DOS. V etot moment mozhno ispol'zovat' lyubuyu iz utilit DOS, vklyuchaya komandnye fajly. Dlya vozvrata v vyzvavshuyu programmu nado vvesti EXIT. Srednij uroven'. V etom sluchae k primeru, privedennomu v [1.3.2] nuzhno dobavit' komandnuyu stroku. Obychno ona nachinaetsya s bajta dliny stroki, zatem sleduet sama komandnaya stroka i, nakonec, kod ASCII 13. Pri peredache komandy COMMAND.COM Vy dolzhny ukazat' /C pered strokoj (sm. punkt "Vyzov vtorichnogo komandnogo processora" rukovodstva po MS DOS). Vy dolzhny takzhe ukazat' nakopitel', na kotorom naho- ditsya COMMAND.COM, pomestiv imya nakopitelya v nachale komandnoj stroki. CHtoby vyvesti katalog nakopitelya A:, a COMMAND.COM pri etom nahoditsya na nakopit