ele B:, nuzhna stroka: COMMAND_LINE DB 12,'B: /C DIR A:',13 Sleduyushchij kusochek koda ustanavlivaet adres komandnoj stroki v blok parametrov, ispol'zuemyj v primere [1.3.2]: LEA BX,PARAMETERS ;poluchenie adresa bloka par-rov MOV AX,OFFSET COMMAND_LINE ;poluchenie smeshcheniya kom. stroki MOV [BX]+2,AX ;peresylka v 1-e 2 bajta bloka MOV AX,SEG COMMAND_LINE ;poluchenie segmenta kom. stroki MOV [BX]+4,AX ;peresylka vo 2-e 2 bajta bloka 1.3.4 Sohranenie programmy v pamyati posle zaversheniya. Programmy, ostavlennye rezidentnymi v pamyati, mogut sluzhit' v kachestve utilit dlya drugih programm. Obychno takie programmy vyzy- vayutsya cherez neispol'zuemyj vektor preryvaniya. MS DOS rassmatri- vaet takie programmy kak chast' operacionnoj sistemy, zashchishchaya ih ot nalozheniya drugih programm, kotorye budut zagruzheny vposledst- vii. Rezidentnye programmy obychno pishutsya v forme COM, chto obsuzh- daetsya v punkte [1.3.6]. Programmy, napisannye v forme EXE osta- vit' rezidentnymi v pamyati nemnogo trudnee. Zavershenie programmy preryvaniem 27H ostavlyaet ee rezidentnoj v pamyati. CS dolzhen ukazyvat' na nachalo PSP dlya togo, chtoby eta funkciya rabotala pravil'no. V programmah COM, CS srazu ustanavli- vaetsya sootvetstvuyushchim obrazom, poetomu nado prosto zavershit' programmu preryvaniem 27H. V programmah EXE , CS pervonachal'no ukazyvaet na pervyj bajt, sleduyushchij za PSP (t.e. 100H). Pri nor- mal'nom zavershenii EXE programmy poslednyaya instrukciya RET vytal- kivaet iz steka pervye polozhennye tuda znacheniya: PUSH DX / MOV AX,0 / PUSH AX. Poskol'ku DS pervonachal'no ukazyvaet na nachalo PSP, to pri poluchenii etih znachenij iz steka schetchik komand uka- zyvaet na smeshchenie 0 v PSP, gde pri inicializacii zapisyvaetsya instrukciya INT 20H. Poetomu INT 20H vypolnyaetsya, a eto standart- naya funkciya dlya zaversheniya programmy i peredachi upravleniya v DOS. Na ris. 1-5 pokazan etot process. CHtoby zastavit' preryvanie 27H rabotat' v EXE programme nado pomestit' 27H vo vtoroj bajt PSP (pervyj soderzhit mashinnyj kod instrukcii INT), a zatem zavershit' programmu obychnym RET. Dlya oboih tipov fajlov prezhde chem vypol- nit' preryvanie 27H, DX dolzhen soderzhat' smeshchenie konca program- my, otschityvaemoe ot nachala PSP. Srednij uroven'. Vektor preryvaniya ustanavlivaetsya s pomoshch'yu funkcii 25H prery- vaniya 21H, kak pokazano v [1.2.3] (zdes' ispol'zuetsya vektor 70H). Pozabot'tes', chtoby procedura okanchivalas' IRET. Krome samoj procedury, ustanavlivaemaya programma ne dolzhna delat' niche- go, krome inicializacii vektora preryvaniya, prisvoeniya DX znache- niya smeshcheniya konca procedury i zaversheniya. Dlya COM fajlov prosto pomestite operator INT 27H v konec programmy. Dlya EXE fajlov pomestite etot operator v pervoe slovo PSP i zavershite programmu obychnym operatorom RET. Dlya togo chtoby vypolnit' proceduru, vpos- ledstvii zagruzhennaya programma dolzhna vyzvat' INT 70H. Privedeny primery dlya oboih tipov fajlov (COM i EXE). V oboih ustanovlena metka FINISH dlya otmetki konca procedury preryvaniya (napominaem, chto znak $ daet znachenie schetchika komand v etoj tochke). Dlya COM fajlov FINISH daet smeshchenie ot nachala PSP, kak i trebuetsya dlya preryvaniya 27H. Dlya EXE fajlov smeshchenie otschity- vaetsya ot pervogo bajta, sleduyushchego za PSP, poetomu k nemu neob- hodimo pribavit' 100H, chtoby pereschitat' na nachalo PSP. Zametim, chto pomestiv proceduru v nachalo programmy, my mozhem isklyuchit' ustanovochnuyu chast' koda iz rezidentnoj porcii. Drugoj vozmozhnyj fokus sostoit v ispol'zovanii instrukcii MOVSB dlya peresylki koda procedury vniz v neispol'zuemuyu chast' PSP, nachinaya so smeshcheniya 60H, chto osvobozhdaet 160 bajt pamyati. Sluchaj fajla COM: ;---zdes' procedura preryvaniya BEGIN: JMP SHORT SET_UP ;perehod na ustanovku ROUTINE PROC FAR PUSH DS ;sohranenie registrov . (procedura) . POP DS ;vosstanovlenie registrov IRET ;vozvrat iz preryvaniya FINISH EQU $ ;otmetka konca procedury ROUTINE ENDP ;---ustanovka vektora preryvaniya SET_UP: MOV DX,OFFSET ROUTINE ;smeshchenie procedury v DX MOV AL,70H ;nomer vektora preryvaniya MOV AH,25H ;funkciya ustanovki vektora INT 21H ;ustanavlivaem vektor ;---zavershenie programmy, ostavlyaya rezidentnoj LEA DX,FINISH ;opredelyaem treb. smeshchenie INT 27H ;zavershenie Sluchaj fajla EXE: ;---zdes' rezidentnaya procedura JMP SHORT SET_UP ;perehod na ustanovku ROUTINE PROC FAR PUSH DS ;sohranenie registrov . (procedura) . POP DS ;vosstanovlenie registrov IRET ;vozvrat iz preryvaniya FINISH EQU $ ;otmetka konca procedury ROUTINE ENDP ;---ustanovka vektora preryvaniya SET_UP: MOV DX,OFFSET ROUTINE ;smeshchenie procedury v DX MOV AX,SEG ROUTINE ;segment procedury v DS MOV DS,AX ; MOV AL,70H ;nomer vektora preryvaniya MOV AH,25H ;funkciya ustanovki vektora INT 21H ;ustanovka vektora ;---zavershenie programmy MOV DX,FINISH+100H ;vychislyaem smeshchenie konca MOV BYTE PTR ES:1,27H ;posylaem 27H v PSP RET ;zavershaem proceduru Funkciya 31H preryvaniya 21H rabotaet analogichno, za isklyucheniem togo, chto v DX dolzhno soderzhat'sya chislo 16-bajtnyh paragrafov, trebuemyh procedure (vychislenie razmera procedury, nachinaya ot nachala PSP - sm. v primere [1.3.1]). Preimushchestvom etoj funkcii yavlyaetsya to, chto ona peredaet roditel'skoj programme kod vyhoda, dayushchij informaciyu o statuse procedury. Roditel'skaya programma poluchaet etot kod s pomoshch'yu funkcii 4DH preryvaniya 21H. Kody vyhoda obsuzhdayutsya v [7.2.5]. 1.3.5 Zagruzka i zapusk programmnyh overleev. Overlei - eto chasti programmy, kotorye ostayutsya na diske, v to vremya kak telo programmy rezidentno v pamyati. Kogda trebuetsya funkciya, vypolnyaemaya kakim-libo overleem, to on zagruzhaetsya v pamyat' i programma vyzyvaet ego kak proceduru. Razlichnye overlei mogut zagruzhat'sya v odno i to zhe mesto pamyati, perekryvaya predy- dushchij kod. Naprimer, programma vedeniya bazy dannyh mozhet zagru- zit' proceduru sortirovki, a zatem perekryt' ee proceduroj gene- racii otchetov. |ta tehnika ispol'zuetsya dlya ekonomii pamyati. No ona horosha tol'ko dlya teh procedur, kotorye ne ispol'zuyutsya pos- toyanno, inache chastye obrashcheniya k disku privedut k tomu, chto prog- ramma budet vypolnyat'sya slishkom medlenno. Srednij uroven'. MS DOS ispol'zuet funkciyu EXEC dlya zagruzki overleev. |ta funkciya, nomer 4BH preryvaniya 21H, ispol'zuetsya takzhe dlya zagruz- ki i zapuska odnoj programmy iz drugoj, esli pomestit' kod 0 v AL [1.3.2]. Esli v AL pomestit' kod 3, to togda budet zagruzhen overlej. V etom sluchae ne sozdaetsya PSP, poetomu overlej ne usta- navlivaetsya kak nezavisimaya programma. Takaya procedura prosto zagruzhaet overlej, ne peredavaya emu upravleniya. Imeetsya dva sposoba obespechit' pamyat' dlya overleya. Mozhet byt' ispol'zovana libo oblast' vnutri tela programmy, libo special'no otvedena oblast' pamyati za predelami golovnoj programmy. Funkcii EXEC peredaetsya tol'ko segmentnyj adres, v kachestve pozicii, kuda budet zagruzhen overlej. Kogda overlej zagruzhaetsya v telo golovnoj programmy, to programma dolzhna vychislit' nomer paragrafa, kuda budet zagruzhat'sya overlej, sama. S drugoj storony, pri zagruzke v special'no otvedennuyu pamyat' MS DOS obespechivaet programmu nome- rom paragrafa. V nizheprivedennom primere ispol'zuetsya zagruzka v otvedennuyu pamyat'. Poskol'ku DOS otvodit programme vsyu dostupnuyu pamyat', to snachala neobhodimo osvobodit' pamyat' s pomoshch'yu funkcii 4AH. Funk- ciya 48H otvodit blok pamyati dostatochno bol'shoj, chtoby on mog prinyat' samyj bol'shoj iz overleev. |ta funkciya vozvrashchaet znache- nie segmenta bloka v AX, i etot nomer paragrafa opredelyaet kuda budet zagruzhen overlej, a takzhe po kakomu adresu overlej budet vyzyvat'sya golovnoj programmoj. |ti funkcii detal'no obsuzhdayutsya v [1.3.1]. Krome koda 3, zasylaemogo v AL, Vy dolzhny ustanovit' dlya etoj funkcii eshche dva parametra. DS:DX dolzhny ukazyvat' na stroku, dayu- shchuyu put' k fajlu overleya, zavershaemuyu bajtom ASCII 0. Neobhodimo ukazyvat' polnoe imya fajla, vklyuchaya rasshirenie .COM ili .EXE, poskol'ku DOS v dannom sluchae ne schitaet, chto on ishchet programmnyj fajl. Nakonec, ES:BX dolzhny ukazyvat' na 4-bajtnyj blok parametrov, kotoryj soderzhit (1) 2-bajtnyj nomer paragrafa, kuda budet zagru- zhat'sya overlej i (2) 2-bajtnyj faktor privyazki, kotoryj budet ispol'zovat'sya dlya privyazki adresov v overlee (privyazka ob®yas- nyaetsya v [1.3.6]). V kachestve nomera paragrafa nado ispol'zovat' chislo, vozvrashchaemoe v AX, dlya nomera paragrafa otvedennogo bloka pamyati. Faktor privyazki daet smeshchenie, po kotoromu mogut byt' vychisleny adresa trebuyushchih privyazki parametrov v overlee. Ispol'- zujte nomer paragrafa, kuda zagruzhaetsya overlej. Posle togo kak on ustanovlen, vyzovite funkciyu i overlej budet zagruzhen. Prosto izmenyaya put' k overlejnomu fajlu, mozhno vnov' i vnov' vyzyvat' etu funkciyu, zagruzhaya vse novye i novye overlei. Esli pri vozvra- te ustanovlen flag perenosa, to byla oshibka i ee kod budet vozv- rashchen v AX. Kod raven 1, esli ukazan nevernyj nomer funkcii, 2 - esli fajl ne najden, 5 - pri diskovyh oshibkah i 8 - pri otsutst- vii dostatochnoj pamyati. Posle togo kak overlej zagruzhen v pamyat', k nemu mozhno polu- chit' dostup kak k dalekoj (far) procedure. V segmente dannyh dolzhen byt' ustanovlen dvuhslovnyj ukazatel', opredelyayushchij etot vyzov. Segmentnaya chast' ukazatelya prosto ravna tekushchemu kodovomu segmentu. Smeshchenie overleya dolzhno byt' vychisleno nahozhdeniem raznicy mezhdu segmentami koda i overleya i umnozheniem rezul'tata na 16 (perevodya velichinu iz paragrafov v bajty). V nizhepriveden- nom primere dve peremennye OVERLAY_OFFSET i CODE_SEG pomeshcheny odna za drugoj dlya pravil'noj ustanovki ukazatelya. Odnazhdy zagru- zhennyj, overelej zatem mozhem vyzyvat'sya instrukciej CALL DWORD PTR OVERLAY_OFFSET. Overlej mozhet byt' polnoj programmoj so svoimi segmentami dannyh i steka, hotya kak pravilo ispol'zuetsya stekovyj segment vyzyvayushchej programmy. Pri vyzove overleya znachenie segmenta ego sobstvennogo segmenta dannyh dolzhno byt' pomeshcheno v DS. ;---zavershaem programmu fiktivnym segmentom (sm. [1.3.1]): ZSEG SEGMENT ZSEG ENDS ;---v segmente dannyh OVERLAY_SEG DW ? OVERLAY_OFFSET DW ? ;smeshchenie overleya CODE_SEG DW ? ;segment overleya - dolzhen PATH DB 'A:OVERLAY.EXE' ;sledovat' za smeshcheniem 0BLOCK DD 0 ;4-bajtnyj blok parametrov ;---osvobozhdaem pamyat' MOV CODE_SEG,CS ;sozdaem kopiyu CS MOV AX,ES ;kopiruem znachenie segmenta PSP MOV BX,ZSEG ;adres segmenta konca programmy SUB BX,AX ;vychislyaem raznost' MOV AH,4AH ;nomer funkcii SETBLOCK INT 21H ;osvobozhdaem pamyat' JC SETBLK_ERR ;flag perenosa govorit ob oshibke ;---otvodim pamyat' dlya overleya MOV BX,100H ;otvodim dlya overleya 1000H bajt MOV AH,48H ;funkciya otvedeniya pamyati INT 21H ;teper' AX:0 ukazyvaet na blok JC ALLOCATION_ERR ;flag perenosa govorit ob oshibke MOV OVERLAY_SEG,AX ;zapasaem adres segmenta overleya ;---vychislenie smeshcheniya overleya v kodovom segmente MOV AX,CODE_SEG ;vychitaem znachenie segmenta overleya MOV BX,OVERLAY_SEG ;iz znacheniya segmenta koda SUB BX,AX ;BX soderzhit chislo paragrafov MOV CL,4 ;sdvigaem eto chislo na 4 bita vlevo SHL BX,CL ;chtoby poluchit' velichinu v bajtah MOV OVERLAY_OFFSET,BX ;zapominaem smeshchenie ;---zagruzka pervogo overleya MOV AX,SEG BLOCK ;ES:BX ukazyvaet na blok parametrov MOV ES,AX ; MOV BX,OFFSET BLOCK ; MOV AX,OVERLAY_SEG ;pomeshchaem adres segmenta overleya v MOV [BX],AX ;pervoe slovo bloka parametrov MOV [BX]+2,AX ;segment overleya - faktor privyazki LEA DX,PATH ;DS:DX ukazyvaet na put' k fajlu MOV AH,48H ;nomer funkcii EXEC MOV AL,3 ;kod zagruzki overleya INT 21H ;zagruzhaem overlej JC LOAD_ERROR ;flag perenosa govorit ob oshibke ;---teper' programma zanimaetsya svoimi delami . . CALL DWORD PTR OVERLAY_OFFSET ;vyzov overleya . ;nuzhno ukazyvat' DWORD PTR, tak kak overlej - . ;dalekaya procedura ;---posmotrite etu strukturu, kogda budete pisat' overlej DSEG SEGMENT ;kak obychno, ustanavlivaem segment dannyh . ;opuskaem stekovyj segment (ispol'zuetsya . ;stek vyzyvayushchej programmy) DSEG ENDS CSEG SEGMENT PARA PUBLIC 'CODE' OVERLAY PROC FAR ;vsegda "dalekaya" procedura ASSUME CS:CSEG,DS:DSEG PUSH DS ;hranim DS vyzyvayushchej programmy MOV AX,DSEG;ustanavlivaem DS overleya MOV DS,AX . . POP DS ;vosstanavlivaem DS pri zavershenii RET OVERLAY ENDP CSEG ENDS END 1.3.6 Preobrazovanie programm iz tipa .EXE v tip .COM. Programmisty na assemblere imeyut vozmozhnost' preobrazovat' svoi programmy iz obychnogo formata EXE v format COM. Fajly EXE imeyut zagolovok, soderzhashchij informaciyu dlya privyazki; DOS privyazy- vaet nekotorye adresa programmy pri zagruzke. S drugoj storony, fajly COM sushchestvuyut v takom vide, chto privyazka ne trebuetsya - oni hranyatsya uzhe v tom vide, v kotorom zagruzhaemaya programma dolzhna byt' v pamyati mashiny. Po etoj prichine fajly EXE po men'shej mere na 768 bajtov bol'she na diske, chem ih COM ekvivalenty (hotya pri zagruzke v pamyat' oni budut zanimat' odinakovoe mesto). Fajly COM takzhe bystree zagruzhayutsya, poskol'ku ne trebuetsya privyazki. Drugih preimushchestv u nih net, a nekotorye programmy slishkom slozh- ny i slishkom veliki, chtoby ih mozhno bylo preobrazovat' v tip COM. Privyazka - eto process ustanovki adresov, svyazannyh s segment- nym registrom. Naprimer, programma mozhet ukazyvat' na nachalo oblasti dannyh sleduyushchim kodom: MOV DX,OFFSET DATA_AREA MOV AX,SEG DATA_AREA MOV DS,AX Smeshchenie v DX svyazano s ustanovkoj segmentnogo registra DS. No kakoe znachenie dolzhen prinimat' sam DS? Programma trebuet abso- lyutnyj adres, no nomer paragrafa, v kotorom budet raspolagat'sya DATA_AREA zavisit ot togo, v kakoe mesto v pamyati budet zagruzhena programma - a eto zavisit ot versii MS DOS, a takzhe ot togo, kakie rezidentnye programmy budut nahodit'sya v mladshih adresah pamyati. Po etoj prichine vo vremya komponovki programmy mozhno tol'- ko ustanovit' nekotorye segmentnye znacheniya cherez smeshcheniya otno- sitel'no nachala programmy. Zatem, kogda DOS osushchestvlyaet privyaz- ku, znachenie nachal'nogo adresa programmy pribavlyaetsya k segment- nym znacheniyam, davaya absolyutnye adresa, trebuemye v segmentnom registre. Na ris. 1-6 pokazan process privyazki. Fajly COM ne nuzhdayutsya v privyazke, poskol'ku oni hranyatsya v takom vide, chto ne nuzhdayutsya v fiksacii segmenta. Vse v programme hranitsya otnositel'no nachala kodovogo segmenta, vklyuchaya vse dan- nye i stek. Po etoj prichine vsya programma ne mozhet prevyshat' 65535 bajt po dline, chto sootvetstvuet maksimal'nomu smeshcheniyu, kotoroe sushchestvuet v ispol'zuemoj sheme adresacii (poskol'ku verhnyaya chast' etogo bloka zanyata stekom, to real'noe prostranstvo dostupnoe dlya koda i dannyh nemnogo men'she chem 65535 bajt, hotya stekovyj segment pri neobhodimosti mozhet byt' vynesen za granicu 64K bajtnogo bloka). V fajlah COM vse segmentnye registry ukazy- vayut na nachalo PSP; sravnite s fajlami EXE, gde DS i ES iniciali- ziruyutsya analogichnym obrazom, no CS ukazyvaet na pervyj bajt sleduyushchij za PSP. Dlya predstavleniya programmy v vide fajla COM trebuetsya soblyu- denie sleduyushchih pravil: 1. Ne oformlyajte programmu v vide procedury. Vmesto etogo, pomestite v samoe nachalo metku, vrode START, i zavershite program- mu operatorom END START. 2. Pomestite v nachale programmy operator ORG 100H. |tot opera- tor ukazyvaet nachalo koda (t.e. ustanavlivaet schetchik kommand). Programmy COM nachinayutsya s 100H, chto yavlyaetsya pervym bajtom, sleduyushchim za PSP, poskol'ku CS ukazyvaet na nachalo PSP, kotoroe raspolozheno na 100H bajt nizhe. Dlya togo chtoby nachat' vypolnenie s lyubogo drugogo mesta pomestite po adresu 100H instrukciyu JMP. 3. Operator ASSUME dolzhen ustanavlivat' DS, ES i SS takim obrazom, chtoby oni sovpadali so znacheniem dlya kodovogo segmenta, naprimer, ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG. 4. Dannye programmy mogut pomeshchat'sya v lyubom meste programmy, do teh por, poka oni ne peremeshany s kodom. Luchshe nachinat' prog- rammy s oblasti dannyh, poskol'ku makroassembler mozhet vydavat' soobshcheniya ob oshibkah pri pervom prohode, esli imeyutsya ssylki na identifikator dannyh, kotoryj eshche ne obnaruzhen. Dlya perehoda k nachalu koda ispol'zujte v kachestve pervoj komandy programmy inst- rukciyu JMP. 5. Nel'zya ispol'zovat' fiksaciyu segmentov tipa MOV AX,SEG NEW_DATA. Dostatochno ukazaniya odnogo smeshcheniya metki. V chastnosti, nuzhno opuskat' obychnyj kod, ispol'zuemyj v nachale programmy dlya ustanovki segmenta dannyh, MOV AX,DSEG / MOV DS,AX. 6. Stekovyj segment polnost'yu opuskaetsya v nachal'nom kode. Ukazatel' steka inicializiruetsya na vershinu adresnogo prostranst- va 64K, ispol'zuemogo programmoj (napominaem, chto stek rastet vniz v pamyati). V programmah COM on dolzhen byt' sdelan men'she chem 64K, SS i SP mogut byt' izmeneny. Imejte vvidu, chto pri komponov- ke programmy komponovshchik vydast soobshchenie ob oshibke, ukazyvayushchee, chto segment steka otsutstvuet. Ignorirujte ego. 7. Zavershite programmu libo instrukciej RET, libo preryvaniem 20H. Preryvanie 20H - eto standartnaya funkciya dlya zaversheniya programmy i vozvrata upravleniya v DOS. Dazhe kogda programma za- vershaetsya instrukciej RET, na samom dele ispol'zuetsya preryvanie 20H. |to proishodit potomu, chto vershina steka pervonachal'no so- derzhit 0. Pri vypolnenii zavershayushchej instrukcii programmy RET, 0 vytalkivaetsya iz steka, perenaznachaya schetchik komand na nachalo PSP. Nahodyashchayasya v etoj yachejke funkciya 20H, vypolnyaetsya kak sle- duyushchaya instrukciya programmy, vyzyvaya peredachu upravleniya v DOS. Vse eto oznachaet, chto Vam ne nado pri starte programmy pomeshchat' na stek DS i 0 (PUSH DS / MOV AX,0 / PUSH AX), kak eto trebuetsya dlya EXE fajlov. Posle togo kak programma skonstruirovana takim obrazom, as- semblirujte i komponujte ee kak obychno. Zatem preobrazujte ee v formu COM c pomoshch'yu utility EXE2BIN, imeyushchejsya v MS DOS. Esli imya programmy, postroennoj komponovshchikom MYPROG.EXE, to prosto vvedi- te komandu EXE2BIN MYPROG. V rezul'tate Vy poluchite programmnyj fajl s imenem MYPROG.BIN. Vse chto Vam ostanetsya posle etogo sde- lat' - pereimenovat' etot fajl v MYPROG.COM. Vy mozhete takzhe srazu ispol'zovat' komandu EXE2BIN MYPROG MYPROG.COM, dlya poluche- niya fajla s rasshireniem COM. Nizkij uroven'. V dannom primere soderzhitsya polnaya korotkaya programma, kotoraya po ustanovke pereklyuchatelej opredelyaet kolichestvo nakopitelej v mashine i zatem vyvodit soobshchenie na ekran. Ona mozhet sluzhit' primerom korotkoj utility togo sorta, dlya kotoryh format COM idealen. CSEG SEGMENT ORG 100H ASSUME CS:CSEG, DS:CSEG, SS:CSEG ;---dannye START: JMP SHORT BEGIN ;perehod k kodu MESSAGE1 DB 'The dip switches are set for $' MESSAGE2 DB 'disk drive(s).$' ;---pechat' pervoj chasti soobshcheniya BEGIN: MOV AH,9 ;funkciya 9 preryvaniya 21H - vyvod MOV DX,OFFSET MESSAGE1 ;stroki INT 21H ;vyvodim stroku PUSH AX ;sohranyaem nomer funkcii na budushchee ;---poluchaem ustanovku pereklyuchatelej iz porta A mikroshemy 8255 IN AL,61H ;poluchaem bajt iz porta B OR AL,10000000B ;ustanavlivaem bit 7 OUT 61H,AL ;zamenyaem bajt IN AL,60H ;poluchaem ustanovku pereklyuchat. AND AL,11000000B ;vydelyaem starshie 2 bita MOV CL,6 ;podgotovka k sdvigu AL vpravo SHR AL,CL ;sdvigaem 2 bita v nachalo ADD AL,49 ;dobavlyaem 1, chtoby schitat' s 1 ;i 48 dlya perevoda v ASCII MOV DL,AL ;pomeshchaem rezul'tat v DL MOV AL,61H ;dolzhny vosstanovit' port B AND AL,01111111B ;sbrasyvaem bit 7 OUT 61H,AL ;vozvrashchaem bajt ;---pechat' chisla nakopitelej MOV AH,2 ;funkciya 2 preryvaniya 21H INT 21H ;pechataem chislo iz DL ;---pechat' vtoroj poloviny soobshcheniya POP AX ;berem nomer funkcii so steka MOV DX,OFFSET MESSAGE2 INT 21H ;vyvodim stroku INT 20H ;zavershenie programmy CSEG ENDS END START Glava 2. Tajmery i zvuk. Razdel 1. Ustanovka i chtenie tajmera. Vse IBM PC ispol'zuyut mikroshemu tajmera 8253 (ili 8254) dlya soglasovaniya impul'sov ot mikroshemy sistemnyh chasov. CHislo cik- lov sistemnyh chasov preobrazuetsya v odin impul's, a posledova- tel'nost' etih impul'sov podschityvaetsya dlya opredeleniya vremeni, ili oni mogut byt' poslany na gromkogovoritel' komp'yutera dlya generacii zvuka opredelennoj chastoty. Mikroshema 8253 imeet tri identichnyh nezavisimyh kanala, kazhdyj iz kotoryh mozhet programmi- rovat'sya. Mikroshema 8253 rabotaet nezavisimo ot processora. Processor programmiruet mikroshemu i zatem obrashchaetsya k drugim delam. Takim obrazom 8253 dejstvuet kak chasy real'nogo vremeni - ona schitaet svoi impul'sy nezavisimo ot togo, chto proishodit v komp'yutere. Odnako, maksimal'nyj programmiruemyj interval sostavlyaet pribli- zitel'no 1/12 sekundy. Dlya podscheta intervalov vremeni v chasy i minuty nuzhny kakie-to drugie sredstva. Imenno po etoj prichine impul'sy ot nulevogo kanala mikroshemy tajmera nakaplivayutsya v peremennoj, nahodyashchejsya v oblasti dannyh BIOS. |tot process poka- zan na ris. 2-1. |to nakoplenie obychno nazyvaetsya podschetom vre- meni sutok. 18.2 raza v sekundu vyhod kanala 0 obrabatyvaetsya apparatnym preryvaniem (preryvaniem tajmera), kotoroe nenadolgo ostanavlivaet processor i uvelichivaet schetchik vremeni sutok. CHislo 0 sootvetstvuet polnochi 12:00; kogda schetchik dostigaet znacheniya ekvivalentnogo 24 chasam, on sbrasyvaetsya na nol'. Drugoe vremya v techenie sutok legko opredelyaetsya deleniem pokazatelya schetchika na 18.2 dlya kazhdoj sekundy. Schetchik vremeni sutok is- pol'zuetsya v bol'shinstve operacij, svyazannyh so vremenem. 2.1.1 Programmirovanie mikroshemy tajmera 8253/8254. Kazhdyj iz treh kanalov mikroshemy tajmera 8253 (8254 dlya AT) sostoit iz treh registrov. Dostup k kazhdoj gruppe iz treh regist- rov osushchestvlyaetsya cherez odin port; nomera portov ot 40H do 42H sootvetstvuyut kanalam 0 - 2. Port svyazan s 8-bitnym registrom vvoda/vyvoda, kotoryj posylaet i prinimaet dannye dlya etogo kana- la. Kogda kanal zaprogrammirovan, to cherez etot port posylaetsya dvuhbajtnoe znachenie, mladshij bajt snachala. |to chislo peredaetsya v 16-bitnyj registr zadvizhki (latch register), kotoryj hranit eto chislo i iz kotorogo kopiya pomeshchaetsya v 16-bitnyj registr schetchi- ka. V registre schetchika chislo umen'shaetsya na edinicu kazhdyj raz, kogda impul's ot sistemnyh chasov propuskaetsya cherez kanal. Kogda znachenie etogo chisla dostigaet nulya, to kanal vydaet vyhodnoj signal i zatem novaya kopiya soderzhimogo registra zadvizhki peredvi- gaetsya v registr schetchika, posle chego process povtoryaetsya. CHem men'she chislo v registre schetchika, tem bystree ritm. Vse tri kana- la vsegda aktivny: processor ne vklyuchaet i ne vyklyuchaet ih. Teku- shchee znachenie lyubogo iz registrov schetchika mozhet byt' prochitano v lyuboj moment vremeni, ne vliyaya na schet. Kazhdyj kanal imeet dve vhodnye i odnu vyhodnuyu linii. Vyhodnaya liniya vyvodit impul'sy, voznikayushchie v rezul'tate podscheta. Nazna- chenie etih signalov var'iruetsya v zavisimosti ot tipa IBM PC: Kanal 0 ispol'zuetsya sistemnymi chasami vremeni sutok. On usta- navlivaetsya BIOS pri starte takim obrazom, chto vydaet impul'sy priblizitel'no 18.2 raza v sekundu. 4-bajtnyj schetchik etih im- pul'sov hranitsya v pamyati po adresu 0040:006C (mladshij bajt hra- nitsya pervym). Kazhdyj impul's iniciiruet preryvanie tajmera (no- mer 8) i imenno eto preryvanie uvelichivaet pokazanie schetchika. |to apparatnoe preryvanie, poetomu ono obrabatyvaetsya vsegda, nezavisimo ot togo, chem zanyat processor, esli tol'ko razresheny apparatnye preryvaniya (sm. obsuzhdenie v [1.2.2]). Vyhodnaya liniya ispol'zuetsya takzhe dlya sinhronizacii nekotoryh diskovyh operacij, poetomu esli Vy izmenili ee znachenie, to Vam neobhodimo vosstano- vit' pervonachal'noe znachenie pered obrashcheniem k disku. Kanal 1 upravlyaet obnovleniem pamyati na vseh mashinah krome PCjr, poetomu ego luchshe ne trogat'. Vyhodnaya liniya etogo kanala svyazana s mikroshemoj pryamogo dostupa k pamyati [5.4.2] i ee im- pul's zastavlyaet mikroshemu DMA obnovit' vsyu pamyat'. Na PCjr kanal 1 sluzhit dlya preobrazovaniya vhodnyh dannyh s klaviatury iz posledovatel'noj v parallel'nuyu formu. PCjr ne ispol'zuet mikros- hemu pryamogo dostupa k pamyati, poetomu kogda on vmesto etogo progonyaet dannye cherez processor, to preryvanie ot tajmera zablo- kirovano. Kanal 1 ispol'zuetsya dlya podscheta zablokirovannyh im- pul'sov chasov vremeni sutok, s tem chtoby mozhno bylo obnovit' znachenie schetchika posle zaversheniya diskovyh operacij. Kanal 2 svyazan s gromkogovoritelem komp'yutera i on proizvodit prostye pryamougol'nye impul'sy dlya generacii zvuka. Programmisty imeyut bol'shij kontrol' nad vtorym kanalom, chem nad ostal'nymi. Prostye zvuki mogut generirovat'sya odnovremenno s drugimi prog- rammnymi operaciyami, a bolee slozhnye zvukovye effekty mogut byt' dostignuty za schet ispol'zovaniya processora. Kanal 2 mozhet byt' otsoedinen ot gromkogovoritelya i ispol'zovat'sya dlya sinhroniza- cii. Nakonec, vyhodnaya liniya kanala 2 svyazana s dinamikom komp'yu- tera. Odnako dinamik ne budet generirovat' zvuk do teh por poka ne sdelany opredelennye ustanovki mikroshemy interfejsa s perife- riej 8255. Dve vhodnye linii dlya kazhdogo kanala sostoyat iz linii chasov, kotoraya peredaet signal ot mikroshemy sistemnyh chasov i linii, nazyvaemoj vorotami (gate), kotoraya vklyuchaet i vyklyuchaet signal ot chasov. Vorota vsegda otkryty dlya signalov chasov po kanalam 0 i 1. No oni mogut byt' zakrytymi dlya kanala 2, chto pozvolyaet neko- torye special'nye manipulyacii so zvukom. Vorota zakryvayutsya usta- novkoj mladshego bita porta s adresom 61H, kotoryj yavlyaetsya re- gistrom mikroshemy 8255; sbros etogo bita snova otkryvaet vorota. |ta mikroshema obsuzhdaetsya v [1.1.1]. Otmetim chto - kak i vyhod kanala 2 - bit 1 porta 61H svyazan s dinamikom i takzhe mozhet is- po'zovat'sya dlya generacii zvuka. Na ris. 2-2 privedena diagramma mikroshemy tajmera 8253. Mikroshema tajmera mozhet ispol'zovat'sya neposredstvenno dlya vremennyh operacij, no eto redko byvaet udobnym. Vvod s chasov proizvoditsya 1.19318 millionov raz v sekundu (dazhe na AT, gde sistemnye chasy idut bystree, mikroshema tajmera poluchaet signal s chastotoj 1.19 Mgc). Poskol'ku maksimal'noe chislo, kotoroe mozhet hranit'sya v 16 bitah, ravno 65535 i poskol'ku eto chislo delitsya na chastotu impul'sov ot chasov, ravnuyu 18.2, to maksimal'nyj voz- mozhnyj interval mezhdu impul'sami raven priblizitel'no 1/12 sekun- dy. Poetomu bol'shinstvo vremennyh operacij ispol'zuyut schetchik vremeni sutok BIOS. Dlya podscheta vremeni chitaetsya znachenie vreme- ni sutok i sravnivaetsya s nekotorym ranee zapomnennym znacheniem dlya opredeleniya chisla impul'sov, proshedshih s togo momenta. Spe- cial'nyj sposob, opisannyj v [2.1.7], pozvolyaet ispo'zovat' schet- chik vremeni sutok dlya operacij v real'nom vremeni. 8253 predostavlyaet razrabotchikam oborudovaniya 6 rezhimov raboty dlya kazhdogo kanala. Programmisty obychno ogranichivayutsya tret'im rezhimom, kak dlya kanala 0 pri sinhronizacii, tak i dlya kanala 2 dlya sinhronizacii ili generacii zvuka. V etom rezhime, kak tol'ko registr zadvizhki poluchaet chislo, on nemedlenno zagruzhaet kopiyu v registr schetchika. Kogda znachenie v schetchike dostigaet nulya re- gistr zadvizhki mgnovenno perezagruzhaet schetchik i t.d. V techenie poloviny otscheta vyhodnaya liniya vklyuchena, a v techenie poloviny - vyklyuchena. V rezul'tate poluchayutsya pryamougol'nye volny, kotorye odinakovo prigodny kak dlya generacii zvuka, tak i dlya podscheta. 8-bitnyj komandnyj registr upravlyaet sposobom zagruzki chisel v kanal. Adres porta dlya etogo registra raven 43H. Komandnomu re- gistru peredaetsya bajt, kotoryj govorit kakoj kanal programmiro- vat', v kakom rezhime, a takzhe odin ili oba bajta registra zadvizh- ki dolzhny byt' peredany. On pokazyvaet takzhe budet li chislo v dvoichnoj ili BCD (dvoichnokodirovannoj desyatichnoj) forme. Znachenie bitov etogo registra takovo: bit 0 esli 0, dvoichnye dannye, inache BCD 3-1 nomer rezhima, 1 - 5 (000 - 101) 5-4 tip operacii: 00 = peredat' znachenie schetchika v zadvizhku 01 = chitat'/pisat' tol'ko starshij bajt 10 = chitat'/pisat' tol'ko mladshij bajt 11 = chitat'/pisat' starshij bajt, potom mladshij 7-6 nomer programmiruemogo kanala, 0 - 2 (00 -10) Koroche govorya, dlya programmirovaniya mikroshemy 8253 nado vy- polnit' tri osnovnyh shaga. Posle togo kak tretij shag zavershen, zaprogrammirovannyj kanal nemedlenno nachinaet funkcionirovat' po novoj programme. 1. Poslat' v komandnyj registr (43H) bajt, predstavlyayushchij cepochku bitov, kotorye vybirayut kanal, status chteniya/zapisi, rezhim operacii i formu predstavleniya chisel. 2. Dlya kanala 2 nado razreshit' signal ot chasov, ustanoviv v 1 bit 0 porta s adresom 61H. (Kogda bit 1 etogo registra ustanovlen v 1, to kanal 2 upravlyaet dinamikom. Sbros'te ego v 0 dlya opera- cij sinhronizacii.) 3. Vychislite znachenie schetchika ot 0 do 65535, pomestite ego v AX, i poshlite snachala mladshij, a zatem starshij bajt v registr vvoda/vyvoda kanala (40H - 42H). Kanaly mikroshemy 8253 rabotayut vsegda. Po etoj prichine prog- rammy vsegda dolzhny vosstanavlivat' nachal'nye ustanovki registrov 8253 pered zaversheniem. V chastnosti, esli pri zavershenii program- my generiruetsya zvuk, to on budet prodolzhat'sya dazhe posle togo, kak MS DOS poluchit upravlenie i zagruzit druguyu programmu. Imejte eto vvidu pri napisanii procedury vyhoda po Ctrl-Break [3.2.8]. Nizkij uroven'. V dannom primere kanal 0 programmiruetsya na drugoe znachenie, chem ustanovleno BIOS pri starte. Prichina izmeneniya ustanovki sostoit v tom, chtoby izmenit' interval izmeneniya schetchika vremeni sutok na bol'shuyu velichinu, chem 18.2 raza v sekundu. CHastota ob- novleniya schetchika izmenyaetsya, skazhem, na 1000 raz v sekundu, s cel'yu provedeniya tochnyh laboratornyh izmerenij. Znachenie zadvizhki dolzhno byt' 1193 (1193180 taktov v sekundu / 10000). Kak chitat' tekushchee znachenie registra schetchika sm. v primere [2.1.8]. Pered diskovymi operaciyami original'noe znachenie zadvizhki dolzhno byt' vosstanovleno, poskol'ku kanal 0 ispol'zuetsya dlya sinhronizacii diskovyh operacij. Maksimal'no vozmozhnoe znachenie - 65535 taktov chasov mezhdu impul'sami ot kanala - mozhet byt' dostignuto zasylkoj 0 v registr zadvizhki (0 nemedlenno prevrashchaetsya v 65535 pri umen'shenii na edinicu. ;---ustanovka registrov vvoda/vyvoda COMMAND_REG EQU 43H ;adres komandnogo registra CHANNEL_0 EQU 40H ;adres kanala 0 MOV AL,00110110B ;ustanovka bitov dlya kanala 2 OUT COMMAND_REG,AL ;zasylka v komandnyj registr ;---posylka schetchika v zadvizhku MOV AX,1193 ;schetchik dlya 100 impul'sov/sek. OUT CHANNEL_2,AL ;posylka mladshego bajta MOV AL,AH ;gotovim dlya posylki starshij bajt OUT CHANNEL_2,AL ;posylka starshego bajta 2.1.2 Ustanovka/chtenie vremeni. Pri starte MS DOS zaprashivaet u pol'zovatelya tekushchee vremya. Vvedennoe znachenie pomeshchaetsya v 4 bajta, hranyashchie schetchik vremeni sutok (nachinaya s 0040:006C, mladshij bajt hranitsya pervym). No snachala ono preobrazuetsya v formu, v kotoroj podschityvaetsya vremya sutok, t.e. vremya preobrazuetsya v chislo vosemnadcatyh dolej se- kundy, proshedshih s polnochi. |to chislo postoyanno obnovlyaetsya 18.2 raz v sekundu preryvaniem tajmera. Kogda poyavlyaetsya ocherednoj zapros na vremya, to tekushchee znachenie schetchika vremeni sutok preobrazuetsya obratno v privychnyj format chasy-minuty-sekundy. Esli pri starte ne bylo vvedeno znacheniya, to schetchik ustanavli- vaetsya v nol', kak budto sejchas polnoch'. Komp'yutery snabzhennye mikroshemoj kalendarya-chasov mogut avtomaticheski ustanavlivat' schetchik vremeni sutok. Vysokij uroven'. TIME$ ustanavlivaet ili poluchaet vremya v vide stroki chch:mm:ss, gde chasy menyayutsya ot 0 do 23, nachinaya s polunochi. Dlya 5:10 dnya: 100 TIME$ = "17:10:00" 'ustanovka vremeni 110 PRINT TIME$ 'vyvod vremeni Poskol'ku TIME$ vozvrashchaet stroku, to dlya vydeleniya otdel'nyh chastej pokazaniya chasov mozhno ispol'zovat' strokovye funkcii MID$, LEFT$ i RIGHT$. Naprimer, chtoby preobrazovat' vremya 17:10:00 v 5:10 Vy dolzhny vyrezat' stroku simvolov, sootvetstvuyushchuyu chasam, preobrazovat' ee v chislovoj vid (ispol'zuya funkciyu VAL), vychest' 12, a zatem predstavit' rezul'tat opyat' v vide stroki: 100 T$ = TIME$ 'poluchaem stroku vremeni 110 HOUR$ = LEFT$(T$,2) 'vydelyaem znachenie chasov 120 MINUTES$ = MID$(T$,4,2) 'vydelyaem znachenie minut 130 NEWHOUR = VAL(HOUR$) 'preobrazuem chasy v chislo 140 IF NEWHOUR > 12 THEN NEWHOUR = NEWHOUR - 12 150 NEWHOUR$ = STR$(NEWHOUR) 'novoe znachenie v stroku 160 NEWTIME$ = NEWHOUR$ + ":" + MINUTES$ 'delaem novuyu stroku Srednij uroven'. MS DOS predostavlyaet preryvaniya dlya chteniya i ustanovki vreme- ni, proizvodya neobhodimye preobrazovaniya mezhdu znacheniem schetchika vremeni sutok i chasami-minutami-sekundami. Vremya vydaetsya s toch- nost'yu do 1/100 sekundy, no poskol'ku schetchik vremeni sutok ob- novlyaetsya s chastotoj v pyat' raz men'shej, to pokazaniya sotyh se- kund ochen' priblizhennye. Funkciya 2CH preryvaniya 21H vydaet vremya, a funkciya 2DH - ustanavlivaet ego. V oboih sluchayah CH soderzhit chasy (ot 0 do 23, gde 0 sootvetstvuet polnochi), CL - minuty (ot 0 do 59), DH - sekundy (ot 0 do 59) i DL - sotye doli sekund (ot 0 do 99). Krome togo pri poluchenii vremeni funkciej 2CH, AL soderzhit nomer dnya nedeli (0 = voskresen'e). Znachenie dnya budet vernym tol'ko esli byla ustanovlena data. DOS vychislyaet nomer dnya nedeli po date. Otmetim takzhe, chto pri ustanovke vremeni funkciej 2DH, AL otmechaet pravil'nost' vvedennogo znacheniya vremeni (0 = pra- vil'no, FF = nepravil'no). ;---ustanovka vremeni MOV CH,HOURS ;vvodim znacheniya vremeni MOV CL,MINUTES ; MOV DH,SECONDS ; MOV DL,HUNDREDTHS ; MOV AH,2DH ;nomer funkcii ustanovki vremeni INT 21H ;ustanavlivaem vremya CMP AH,0FFH ;proveryaem pravil'nost' znacheniya JE ERROR ;perehod na obrabotku oshibki ;---poluchenie vremeni MOV AH,2CH ;nomer funkcii polucheniya vremeni INT 21H ;poluchaem vremya MOV DAY_OF_WEEK,AH ;poluchaem den' nedeli iz AH Nizkij uroven'. Esli Vy izmenili skorost' impul'sov kanala 1 mikroshemy 8253 dlya special'nyh prilozhenij, to Vam neobhodimo napisat' svoyu pro- ceduru dekodirovaniya pokazanij schetchika vremeni sutok. BIOS poz- volyaet diapazon znachenij schetchika ot 0 do 1.573 milliona i eto mozhet byt' izmeneno tol'ko putem izmeneniya preryvaniya tajmera. Poetomu chasy, real'no pokazyvayushchie sotye doli sekundy, ne mogut rabotat' 24 chasa bez special'no napisannoj programmy. Otmetim takzhe, chto bajt 0040:0070 ustanavlivaetsya v nol' pri starte, a zatem uvelichivaetsya na 1 (ne bol'she) po hodu chasov. 2.1.3 Ustanovka/chtenie daty. Pri vklyuchenii komp'yutera MS DOS zaprashivaet u pol'zovatelya tekushchie datu i vremya. Vremya zapisyvaetsya v oblasti dannyh BIOS. Data zhe soderzhitsya v peremennoj v COMMAND.COM. Ona hranitsya v formate treh posledovatel'nyh bajtov, kotorye soderzhat sootvetst- venno den' mesyaca, nomer mesyaca i nomer goda, nachinaya s 0, gde 0 sootvetstvuet 1980 godu. V otlichii ot schetchika vremeni sutok, adres daty v pamyati menyaetsya s izmeneniem versii DOS i polozheniem v pamyati COMMAND.COM. Po etoj prichine dlya polucheniya daty vsegda nado ispol'zovat' gotovye utility Bejsika ili MS DOS, a ne obra- shchat'sya k etoj peremennoj napryamuyu. Mashiny, oborudovannye mikroshemoj kalendarya-chasov, avtomati- cheski ustanavlivayut vremya i datu s pomoshch'yu special'noj programmy (obychno zapuskaemoj pri starte cherez fajl AUTOEXEC.BAT). Kak poluchit' dostup k mikrosheme kalendarya-chasov, sm. [2.1.4]. Otme- tim takzhe, chto kogda schetchik vremeni sutok BIOS perehodit cherez otmetku 24 chasov, MS DOS menyaet datu. Vysokij uroven'. Operator Bejsika DATE$ ustanavlivaet ili poluchaet datu v vide stroki formata MM-DD-GGGG. Mozhno ispol'zovat' kosuyu chertu (/) vmesto defisa (-). Pervye dve cifry goda mogut byt' opushcheny. Dlya 31-go oktyabrya 1984 g.: 100 DATE$ = "10/31/84" 'ustanovka daty 110 PRINT DATE$ 'vyvod daty ... i na displee budet vyvedeno: 10-31-1984. Srednij uroven'. Funkcii 2AH i 2BH preryvaniya 21H poluchayut i ustanavlivayut datu. Dlya polucheniya daty pomestite v AH 2AH i vypolnite preryva- nie. Pri vozvrate CX budet soderzhat' god v vide chisla ot 0 do 119, chto sootvetstvuet diapazonu let 1980 - 2099 (mozhno skazat' chto vydaetsya smeshchenie otnositel'no 1980 g.). DH soderzhit nomer mesyaca, a DL - den'. MOV AH,2AH ;nomer funkcii polucheniya daty INT 21H ;poluchenie daty MOV DAY,DL ;den' iz DL MOV MONTH,DH ;mesyac iz DH ADD CX,1980 ;dobavlyaem bazu k godu MOV YEAR,CX ;poluchaem nomer goda Dlya ustanovki daty pomestite den', mesyac i god v te zhe regist- ry i vypolnite funkciyu 2BH. Esli znacheniya, ukazannye dlya daty neverny, to v AL budet vozvrashcheno FF, v protivnom sluchae - 0. MOV DL,DAY ;pomeshchaem den' v DL MOV DH,MONTH ;pomeshchaem mesyac v DH MOV CX,YEAR ;pomeshchaem god v CX SUB CX,1980 ;berem smeshchenie otnositel'no 1980 MOV AH,2BH ;nomer funkcii ustanovki daty INT 21H ;ustanovka daty CMP AH,0FFH ;proveryaem uspeshnost' operacii JE ERROR ;nevernaya data, idem na obrabotku oshibki 2.1.4 Ustanovka/chtenie chasov real'nogo vremeni. CHasy real'nogo vremeni imeyut svoj sobstvennyj processor, koto- ryj mozhet podschityvat' vremya ne vliyaya na drugie komp'yuternye ope- racii. Oni imeyut takzhe nezavisimyj istochnik pitaniya, ispol'zuemyj kogda komp'yuter vyklyuchen. Programmno mozhno kak chitat', tak i ustanavlivat' chasy rel'nogo vremeni. Obychno imeetsya dopolnitel'- noe programmnoe obespechenie, kotoroe ustanavlivaet schetchik vreme- ni sutok BIOS i peremennuyu daty DOS takim obrazom, chtoby oni sootvetstvovali tekushchim pokazaniyam chasov real'nogo vremeni. No mozhno programmno proverit' sootvetstvie mezhdu nimi i pri obnaru- zhenii raznoglasij prinyat' neobhodimye mery. Razlichnye ustanovki vremeni i daty osushchestvlyayutsya cherez nabor adresov portov. Mnogie mnogofunkcional'nye platy rasshireniya dlya IBM PC imeyut chasy real'nogo vremeni, no, k sozhaleniyu, net stan- dartnoj mikroshemy i diapazona adresov portov. AT oboruduetsya chasami real'nogo vremeni, osnovannymi na mikrosheme MC146818 firmy Motorola, kotorye ispol'zuyut te zhe registry, chto i mikros- hema, soderzhashchaya dannye o konfiguracii sistemy. Dostup k etim registram mozhno poluchit', poslav snachala nomer trebuemogo regist- ra v port 70H, a zatem prochitav znachenie registra cherez port 71H. Registry, svyazannye s chasami, sleduyushchie: Nomer registra Funkciya 00H Sekundy 01H Sekundnaya trevoga 02H Minuty 03H Minutnaya trevoga 04H CHasy 05H CHasovaya trevoga 06H Den' nedeli 07H Den'