ovara. V processe poiska adres elementov tablicy nomerov dolzhen uvelichi vat'sya na 3, a adres elementov tablicy cen - na 2. Esli sohranit' chislo vypolnennyh ciklov pri poiske na ravno, to, umnozhiv eto chislo na 2 (SHL sdvig vlevo na odin bit), poluchim otnositel'nyj adres iskomogo znacheniya ceny. (Nachal'noe znachenie schetchika ciklov dolzhno byt' ravno -1). ® Pomnite, chto DB pozvolyaet opredelyat' znacheniya, ne prevyshayushchie 256, a DW zapisyvaet bajty v obratnoj posledovatel'nosti. Komandy CMP i CMPSW predpolagayut, chto bajty v sravnivaemyh slovah imeyut obratnuyu posledovatel'nost'. ® Esli tablica podvergaetsya chastym izmeneniyam, ili dolzhna byt' dostupna neskol'kim programmam, to zapishite ee na disk. Dlya vneseniya izmenenij v tablicu mozhno razrabotat' special'nuyu programmu modifikacii. Lyubye programmy mogut zagruzhat' tablicu s diska i pri obnovleniyah tablicy sami programmy ne nuzhdayutsya v izmeneniyah. ® Bud'te osobenno vnimatel'ny pri kodirovke sortiruyushchih programm. Pol'zujtes' trassirovkoj dlya testirovaniya, tak kak malejshaya oshibka mozhet privesti k nepredskazue mym rezul'tatam. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ Assembler dlya IBM PC. Glava 14 34 14.1. Opredelite tablicu, kotoraya soderzhit imena dnej nedeli, nachinaya s voskreseniya. 14.2 Predpolagaya, chto voskresen'e ravno 1, napishite komandy pryamogo dostupa k tablice, opredelennoj v voprose 14.1. ispol'zujte lyubye podhodyashchie imena. 14.3 Opredelite tri otdel'nyh svyazannyh tablicy, soderzhashchih sleduyushchie dannye: a) chislovye elementy: 06, 10, 14, 21, 24; b) elementy naimenovanij: videokassety, priemniki, modemy, klaviatury, diskety; v) ceny: 93.95, 82.25, 90.67, 85.80, 13.85. 14.4 Sostav'te programmu, pozvolyayushchuyu vvodit' chislovoj element (ITEMIN) i kolichestvo (QTYIN) s klaviatury. Ispol'zuya tablicu iz voprosa 14.3, razrabotajte programmu tablichnogo poiska elementa ravnogo ITEMIN. Vydelite iz tablic naimenovanie i cenu. Rasschitajte velichinu stoimosti (Kolichestvo h Cena ) i vydajte na ekran naimenovanie i stoimost'. 14.5 Ispol'zuya opisanie tablicy iz voprosa 14.3, sostav'te procedury: a) peresylayushchuyu soderzhimoe odnoj tablicy v novuyu (pustuyu) tablicu; b) sortiruyushchuyu soderzhimoe novoj tablicy v voshodyashchej posledovatel'nosti. Assembler dlya IBM PC. Glava 15 45 GLAVA 15. Diskovaya pamyat' I: Organizaciya ------------------------------------------------------------ Diskovaya pamyat' I: Organizaciya Cel': Rassmotret' osnovnye formaty zapisej v pamyati na tverdom diske (vinchestere) i na diskete, vklyuchaya oglavlenie i tablicu raspredeleniya fajlov. VVEDENIE ------------------------------------------------------------ Disk yavlyaetsya rasprostronennym sredstvom dlya bolee ili menee dolgovremennogo hraneniya dannyh. Processy obrabotki dannyh na tverdom diske (vinchestre) analogichny processam dlya gibkih diskov (disket), za isklyucheniem togo, chto vozmozhno potrebuetsya obespechit' puti dlya dostupa k mnogochislennym podoglavleniyam vinchestera. Dlya obrabotki fajlov polezno oznakomit'sya s organizaciej diskovoj pamyati. Kazhdaya ctorona standartnoj 5 1/4 dyujmovoj diskety soderzhit 40 koncentriches kih dorozhek, pronumerovannyh ot 00 do 39. Na kazhdoj dorozhke formatiruetsya vosem' ili devyat' sektorov po 512 bajtov kazhdyj. Ddannye zapisyvayutsya na disk v vide fajlov, analogichno tomu, kak vy zapisyvaete assemblernye programmy. Hotya na tipy dannyh, kotorye mozhno hranit' v fajle, ne sushchestvuet kakih-libo ogranichenij, tipichnyj pol'zovatel'skij fajl soderzhit spiski zakazchikov, opisi tovarov i predlozhenij ili spiski imen i adresov. Kazhdaya zapis' soderzhit informaciyu o konkretnom zakazchike ili opisanie tovara. Vnutri fajla vse zapisi imeyut odinakovuyu dlinu i format. Zapis' mozhet soderzhat' odno ili neskol'ko polej. Fajl zakazchikov, naprimer, mozhet sostoyat' iz zapisej, v kotorye vhodit nomer zakazchika, imya zakazchika i dolgovoj balans. |ti zapisi mogut byt' raspolozheny v poryadke vozrastaniya nomerov zakazchikov sleduyushchim obrazom: +--+---+-----++--+---+-----++--+---+-----+ +--+---+-----+ ||1|imya|summa|||2|imya|summa|||3|imya|summa|...||n|imya|summa| +--+---+-----++--+---+-----++--+---+-----+ +--+---+-----+ Dlya programmirovaniya diskovyh fajlov sleduet v obshchih chertah oznakomitsya tol'ko s koncepciej i terminologiej. Esli v dannoj glave razmery diska ne ukazyvayutsya, to predpolagaetsya disk 5 1/4" formata. EMKOSTX DISKA ------------------------------------------------------------ Emkost' gibkih diskov: Versiya CHislo CHislo CHislo Vsego Assembler dlya IBM PC. Glava 15 46 dorozhek sektorov bajtov v na dvuh na storone na dorozhke sektore storonah Do DOS 2.0 40 8 512 327 680 DOS 2.0 i posle 40 9 512 368 640 Vysokaya plotnost' 80 15 512 1 228 800 3 1/2" 80 9 512 737 280 Emkost' tverdyh diskov: Versiya CHislo CHislo CHislo Vsego dorozhek sektorov bajtov v na 4-h na storone na dorozhke sektore storonah 10 megabajt 306 17 512 10 653 696 20 megabajt 614 17 512 21.377.024 Ukazanie storony (golovki), dorozhki ili sektora na diske osushchestvlyaetsya po nomeru. Dlya storony i dorozhki otschet vedetsya s 0, a dlya sektora - s 1. OGLAVLENIE DISKA (KATALOG) ------------------------------------------------------------ Dlya togo, chtoby organizovat' hranenie informacii na diske, operacionnaya sistema DOS rezerviruyut opredelennye sektora dlya svoih nuzhd. Organizaciya dannyh na diskete ili na tverdom diske sushchestvenno zavisit ot ih emkosti. Formati rovannaya dvuhstoronyaya disketa s devyat'yu sektoromi na dorozhke soderzhit sleduyushchuyu sistemnuyu informaciyu: Storona Dorozhka Sektor 0 0 1 Zapis' nachal'noj zagruzki 0 0 2-3 Tablica raspredeleniya fajlov (FAT) 0 0 4-7 Katalog 1 0 1-3 Katalog 1 0 4 ... Fajly dannyh Oblast' zapisej dannyh nachinaetsya s tret'ego sektora na 1-j storone 0-j dorozhki i prodolzhaetsya do devyatogo sektora. Sleduyushchie zapisi zanosyatsya na 0-yu storonu 1-j dopozhki, zatem na 1-yu storonu 1-j dorozhki, zatem na 0-yu storonu 2-j dorozhki i t.d. Takaya osobennost' zapolneniya diskovoj pamyati na protivopolozhnyh dorozhkah snizhaet chislo peremeshchenij golovki diskovoda. Dannyj metod ispol'zuetsya kak dlya gibkih, tak i dlya tverdyh diskov. Pri ispol'zovanii utility FORMAT /S dlya formatizacii diskety, moduli DOS IBMBIO.COM i IBMDOS.COM zapisyvaetsya v pervye sektora oblasti dannyh. Assembler dlya IBM PC. Glava 15 47 Vse fajly, dazhe men'shie 512 bajt (ili kratnye 512), nachinayutsya na granice sektora. Dlya kazhdogo fajla DOS sozdaet na nulevoj dopozhke diska element oglavleniya. Kazhdyj takoj element opisyvaet imya, datu, razmer i raspolozhenie fajla na diske. |lementy oglavleniya imeyut sleduyushchij format: Bajt Naznachenie 0-7 Imya fajla, opredelyaemoe iz programmy, sozdavshej dannyj fajl. Pervyj bajt mozhet ukazyvat' na status fajla: shest.00 oboznachaet, chto dannyj fajl ne ispol'zuetsya, shest.E5 - fajl udalen, shest. 2E - element podoglavleniya. 8-10 Tip fajla 11 Atribut fajla, opredelyayushchij ego tip: shest.00 - obychnyj fajl; shest.01 - fajl mozhno tol'ko chitat'; shest.02 - "spryatannyj" fajl; shest.04 - sistemnyj fajl DOS; shest.08 - metka toma; shest.10 - podoglavlenie; shest.20 - arhivnyj fajl (dlya tverdogo diska). 12-21 Zarezervirovano dlya DOS. 22-23 Vremya dnya, kogda fajl byl sozdan ili poslednij raz izmenyalsya, v sleduyushchim dvoichnom formate: |chchchchchmmmmmmsssss| 24-25 Data sozdaniya ili poslednego izmeneniya fajla, szhataya v dva slova v sleduyushchem dvoichnom formate: |gggggggm|mmmddddd| gde god nachinaetsya s 1980 i mozhet prinimat' znacheniya ot 0 do 119, mesyac - ot 1 do 12, a den' - ot 1 do 31. 26-27 Nachal'nyj klaster fajla. Otnositel'nyj nomer poslednih dvuh sektorov kataloga. Pervyj fajl dannyh (bez COM-modulej DOS) nachinaetsya na otnositel'nom klastere 002. Tekushchaya storona, dorozhka i klaster zavisyat ot emkosti diska. 28-31 Razmer fajla v bajtah. Pri sozdanii fajla DOS vychislyaet i zapisyvaet razmer fajla v eto pole. Vse polya v kataloge diska, prevyshayushchie odin bajt, zapisyvayutsya v obratnoj posledovatel'nosti bajtov. TABLICA RASPREDELENIYA FAJLOV ------------------------------------------------------------ Naznachenie tablicy raspredeleniya fajlov (FAT - File Allocation Table) - raspredelenie diskovogo prostranstva dlya fajlov. Esli vy sozdaete novyj fajl ili izmenyaete sushchestvuyushchij, to DOS menyaet elementy tablicy fajlov v Assembler dlya IBM PC. Glava 15 48 sootvetstvii s raspolozheniem fajla na diske. Zapis' nachal'noj zagruzki nahoditsya na sektore 1, dalee na sektore 2 nachinaetsya FAT. FAT soderzhit elementy dlya kazhdogo klastera, dlina elementov FAT zavisit ot ustrojstva diskovoj pamyati. Klaster dlya odnostoronnih disket predstavlyaet soboj odin sektor, dlya dvuhstoronnih disket - smezhnuyu paru sektorov. Odno i to zhe chislo elementov v FAT opredelyaet v dva paza bol'she dannyh dlya dvuhstoronnih disket, chem dlya odnostronnih. Pervye bajty FAT opredelyayut tip ustrojstva: FE Odnostoronnyaya na 8 sektorov FC Odnostoronnyaya na 9 sektorov FF Dvuhstoronnyaya na 8 sektorov FD Dvuhstoronnyaya na 9 sektorov F9 Povyshennaya emkost' (1,2 megabajta) F8 Tverdyj disk Vtoroj i tretij bajty poka soderzhat FFFF. V sleduyushchej tablice pokazana organizaciya dannyh dlya neskol'kih tipov ustrojstv (privedeny nachal'nye i konechnye nomera sektorov). Kolonka "Klaster" predstavlyaet chislo sektorov v klastere: Ustrojstvo diska Zapis' FAT Katalog Klaster nach.zagr. Odnostoronnij, 8 sektorov 1 2-3 4-7 1 Odnostoronnij, 9 sektorov 1 2-5 6-9 1 Dvuhstoronnij, 8 sektorov 1 2-3 4-10 2 Dvuhstoronnij, 9 sektorov 1 2-5 6-12 2 Povyshennaya emkost' (1,2 M) 1 2-15 16-29 1 Tverdyj disk XT 1 2-17 18-49 8 Tverdyj disk AT 1 2-838 4-115 4 Nachinaya s chetvertogo bajta, elementy FAT opredelyayut sektora. Kazhdyj takoj element imeet dlinu 12 bitov. (V versii DOS 3 i starshe elementy FAT dlya tverdogo diska mogut imet' dlinu 16 bitov). Dva pervyh elementa FAT, izvestnye kak otnositel'nye sektora 000 i 001, sootvetstvenno, ukazyvayut na dva poslednih sektora oglavleniya, opredelyaya ego razmer i format. Pervyj fajl dannyh nachinaetsya na otnositel'nom sektore 002. Kazhdyj element FAT sostoit iz treh shest.cifr (12 bitov), kotorye ukazyvayut na harakter ispol'zovaniya konkretnogo sektora: 000 svobodnyj klaster, nnn otnositel'nyj nomer sleduyushchego klastera dlya fajla, FF7 neispol'zuemyj klaster (sbojnaya dorozhka), FFF poslednij klaster fajla. Predpolozhim, naprimer, chto disketa soderzhit tol'ko odin fajl s imenem PAYROLL.ASM, zanimayushchij otnositel'nye sektora 002, 003 i 004. |lement oglavleniya dlya etogo fajla soderzhit Assembler dlya IBM PC. Glava 15 49 imya fajla PAYROLL, tip - ASM, shest.00 dlya obychnogo fajla, datu sozdaniya, 002 - nomer pervogo otnositel'nogo sektora fajla i razmer fajla v bitah. Tablica FAT v etom sluchae mozhet vyglyadet' sleduyushchim obrazom (krome togo, chto v kazhdoj pare bajty v obratnoj posledovatel'nosti): |lement FAT: |FDF|FFF|003|004|FFF|000|000|...|000| Otnositel'n.sektor: 0 1 2 3 4 5 6 ...konec Pervye dva elementa FAT ukazyvayut raspolozhenie kataloga na otnositel'nyh sektorah 000 i 001. Dlya vvoda rassmatrivaemogo fajla v pamyat', sistema vypolnyaet sleduyushchie dejstviya: 1. DOS poluchaet dostup k diskete i ishchet v kataloge imya PAYROLL i tip ASM. 2. Zatem DOS opredelyaet po katalogu polozhenie pervogo otnositel'nogo sektora fajla (002) i zagruzhaet soderzhi moe etogo sektora v bufernuyu oblast' v osnovnoj pamyati. 3. Nomer vtorogo sektora DOS poluchaet iz elementa FAT, sootvetstvuyushchego otnositel'nomu sektoru 002. Iz diagrammy, privedennoj vyshe, vidno, chto ztot element soderzhit 003. |to oboznachaet, chto fajl prodolzhaetsya v otnositel'nom sektore 003. DOS zagruzhaet soderzhimoe etogo sektora v bufer v osnovnoj pamyati. 4. Nomer tret'ego sektora DOS poluchaet iz elementa FAT, sootvetstvuyushchego otnositel'nomu sektoru 003. |tot element soderzhit 004, znachit fajl prodolzhaetsya v otnositel'nom sektore 004. DOS zagruzhaet srderzhimoe etogo sektora v bufer v osnovnoj pamyati. 5. |lement FAT dlya otnositel'nogo sektora 004 soderzhit shest.FFF, chto svidetel'stvuet o tom, chto bol'she net dannyh dlya etogo fajla. |lement kataloga soderzhit nomer nachal'nogo klastera dlya kazhdogo fajla, a FAT - shest.trehznachnye elementy, ukazyvayu shchie na raspolozhenie kazhdogo dopolnitel'nogo klastera, esli on imeetsya. Dlya togo, chtoby ukazat', naprimer, chto fajl soderzhit vse zapisi tol'ko v pervom klastere, tablica FAT dolzhna soderzhat' shest.FFF v elemente, predstavlyayushchem pervyj otnositel'nyj klaster. V kachestve prostogo primera rassmotrim element kataloga, ukazyvayushchij, chto nekotoryj fajl nachinaetsya v otnositel'nom klastere 15. Dlya lokalizacii pervogo elementa tablicy FAT neobhodimo: ® Umnozhit' 15 na 1,5, poluchim 22,5. ® Vypolnit' vyborku soderzhimogo bajtov 22 i 23 iz FAT. Prezhpolozhim, chto oni soderzhat F*FF. ® Perestavit' bajty: FFF*. Assembler dlya IBM PC. Glava 15 50 ® Tak kak nomer 15-nechetnyj, to pervye tri cifry - FFF ukazyvayut na otsutstvie drugih klasterov dlya dannogo fajla. Teper' rassmotrim fajl, kotoryj zanimaet chetyre klastera, nachinayushchihsya s nomera 15. Tablica FAT, nachinaya s bajta 22 i dalee, v etot paz pokazana v pravil'noj obratnoj posledovatel'nosti bajtov v papah: 6* 01 17 80 01 FF*F Dlya togo, chtoby najti pervyj element FAT, neobhodimo umnozhit' 15 na 1,5, poluchim 22,5, i vybrat' soderzhimoe bajtov 22 i 23, kak v predydushchem primere. V etot raz eti bajty soderzhat 6*01, chto posle perestanovki bajt dast 016*. Tak kak 15-chislo nechetnoe, to ispol'zuyutsya pervye tri cifry 016. Vtoroj klaster dlya fajla, sledovatel'no, imeet nomer 016. Dlya togo, chtoby najti tretij klaster, neobhodimo umnozhit' 16 na 1,5 poluchim 24. Zatem sleduet vybrat' soderzhimoe bajtov 24 i 25 tablicy FAT. Znachenie 1780 posle perestanovki bajtov dast 8017. Tak kak chislo 16 chetnoe, to ispol'zuyutsya poslednie tri cifry 017. Tretij klaster dlya fajla imeet nomer 017. Dlya togo, chtoby najti chetvertyj klaster, neobhodimo umnozhit' 17 na 1,5, poluchim 25.5. Zatem sleduet vybrat' soderzhimoe bajtov 25 i 26 tablicy FAT. Znachenie 8001 posle perestanovki bajtov dast 0180. Tak kak chislo 17 nechetnoe, to ispol'zuyutsya pervye tri cifry 018. CHetvertyj klaster dlya fajla imeet nomer 018. Pri ispol'zovanii etoj zhe procedury dlya lokalizacii soderzhimogo sleduyushchego elementa FAT po otnositel'nym adresam 27 i 28, poluchim FF*F, chto posle perestanovki dast *FFF. Tak kak chislo 18 chetnoe, ispol'zuyutsya poslednie tri cifry FFF, chto oboznachaet poslednij element. Kak bylo ranee skazano, vse fajly nachinayutsya na granice klastepa. Krome togo, sovsem ne obyazatel'no fajl dolzhen hranit'sya v sosednih klasterah, on mozhet byt' razbrosan na diske po raznym sektoram. Esli v programme neobhodimo opredelit' tip ustanovlennogo diska, to mozhno obratit'sya k tablice FAT neposredstvenno, ili, chto predpochtitel'nej, ispol'zovat' funkciyu DOS 1BH ili 1CH. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® Nezavisimo ot razmerov vse fajly nachinayutsya na granice klastera. ® Oglavlenie (katalog) soderzhit dlya kazhdogo fajl na diske elementy, opredelyayushchie imya, tip, atributy, datu, nachal' nyj sektor i pazmer fajla. Assembler dlya IBM PC. Glava 15 51 ® Tablica raspredeleniya fajlov (FAT) soderzhit odin element dlya kazhdogo klastepa v kazhdom fajle. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 15.1. Kakuyu dlinu v bajtah imeet standartnyj sektor? 15.2. Gde raspolozhena zapis' nachal'noj zagruzki? 15.3. Kak oboznachayutsya v oglavlenii udalennye fajly? 15.4. Kakie dopolnitel'nye dejstviya vypolnyayutsya pri formati zacii diskety po komande DOS FORMAT /S? 15.5. Gde i kakim obrazom oboznachaetsya v tablice FAT, chto ustrojstvom yavlyaetsya tverdyj disk? 15.6. Imeetsya fajl razmerom 2890 (desyatichnoe) bajtov: a) Gde hranit cistema razmer fajla? b) Kak vyrazhaetsya etot razmer v shestnadcatirichnom formate? v) Pokazhite znache nie v tom vide, kak ono zapisyvaetsya sistemoj. Assembler dlya IBM PC. Glava 16. 1 GLAVA 16. Diskovaya pamyat' II: Funkcii bazovoj versiii DOS ------------------------------------------------------------ Diskovaya pamyat' II: Funkcii bazovoj versiii DOS Cel': Raskryt' osnovnye trebovaniya k programmirovaniyu funkcij bazovoj versii DOS dlya obrabotki diskovyh fajlov. VVEDENIE ------------------------------------------------------------ V nachale dannoj glavy rassmatrivayutsya funkcii bazovoj versii DOS, opredelyayushchie blok upravleniya fajlom (FCB), a zatem budut pokazany vozmozhnosti sozdaniya i obrabotki dis kovyh fajlov posledovatel'nym i pryamym dostupom. Vse rassmat rivaemye operacii byli vvedeny v pervyh versiyah DOS i vozmozh ny vo vseh posleduyushchih versiyah. Obrabotka diskovyh fajlov v bazovoj DOS vklyuchaet opredele nie bloka upravleniya fajlom (FCB - file control block), koto ryj opisyvaet fajl i ego zapisi. Peredacha adresa bloka FCB v DOS obyazatel'na dlya vseh diskovyh operacij vvoda-vyvoda. Novyh komand assemblera v dannoj glave ne potrebuetsya. Upravlenie vvodom i vyvodom osushchestvlyaetsya special'nymi preryvaniyami. Zapis' fajla na disk trebuet, chtoby prezhde on byl "sozdan" i DOS smogla sgenerirovat' sootvetstvuyushchij ele ment v oglavlenii. Kogda vse zapisi fajla budut zapisany, programma dolzhna "zakryt'" fajl, tak, chtoby DOS zavershila obrabotku oglavleniya. CHtenie fajla trebuet, chtoby on byl snachala "otkryt" dlya togo, chtoby ubedit'sya v ego sushchestvo vanii. Tak kak zapisi imeyut fiksirovannuyu dlinu i v silu sootvetstvuyushchej organizacii oglavleniya, obrabotka zapisej diskovogo fajla mozhet osushchestvlyat'sya kak posledovatel'no, tak i proizvol'no. Metod dostupa k diskovoj pamyati, podderzhivayushchij ispol'zo vanie oglavleniya, "blokirovanie" i "razblokirovanie" zapi sej, obespechivaetsya preryvaniem DOS 21H. Bolee nizkij uro ven', obespechivayushchij absolyutnuyu adresaciyu diskovyh sektorov, takzhe cherez DOS, vypolnyaetsya posredstvom preryvanij 25H i 26H. Samyj nizkij uroven' obespechivaetsya preryvaniem BIOS 13H, kotoroe pozvolyaet vypolnit' proizvol'nuyu adresaciyu v diskovoj pamyati po nomeru dorozhki i sektora. Metody DOS osu shchestvlyayut nekotoruyu predvaritel'nuyu obrabotku do peredachi upravleniya v BIOS. V glave 17 ob®yasnyaetsya primenenie pred pochtitel'nyh funkcij rasshirennogo DOS 2, a glava 18 pred stavlyaet osnovnye diskovye operacii v BIOS. Napominanie: Termin klaster opredelyaet odin ili bolee sektorov s dannymi v zavisimosti ot diskovogo ustrojstva. BLOK UPRAVLENIYA FAJLOM (FCB) ------------------------------------------------------------ Dlya vypolneniya operacij vvoda-vyvoda na diske v bazovoj DOS neobhodimo v oblasti dannyh opredelit' blok FCB. Blok FCB ne podderzhivaet put' dostupa k fajlu, poetomu on ispol' zuetsya glavnym obrazom dlya obrabotki fajlov v tekushchej direk Assembler dlya IBM PC. Glava 16. 2 torii. Blok FCB soderzhit opisanie fajla i ego zapisej v privedennom nizhe formate. Pol'zovatel' dolzhen inicializi rovat' bajty 0-15 i 32-36, bajty 16-31 ustanavlivaetsya DOS. Bajty Naznachenie 0 Ukazyvaet diskovod: 01 dlya diskovoda A, 02 dlya B i t.d. 1-8 Imya fajla, vyravnennoe po levoj granice s konechnymi probelami, esli imya men'she 8 bajt. Pole mozhet soderzhat' zarezervirovannye imena, naprimer, LPT1 dlya printera. 9-11 Tip fajla dlya dopolnitel'noj identifikacii, naprimer, DTA ili ASM. Esli tip fajla men'she treh bajt, to on dolzhen byt' vyravnen po levoj granice i dopolnen konechnymi probelami. DOS hranit imya i tip fajla v oglavlenii. 12-13 Nomer tekushchego bloka. Blok soderzhit 128 zapisej. Dlya lokalizacii konkretnoj zapisi ispol'zuetsya nomer tekushchego bloka i nomer tekushchej zapisi (bajt 32). Pervyj blok fajla imeet nomer 0, vtoroj - 1 i t.d. Operaciya otkrytiya fajla ustanavlivaet v dannom pole 0. 14-15 Logicheskij razmer zapisi. Operaciya otkrytiya inicia liziruet razmer zapisi znacheniem 128 (shest.80). Posle otkrytiya i pered lyuboj operaciej chteniya ili zapisi mozhno ustanavlivat' v dannom pole lyuboe tre buemoe znachenie dliny zapisi. 16-19 Razmer fajla. Pri sozdanii fajla DOS vychislyaet i zapisyvaet eto znachenie (proizvedenie chisla zapi sej na razmer zapisej) v oglavlenie. Operaciya otkrytiya vybiraet razmer fajla iz oglavleniya i zanosit ego v dannoe pole. Programma mozhet chitat' eto pole, no ne mozhet menyat' ego. 20-21 Data. Pri sozdanii ili poslednej modifikacii fajla DOS zapisyvaet datu v oglavlenie. Operaciya otkrytiya vybiraet datu iz oglavleniya i zanosit v dannoe pole. 22-31 Zarezervirovano dlya DOS. 32 Tekushchij nomer zapisi. Dannoe pole soderzhit tekushchij nomer zapisi (O-127) v tekushchem bloke (sm.bajty 12-13). Sistema ispol'zuet tekushchie znacheniya bloka i zapisi dlya lokalizacii zapisi v diskovom fajle. Obychno nomer nachal'noj zapisi v dannom pole - 0, no ego mozhno zamenit' dlya nachala posledovatel'noj obrabotki na lyuboe znachenie ot 0 do 127. 33-36 Otnositel'nyj nomer zapisi. Dlya proizvol'nogo dos tupa pri operaciyah chteniya ili zapisi dannoe pole dolzhno soderzhat' otnositel'nyj nomer zapisi. Napri mer, dlya proizvol'nogo chteniya zapisi nomer 25 (shest.19), neobhodimo ustanovit' v dannom pole shest 19000000. Proizvol'nyj dostup harakterizuet sya tem, chto sistema avtomaticheski preobrazuet otnositel'nyj nomer zapisi v tekushchie znacheniya Assembler dlya IBM PC. Glava 16. 3 bloka i zapisi. Vvidu ogranicheniya na maksimal'nyj razmer fajla (1.073.741.824 bajtov), fajl s korotkimi zapisyami mozhet soderzhat' bol'she zapisej i imet' bol'shij otnositel'nyj nomer zapisi. Esli razmer zapisi bol'she 64, to bajt 36 vsegda soder zhit 00. Pomnite, chto chislovye znacheniya v slovah i dvojnyh slovah zapisyvayutsya v obratnoj posledovatel'nosti bajtov. Bloku FCB predshestvuet neobyazatel'noe semibajtovoe rasshi renie, kotoroe mozhno ispol'zovat' dlya obrabotki fajlov so special'nymi atributami. Dlya ispol'zovaniya rasshireniya neobho dimo zakodirovat' v pervom bajte shest.FF, vo vtorom - atri but fajla, a v ostal'nyh pyati bajtah shes'.nuli. ISPOLXZOVANIE BLOKA FCB DLYA SOZDANIYA FAJLA NA DISKE ------------------------------------------------------------ Dlya ssylki na kazhdyj diskovyj fajl programma dolzhna soder zhat' pravil'no sostavlennyj blok upravleniya fajlom. Operacii vvoda-vyvoda na disk trebuyut ustanovki adresa bloka FCB v registre DX. Dostup k polyam bloka FCB osushchestvlyayutsya po etomu adresu s pomoshch'yu registrovoj pary DS:DX. Dlya sozdaniya novogo fajla programma ispol'zuet funkciyu shest.16 v preryva nii DOS INT 21H sleduyushchim obrazom: MOV AH,16H ; Sozdanie LEA DX,FCBname ; diskovogo fajla INT 21H ; Vyzov DOS DOS osushchestvlyaet poisk imeni fajla i tip fajla, vzyatogo iz sootvetstvuyushchih polej FCB, v oglavlenii. Esli element oglavleniya, soderzhashchij neobhodimoe imya (i tip), budet najdeno, to DOS ochishchaet najdennyj element dlya novogo ispol' zovaniya, esli takoj element ne budet najden, to DOS ishchet svobodnyj element. Zatem operaciya ustanavlivaet razmer fajla v 0 i "otkryvaet" fajl. Na etape otkrytiya proishodit proverka dostupnogo diskovogo prostranstva, rezul'tat takoj proverki ustanavlivaetsya v registre AL: 00 Na diske est' svobodnoe prostranstvo FF Na diske net svobodnogo prostranstva. Pri otkrytii takzhe ustanavlivaetsya v blok FCB nomer tekushchego bloka - 0 i razmer zapisej (po umolchaniyu) - 128 (shest.80) bajtov. Prezhde, chem nachat' zapis' fajla, mozhno zamenit' eto znachenie po umolchaniyu na trebuemyj razmer zapisej. Dlya opredeleniya vyvodnoj zapisi neobhodimo prezhde obespe chit' nachal'nyj adres etoj zapisi v oblast' peredachi dannyh (DTA - disk trausfer area). Tak kak blok FCB soderzhit razmer zapisej, to v DTA ne trebuetsya ustanavlivat' ogranichitel' konca zapisi. Zatem s pomoshch'yu funkcii shest.1A neobhodimo Assembler dlya IBM PC. Glava 16. 4 soobshchit' DOS adres DTA. V lyuboj moment vremeni mozhet byt' aktiven tol'ko odin DTA. V sleduyushchem primere inicializi ruetsya adres DTA: MOV AH,1AH ; Ustanovka adresa LEA DX,DTAname ; DTA INT 21H ; Vyzov DOS Esli programma obrabatyvaet tol'ko odin diskovoj fajl, to dolzhna byt' tol'ko odna ustanovka adresa DTA dlya vsego vypolneniya. Pri obrabotke neskol'kih fajlov programma dolzhna ustanavlivat' sootvetstvuyushchij adres DTA neposredstvenno pered kazhdoj operaciej chteniya ili zapisi. Dlya posledovatel'noj zapisi na disk sushchestvuet funkciya shest. 15: MOV AH,15 ; Posledovatel'naya LEA DX,FCBname ; zapis' INT 21H ; Vyzov DOS Operaciya zapisi ispol'zuet informaciyu iz bloka FCB i adres tekushchego bufera DTA. Esli dlina zapisi ravna razmeru sektora, to zapis' zanositsya na disk. V protivnom sluchae zapisi zapolnyayut bufer po dline sektora i zatem bufer zapisy vaetsya na disk. Naprimer, esli dlina kazhdoj zapisi sostav lyaet 128 bajtov, to bufer zapolnyaetsya chetyr'mya zapisyami (4*128=512) i zatem bufer zapisyvaetsya v diskovoj sektor. Posle uspeshnogo zaneseniya zapisi na disk DOS uvelichivaet v bloke FCB razmer fajla na razmer zapisi i tekushchij nomer zapisi na 1. Kogda nomer tekushchej zapisi dostigaet 128, pro ishodit sbros etogo znacheniya v 0 i v FCB uvelichivaetsya nomer tekushchego bloka na 1. Operaciya vozvrashchaet v registre AL sle duyushchie kody: 00 Uspeshnaya zapis'. 01 Disk polnyj. 02 V oblasti DTA net mesta dlya odnoj zapisi. Kogda zapis' fajla zavershena, mozhno, hotya i ne vsegda obyazatel'no, zapisat' marker konca fajla (shest.1A). Dlya za krytiya fajla ispol'zuetsya funkciya shest.10: MOV AH,10H ; Zakryt' LEA DX,FCBname ; fajl INT 21H ; Vyzov DOS |ta operaciya zapisyvaet na disk dannye, kotorye eshche ostalis' v diskovom bufere DOS i izmenyaet v sootvetstvuyushchem elemente oglavleniya, datu i razmer fajla. V registre AL vozvrashchayutsya sleduyushchie znacheniya: 00 Uspeshnaya zapis'. FF Opisanie fajla okazalos' v nepravil'nom Assembler dlya IBM PC. Glava 16. 5 elemente oglavleniya (vozmozhno v rezul'tate smeny diskety). PROGRAMMA: ISPOLXZOVANIE FCB DLYA SOZDANIYA FAJLA NA DISKE ------------------------------------------------------------ Programma, privedennaya na ris.16.1, sozdaet diskovyj fajl po imeni, kotoroe vvoditsya pol'zovatelem s klaviatury. Blok FCB (FCBREC) v dannoj programme soderzhit sleduyushchie polya: FCBDRIV Programma dolzhna sozdat' fajl na diske v diskovode 4 (ili D). FCBNAME Imya fajla - NAMEFILE. FCBEXT Tip fajla - DAT. FCBBLK Nachal'noe znachenie nomera tekushchego bloka - 0. FCBRCSZ Razmer zapisej neopredelen, tak kak operaciya otkry tiya ustanavlivaet v dannom pole znachenie 128. FCBSQRC Nachal'noe znachenie nomera tekushchej zapisi - 0. V programme organizovany sleduyushchie procedury: BEGIN Inicializiruet segmentnye registry, vyzyvaet C10OPEN dlya sozdaniya fajla i ustanovki adresa DTA dlya DOS, vyzyvaet D10PROC dlya vvoda imeni fajla. Esli vvod pustoj, to proishodit vyzov G10PROC dlya zaversheniya programmy. C10OPEN Sozdaet dlya fajla element v direktorii, ustanavli vaet razmer zapisej - 32 (shest.20) i iniciali ziruet adres bufera DTA dlya DOS. D10PROC Vydaet zapros na vvod imen, vvodit imena s klavia tury i vyzyvaet proceduru F10WRIT dlya zapisi vvodi myh imen na disk. E10DISP Upravlyaet prokrutkoj i ustanovkoj kursora. F10WRIT Zapisyvaet imena v diskovoj fajl. G10CLSE Zapisyvaet marker konca fajla i zakryvaet fajl. X10ERR Vydaet na ekran soobshchenie ob oshibke v sluchae ne korrektnoj operacii sozdaniya fajla ili zapisi dannyh. Kazhdaya operaciya zapisi avtomaticheski dobavlyaet 1 k FCBSGRC (nomer tekushchej zapisi) i shest.20 (razmer zapisi) k FCBFLSZ (razmer fajla). Tak kak kazhdaya zapis' imeet dlinu 32 bajta, to operaciya zanosit v bufer 16 zapisej i zatem zapisy vaet ves' bufer v sektor diska. Nizhe pokazano soderzhimoe DTA i bufera: DTA: |tekushchaya zapis'| Bufer: |zapis' 00|zapis' 01|zapis' 02|...|zapis' 15| Esli pol'zovatel' vvel 25 imen, to schetchik zapisej uveli chitsya ot 1 do 25 (shest.19). Razmer fajla sostavit: 25 * 32 bajta = 800 bajtov ili shest. 320 Assembler dlya IBM PC. Glava 16. 6 ------------------------------------------------------------ ------------------------------------------------------------ Ris. 16.1. Sozdanie diskovogo fajla. Operaciya zakrytiya zanosit vo vtoroj sektor ostavshiesya v bufere devyat' zapisej i izmenyaet v oglavlenii datu i rvzmer fajla. Razmer zapisyvaetsya bajtami v perestavlennom poryadke: 20030000. Poslednij bufer imeet sleduyushchij vid: Bufer: |zapis' 16|zapis' 17|...|zapis' 24|shest.1A|...|...| Dlya prostoty v privedennoj programme sozdayutsya zapisi fajla, soderzhashchie tol'ko odno pole. Zapisi bol'shinstva drugih fajlov, odnako, soderzhit razlichnye simvol'nye i dvoichnye polya i trebuyut opisaniya zapisi v DTA. Esli zapisi soderzhat dvoichnye chisla, to ne sleduet ispol'zovat' marker konca fajla (EOF), tak kak dvoichnoe chislo mozhet sovpast' s shest. kodom 1A. Dlya togo, chtoby sdelat' programmu bolee gibkoj, mozhno razreshit' pol'zovatelyu ukazat' diskovod, na kotorom nahodit sya ili budet nahodit'sya fajl. V nachale vypolneniya programma mozhet vydat' na ekran soobshchenie, chtoby pol'zovatel' vvel nomer diskovoda, a zatem izmenit' pervyj bajt bloka FCB. POSLEDOVATELXNOE CHTENIE DISKOVOGO FAJLA ------------------------------------------------------------ V bazovoj versii DOS programma, chitayushchaya diskovyj fajl, soderzhit blok upravleniya fajlom, kotoryj opredelyaet fajl tochno tak, kak on byl sozdan. V nachale programma dlya otkry tiya fajla ispol'zuet funkciyu shest. OF: MOV AH,OFH ; Otkrytie LEA DX,FCBname ; fajla INT 21H ; Vyzov DOS Operaciya otkrytiya nachinaetsya s poiska v oglavlenii elemen ta s imenem i tipom fajla, opredelennymi v FCB. Esli takoj element ne budet najden v oglavlenii, to v registre AL usta navlivaetsya shest. FF. Esli element najden, to v registre AL ustanavlivaetsya 00 i v FCB zanositsya dejstvitel'nyj razmer fajla, a takzhe ustanavlivaetsya nomer tekushchego bloka v 0, dlina zapisi v shest.80. Posle otkrytiya mozhno zamenit' dlinu zapisi na drugoe znachenie. DTA dolzhno soderzhat' opredelenie schityvaemoj zapisi v sootvetstvii s formatom, kotoryj ispol'zovalsya pri sozdanii fajla. Dlya ustanovki adresa DTA ispol'zuetsya funkciya shest.1A (ne putat' s markerom konca fajla EOF shest.1A) analogichno sozdaniyu diskovogo fajla: MOV AH,1AH ; Ustanovka LEA DX,DTAname ; adresa DTA INT 21H ; Vyzov DOS Assembler dlya IBM PC. Glava 16. 7 Dlya posledovatel'nogo chteniya zapisej s diska ispol'zuetsya funkciya shest.14: MOV AH,14H ; Posledovatel'noe LEA DX,FCBname ; chtenie zapisej INT 21H ; Vyzov DOS CHtenie zapisi s diska po adresu DTA osushchestvlyaetsya na os nove informacii v bloke FCB. Operaciya chteniya ustanavlivaet v registre AL sleduyushchie kody vozvrata: 00 Uspeshnoe chtenie. 01 Konec fajla, dannye ne prochitany. 02 V DTA net mesta dlya chteniya odnoj zapisi. 03 Konec fajla, prochitana chastichnaya zapis', zapolnennaya nulyami. Pervaya operaciya chteniya zanosit soderzhimoe vsego sektora v bufer DOS. Zatem operaciya opredelyaet iz bloka FCB razmer zapisi i peresylaet pervuyu zapis' iz bufera v DTA. Posle duyushchie operacii chteniya peresylayut ostal'nye zapisi (esli ime yutsya) poka bufer ne budet ischerpan. Posle etogo operaciya chteniya opredelyaet adres sleduyushchego sektora i zanosit ego so derzhimoe v bufer. Posle uspeshnoj operacii chteniya v bloke FCB avtomaticheski uvelichivaetsya nomer tekushchej zapisi na 1. Zavershenie posle dovatel'nogo chteniya opredelyaetsya programmoj po markeru konca fajla (EOF), dlya chego v programme imeetsya sootvetstvuyushchaya proverka. Tak kak oglavlenie pri chtenii fajla ne izmenya etsya, to obychno net neobhodimosti zakryvat' fajl posle zaversheniya chteniya. Isklyuchenie sostavlyayut programmy, kotorye otkryvayut i chitayut neskol'ko fajlov odnovremenno. Takie programmy dolzhny zakryvat' fajly, tak kak DOS ogranichivaet chislo odnovremenno otkrytyh fajlov. PROGRAMMA: ISPOLXZOVANIE FCB DLYA CHTENIYA DISKOVOGO FAJLA ------------------------------------------------------------ Na ris.16.2 privedena programma, kotoraya vypolnyaet chtenie fajla, sozdannogo predydushchej programmoj, i vyvod na ekran imen iz zapisej fajla. Obe programmy soderzhat identichnye bloki FCB, hotya, imena polej FCB mogut byt' razlichny. Soderzhimoe polej imeni i tipa fajla dolzhny byt' odinakovy. Programma soderzhit sleduyushchie procedury: BEGIN Inicializiruet segmentny registra, vyzyvaet pro ceduru E10OPEN dlya otkrytiya fajla i ustanovki DTA i vyzyvaet F10READ dlya chteniya zapisej. Esli schitan marker konca fajla, to programma zavershaetsya, esli net, to vyzyvaetsya procedura G10DISP. E10OPEN Otkryvaet fajl, ustanavlivaet znachenie razmera i zapisej, ravnoe 32 (shest.20), i inicializiruet adres DTA. Assembler dlya IBM PC. Glava 16. 8 F10READ Vypolnyaet posledovatel'noe chtenie zapisej. Opera ciya chteniya avtomaticheski uvelichivaet nomer tekushchej zapi si v bloke FCB. G10DISP Vyvodit na ekran soderzhimoe prochitannoj zapisi. X10ERR Vyvodit na ekran soobshchenie ob oshibke v sluchae nekorrektnoj operacii otkrytiya ili chteniya. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 16.2. CHtenie diskovogo fajla Operaciya otkrytiya vypolnyaet poisk imeni i tipa fajla v oglavlenii. Esli neobhodimyj element oglavleniya najden, to avtomaticheski v blok FCB zanosyatsya razmer fajla, data i dlina zapisej. Pervaya operaciya chteniya zapisi s nomerom 00 poluchaet dostup k disku i schityvaet ves' sektor (16 zapisej) v bufer. Posle etogo pervaya zapis' zanositsya v DTA, a nomer tekushchej zapisi v FCB uvelichivaetsya s 00 do 01: Bufer: |zapis' 00|zapis' 01|zapis' 02|... |zapis' 15| DTA : |zapis' 00| Vtoroj operacii chteniya net neobhodimogo obrashchat'sya k dis ku. Tak kak trebuemaya zapis' uzhe nahoditsya v bufere, to ope raciya prosto peresylaet zapis' 01 iz bufera v DTA i uveli chivaet nomer tekushchej zapisi na edinicu. Takim zhe obrazom vy polnyayutsya sleduyushchie operacii chteniya poka vse 16 zapisej iz bufera ne budut obrabotany. Operacii chteniya 16-oj zapisi privodit k fizicheskomu chteniyu sleduyushchego sektora v bufer i peresylka pervoj zapisi sektora v DTA. Posleduyushchie operacii chteniya perenosyat ostal' nye zapisi iz bufera v DTA. Popytka prochitat' posle poslednej zapisi vyzovet sostoyanie konca fajla i v registr AL budet zapisan kod vozvrata shest. 01. PRYAMOJ DOSTUP ------------------------------------------------------------ Do sih por v etoj glave rassmatrivalas' posledovatel'naya obrabotka diskovyh fajlov, kotoraya adekvatna kak dlya sozda niya fajla, tak i dlya pechati ego soderzhimogo ili vneseniya iz menenij v nebol'shie fajly. Esli programma ogranichena tol'ko vozmozhnost'yu posledovatel'noj obrabotki, to dlya izmeneniya fajla ona dolzhna schityvat' kazhduyu zapis', vnosit' izmeneniya v opredelennye iz nih i zanosit' zapisi v drugoj fajl (programma mozhet ispol'zovat' odin DTA, no potrebuyutsya razlichnye bloki FCB). Obychnoj praktikoj yavlyaetsya chtenie vhodnogo fajla s diska A i zapis' obnovlennogo fajla na disk B. Preimushchestvo etogo sposoba sostoit v tom, chto on avtoma ticheski ostavlyaet rezervnuyu kopiyu. V nekotoryh sluchayah primenyaetsya dostup k konkretnym zapisyam fajla dlya polucheniya informacii, naprimer, neskol'kih sluzhashchih ili o chasti assortimenta tovarov. Dlya dostupa, skazhem, k 300-oj zapisi fajla, posledovatel'naya obrabotka Assembler dlya IBM PC. Glava 16. 9 dolzhna vklyuchat' chtenie vseh 299 predshestvuyushchih zapisej, poka ne budet poluchena 300-ya zapis'. Primechanie: sistema mozhet nachat' obrabotku s konkretnogo nomera bloka i zapisi). Nesmotrya na to, chto fajl sozdaetsya posledovatel'no, dostup k zapisyam mozhet byt' posledovatel'nym ili pryamym (proizvol'nym). Trebovaniya pryamoj obrabotki, ispol'zuyushej vyzov DOS, zaklyuchayutsya v ustanovke trebuemogo nomera zapisi v sootvetstvuyushchee pole FCB i vydache komandy pryamogo chteniya ili zapisi. Proizvol'nyj dostup ispol'zuet otnositel'nyj nomer zapisi (bajty 33-36) v bloke FCB. Pole imeet razmer dvojnogo slova i ispol'zuet obratnuyu posledovatel'nost' bajt v slovah. Dlya lokalizacii trebuemoj zapisi sistema avtomaticheski pre obrazuet otnositel'nyj nomer zapisi v nomer tekushchego bloka (bajty 12-13) i nomer tekushchej zapisi (bajt 32). PRYAMOE CHTENIE Operacii otkrytiya i ustanovki DTA odinakovy kak dlya pryamoj, tak i dlya posledovatel'noj obrabotki. Predpolozhim, chto programma dolzhna vypolnit' pryamoj dostup k pyatoj zapisi fajla. Ustanovim znachenie 05 v pole FCB dlya otnositel'nogo nomera zapisi i vypolnim komandy dlya pryamogo chteniya. V rezul'tate uspeshnoj operacii soderzhimoe pyatoj zapisi budet pomeshcheno v DTA. Dlya pryamogo chteniya zapisi neobhodimo pomestit' tre buemoe znachenie otnositel'nogo nomera zapisi v FCB i vyzvat' funkciyu shest.21: MOV AH,21H ; Zapros na LEA DX,FCBname ; pryamoe chtenie INT 21H ; Vyzov DOS Operaciya chteniya preobrazuet otnositel'nyj nomer zapisi v nomera tekushchego bloka i zapisi. Poluchennye znacheniya ispol' zuyutsya dlya lokalizacii trebuemoj diskovoj zapisi, peredachi soderzhimogo zapisi v DTA i ustanovki v registr AL sleduyushchie znacheniya: 00 Uspeshnoe zavershenie 01 Dannye ne dostupny 02 CHtenie prekrashcheno iz-za nehvatki mesta v DTA 03 Prochitana chastichnaya zapis', zapolnennaya nulyami. Kak vidno, sredi perechislennyh kodov vozvrata otsutstvuet sostoyanie konec fajla. Pri korrektnom chtenii zapisi pred polagaetsya edinstvenny