j kod vozvrata - 00. Ostal'nye kody vozvrata mogut yavlyat'sya rezul'tatom ustanovki nepravil'nogo otnositel'nogo nomera zapisi ili nekorrektnaya ustanovka adresa DTA ili FCB. Tak kak takie oshibki legko dopustit', to polezno vypolnyat' proverku registra AL na nenulevoe zna chenie. Assembler dlya IBM PC. Glava 16. 10 Kogda programma vydaet pervyj zapros na pryamuyu zapis', operaciya, ispol'zuya oglavlenie dlya lokalizacii sektora, na kotorom nahoditsya trebuemaya zapis', schityvaet ves' sektor s diska v bufer i peresylaet zapis' v DTA. Predpolozhim, napri mer, chto zapisi imeyut razmer 128 bajt, t.e. chetyre zapisi v odnom sektore. Zapros na pryamoe chtenie zapisi 23 privodit k chteniyu v bufer chetyreh zapisej, lezhashchih v odnom sektore: | zapis' 20 | zapis' 21 | zapis' 22 | zapis' 23 | Kogda programma vnov' vydast pryamoj zapros na zapis', naprimer, 23, to operaciya snachala proverit soderzhimoe bufe ra. Tak kak dannaya zapis' uzhe nahoditsya v bufere, to ona neposredstvenno peresylaetsya v DTA. Esli programma zaprosit zapis' 35, kotoryj net v bufere, operaciya cherez oglavlenie lokalizuet trebuemuyu zapis', schitaet ves' sektor v bufer i pomestit zapis' v DTA. Takim obrazom, operacii pryamogo dos tupa k zapisyam bolee effektivny, esli nomera zapisej blizki drug k drugu. PRYAMAYA ZAPISX Operaciya sozdaniya fajla i ustanovki DTA odinakovy kak dlya pryamogo, tak i dlya posledovatel'nogo dostupa. Dlya obrabotki fajla ucheta tovarov programma mozhet, ispol'zuya pryamoj dos tup, schitat' neobhodimuyu zapis', vnesti, vvedennye vruchnuyu, izmeneniya (naprimer, novoe kolichestvo tovarov) i vernut' zapis' na disk na to zhe mesto. Operaciya pryamoj zapisi ispol'zuet otnositel'nyj nomer zapisi v bloke FCB i funkciyu shest.22 sleduyushchim obrazom: MOV AH,22H ; Zapros na LEA DX,FCBname ; pryamuyu zapis' INT 21H ; Vyzov DOS Operaciya ustanavlivaet v registre AL sleduyushchie kody voz vrata: 00 Uspeshnaya operaciya 01 Na diske net mesta 02 Operaciya prekrashchena v rezul'tate nedostatoch nogo mesta v DTA. Pri sozdanii novogo fajla pryamym dostupom mozhet byt' polu chen nenulevoj kod vozvrata. No pri pryamom chtenii i perepisy vanii izmenennyh zapisej na tom zhe meste diska kod vozvrata dolzhen byt' tol'ko 00. Otnositel'nyj nomer zapisi v bloke FCB pri pryamom dostupe imeet razmer dvojnogo slova (chetyre bajta), kazhdoe slovo za pisyvaetsya obratnoj posledovatel'nost'yu bajtov. Dlya nebol' shih fajlov vozmozhno potrebuetsya ustanovka lish' samogo levo go bajta ili slova, no dlya bol'shih fajlov ustanovka nomera zapisi v treh ili v chetyreh bajtah trebuet nekotoroj tshchatel'nosti. Assembler dlya IBM PC. Glava 16. 11 PROGRAMMA: PRYAMOE CHTENIE DISKOVOGO FAJLA ------------------------------------------------------------ Na ris.16.3 privedena programma, kotoraya schityvaet fajl, sozdannyj predydushchej programmoj (sm.ris.16.1). Vvodya lyuboj otnositel'nyj nomer zapisi, lezhashchej v granicah fajla, pol' zovatel' zaprashivaet vyvod na ekran lyuboj zapisi fajla. Esli fajl soderzhit 25 zapisej, to pravil'nymi nomera yavlyayutsya no mera ot 00 do 24. Nomer vvoditsya s klaviatury v ASCII forma te i dolzhen byt' v nashem sluchae odno- ili dvuhznachnym chis lom. Programma soderzhit sleduyushchie procedury: C10OPEN Otkryvaet fajl, ustanavlivaet razmer zapisi 32 i ustanavlivaet adres DTA. D10RECN Vvodit nomer zapisi s klaviatury, preobrazuet ego v dvoichnyj format i zapisyvaet poluchennoe znachenie v FCB. V kachestve usovershenstvovaniya procedury mozhno vstavit' proverku vhozhdeniya nomera v granicy ot 00 do 24. F10READ Pomeshchaet trebuemuyu zapis' v DTA v sootvetstvii s otnositel'nym nomerom zapisi v FCB. G10DISP Vyvodit zapis' na ekran. Procedura D10RECN vvodit nomer zapisi s klaviatury i pro veryaet dlinu vvoda v spiske parametrov. Vozmozhny tri varian ta: 00 Zaproshen konec obrabotki 01 Vvedeno odnoznachnoe chislo (v registre AL) 02 Vvedeno dvuhznachnoe chislo (v registre AX) ------------------------------------------------------------ ------------------------------------------------------------ Ris.16.3. Pryamoe chtenie diskovyh zapisej. Dannaya procedura preobrazuet vvedennoe chislo iz ASCII formata v dvoichnyj format. Tak kak znachenie nahoditsya v re gistre AX, to luchshe ispol'zovat' komandu AAD dlya preobra zovaniya. Posle preobrazovaniya dvoichnyj kod iz registra AX peresylaetsya v dva levyh bajta polya otnositel'nogo nomera zapisi v bloke FCB. Esli, naprimer, vvedeno chislo 12 v ASCII formate, to AX budet soderzhat' 3132. Komanda AND preobrazuet eto znachenie v 0102, a komanda AAD - v 000C. Rezul'tat pre obrazovaniya zanositsya v pole otnositel'nogo nomera zapisi bloka FCB v vide S000 0000. PRYAMOJ BLOCHNYJ DOSTUP ------------------------------------------------------------ Esli v programme imeetsya dostatochno mesta, to odna pryamaya blochnaya operaciya mozhet zapisat' ves' fajl iz DTA na disk, a takzhe prochitat' ves' fajl s diska v DTA. Dannaya osobennost' ves'ma polezna dlya zapisi na disk tablic, kotorye drugie pro grammy mogut schityvat' v pamyat' dlya obrabotki. Assembler dlya IBM PC. Glava 16. 12 Nachat' mozhno s lyubogo pravil'nogo otnositel'nogo nomera zapisi. CHislo zapisej takzhe mozhet byt' lyubym, hotya blok dol zhen nahoditsya v predelah fajla. Pered nachalom neobhodimo otkryt' fajl i inicializirovat' DTA. Dlya operacii pryamoj blochnoj zapisi neobhodimo ustanovit' v registre SX trebuemoe chislo zapisej, ustanovit' v FCB startovyj otnositel'nyj nomer zapisi i vydat' funkciyu shest.28: MOV AH,28H ; Operaciya pryamoj blochnoj zapisi MOV CX,records ; Ustanovka chisla zapisej LEA DX,FCBname ; INT 21H ; Vyzov DOS Operaciya preobrazuet otnositel'nyj nomer zapisi v tekushchie nomer bloka i nomer zapisi. Poluchennye znacheniya ispol'zuyutsya dlya opredeleniya nachal'nogo adresa na diske. V rezul'tate ope racii v registre AL ustanavlivayutsya sleduyushchie kody voz vrata: 00 Uspeshnoe zavershenie dlya vseh zapisej 01 Na diske nedostatochno mesta. Krome togo operaciya ustanavlivaet v FCB v pole otnosi tel'nogo nomera zapisi i polyah tekushchih nomerov bloka i zapi si znacheniya, sootvetstvuyushchie sleduyushchemu nomeru zapisi. Napri mer, esli byli zapisany zapisi s 00 do 24, to sleduyushchij nomer zapisi budet 25 (shest.19). Dlya operacii pryamogo blochnogo chteniya neobhodimo ustano vit' v registre CX trebuemoe chislo zapisej i ispol'zovat' funkciyu shest.27: MOV AH,27H ; Operaciya pryamogo blochnogo chteniya MOV CX,records ; Ustanovka chisla zapisej LEA DX,FCBname ; INT 21H ; Vyzov DOS Operaciya chteniya vozvrashchaet v registre AL sleduyushchie znache niya: 00 Uspeshnoe chtenie vseh zapisej 01 Prochitana poslednyaya zapis' fajla 02 Prochitano predel'noe dlya DTA chislo zapisej 03 Prochitana poslednyaya zapis' fajla ne polnost'yu. V registre CX ostaetsya dejstvitel'noe chislo prochitannyh zapisej, a v FCB v pole otnositel'nogo nomera zapisi i polyah tekushchih nomerov bloka i zapisi ustanavlivayutsya znacheniya, sootvetstvuyushchie sleduyushchemu nomeru zapisi. Esli neobhodimo zagruzit' v pamyat' ves' fajl, no chislo za pisej neizvestno, to sleduet posle operacii otkrytiya razde lit' razmer fajla na dlinu zapisi. Naprimer, dlya razmera fajla shest.320 (800) i dline zapisi shest.20 (32) chislo zapi sej budet shest.19 (25). Assembler dlya IBM PC. Glava 16. 13 PROGRAMMA: PRYAMOE BLOCHNOE CHTENIE ------------------------------------------------------------ Na ris.16.4 privedena programma, vypolnyayushchaya blochnoe chte nie fajla, sozdannogo programmoj na ris.16.1. Programma usta navlivaet nachal'nyj otnositel'nyj nomer zapisi 00, v regist re CX - schetchik na 25 zapisej i vyvodit na ekran vsyu informa ciyu iz DTA (tol'ko dlya togo, chtoby ubedit'sya, chto informaciya schitana). Drugie varianty programmy mogut vklyuchat' ustanov ku drugogo nachal'nogo nomera zapisi i schityvanie menee 25 za pisej. V programme organizovany sleduyushchie procedury: E10OPEN Otkryvaet fajl, ustanavlivaet razmer zapisi v FCB ravnym 32 i ustanavlivaet adres DTA. F10READ Ustanavlivaet chislo zapisej ravnym 25 i vypolnyaet blochnoe chtenie. G10DISP Vyvodit blok na ekran. Operaciya chteniya preobrazuet otnositel'nyj nomer zapisi 00 v FCB v nomer tekushchego bloka 00 i nomer tekushchej zapisi 00. V konce operacii chteniya v FCB tekushchij nomer zapisi budet so derzhat' shest.19, a otnositel'nyj nomer zapisi - shest. 19000000. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 16.4. Pryamoe blochnoe chtenie. ABSOLYUTNYE OPERACII DISKOVOGO VVODA-VYVODA ------------------------------------------------------------ Dlya neposredstvennogo dostupa k disku mozhno ispol'zovat' operacii absolyutnogo chteniya i absolyutnoj zapisi s pomoshch'yu funkcij DOS INT 25H i 26H. V etom sluchae ne ispol'zuyutsya oglavlenie diska i preimushchestva blokirovaniya i razblokiro vaniya zapisej, obespechivaemye funkciej DOS INT 21H. Absolyutnye operacii predpolagayut, chto vse zapisi imeyut razmer sektora, poetomu pryamoj dostup osushchestvlyaetsya k polno mu sektoru ili bloku sektorov. Adresaciya diska vypolnyaetsya po "logicheskomu nomeru zapisi" (absolyutnyj sektor). Dlya opredeleniya logicheskogo nomera zapisi na dvuhstoronnih disketah s devyat'yu sektorami schet sektorov vedetsya s dorozhki 0, sektora 1, sleduyushchim obrazom: Dorozhka Sektor Logicheskij nomer zapisi 0 1 0 0 2 1 1 1 9 1 9 17 2 9 26 Dlya dvuhstoronnih disket ispol'zuetsya sleduyushchaya formula: Logicheskij nomer zapisi = (dorozhka h 9) + (sektor - 1) Assembler dlya IBM PC. Glava 16. 14 Naprimer, logicheskij nomer zapisi na dorozhke 2 i sektore 9 opredelyaetsya kak (2 h 9) + (9 - 1) = 18 + 8 = 26 Fragment programmy dlya absolyutnyh operacij vvoda-vyvoda: MOV AL,drive# ; 0 dlya A, 1 dlya B i t.d. MOV BX,addr ; Adres oblasti vvoda-vyvoda MOV CX,sectors ; CHislo sektorov MOV DX,record# ; Nachal'nyj logicheskij nomer zapisi INT 25H ili 26H ; Absolyutnoe chtenie ili zapis' Operacii absolyutnogo chteniya ili zapis' razrushayut soderzhi moe vseh registrov, krome segmentnyh, i ustanavlivayut flag CF dlya indikacii uspeshnoj (0) ili bezuspeshnoj (1) operacii. V sluchae bezuspeshnoj operacii soderzhimoe registra AL opisy vaet harakter oshibki: AL Prichina 1000 0000 Ustrojstvo ne otvechaet 0100 0000 Oshibka ustanovki golovok 0010 0000 Oshibka kontrolera 0001 0000 Oshibka diskety? 0000 1000 Perepolnenie DMA pri chtenii 0000 0100 Sektor ne najden 0000 0011 Popytka zapisi na zashchishchennoj diskete 0000 0010 Ne najden adresnyj marker Komanda INT zapisyvaet soderzhimoe flagovogo registra v stek. Posle zaversheniya komandy INT sleduet vosstanovit' flagi, no proveriv pered etim flag CF. DRUGIE DISKOVYE OPERACII ------------------------------------------------------------ Krome osnovnyh diskovyh funkcij DOS imeetsya neskol'ko dopolnitel'nyh poleznyh diskovyh operacij. Sbros diska: SHest. D Obychno normal'noe zakrytie fajla privodit k zaneseniyu vseh ostavshihsya v bufere zapisej na disk i korrektirovke og lavleniya. V osobyh sluchayah (mezhdu shagami programmy ili ava rijnom zavershenii) mozhet potrebovat'sya sbros diska. Funkciya DOS shest. D osvobozhdaet vse fajlovye bufera i ne korrekti ruet oglavlenie diska. Esli neobhodimo, to vnachale dannaya funkciya zakryvaet vse fajly. MOV AH,ODH ; Zapros na sbros diska INT 21H ; Vyzov DOS Ustanovka tekushchego diskovoda: SHest. E Assembler dlya IBM PC. Glava 16. 15 Osnovnoe naznachenie funkcii DOS shest.E - ustanovka nomera tekushchego (po umolchaniyu) diskovoda. Nomer diskovoda pomeshchaet sya v registr DL, prichem 0 sootvetstvuet diskovodu A, 1 - B i t.d. MOV AH,OEH ; Zapros na ustanovku MOV DL,02 ; diskovoda C INT 21H ; Vyzov DOS Operaciya vozvrashchaet v registr AL chislo diskovodov (nezavi simo ot tipa). Tak kak dlya DOS neobhodimo po krajnej mere 2 logicheskih diskovoda A i B, to DOS vozvrashchaet znachenie 02 i dlya sistem s odnim diskovodom. (Dlya opredeleniya dejstvitel' nogo chisla diskovodov ispol'zuetsya komanda INT 11H). Poisk elementov oglavleniya: shest. 11 i 12 Programmnoj utilite mozhet potrebovat'sya poisk v oglavle nii dlya dostupa k imeni fajla, naprimer, pri udalenii ili pereimenovanii. Dlya dostupa k pervomu ili edinstvennomu elementu oglavleniya neobhodimo zagruzit' v registr DX adres neotkrytogo bloka FCB i vypolnit' funkciyu 11H. Pri ispol'zovanii rasshirennogo bloka FCB mozhno takzhe poluchit' kod atributa (sm.tehnicheskoe rukovodstvo po DOS). MOV AH,11H ; Zapros na pervyj element LEA DX,FCBname ; Neotkrytyj FCB INT 21H ; Vyzov DOS FCB mozhet byt' raspolozheno po adresu 5CH v prefikse pro grammnogo segmenta, predshestvuyushchem programme v pamyati (DTA po umolchaniyu). Podrobno sm. gl. 22. V registre AL operaciya vozvrashchaet shest.FF, esli element ne najden, i shest.00, esli najden. Operaciya ustanavlivaet v DTA nomer diskovoda (1=A, 2=B i t.d.) imya fajla i tip fajla. Esli najdeno neskol'ko elementov pri vyborke po shablonu (naprimer, *.ASM), to dlya lokalizacii elementov podmnozhestva direktorii ispol'zuetsya funkciya 12H: MOV AH,12H ; Zapros sleduyushchego elementa LEA DX,FCBname ; Neotkrytyj FCB INT 21H ; Vyzov DOS Kody vozvrata v registre AL analogichny kodam funkcii 11H. Udalenie fajla: shest.13 Dlya udaleniya fajla v programme ispol'zuetsya funkciya DOS 13H. Operaciya udaleniya ustanavlivaet special'nyj bajt v pervoj pozicii imeni fajla v oglavlenii. MOV AH,13H ; Zapros na udalenie fajla LEA DX,FCBname ; Neotkrytyj FCB INT 21H ; Vyzov DOS Esli operaciya nahodit i udalyaet element, to v registre AL ustanavlivaetsya kod vozvrata 00, inache kod raven shest.FF. Assembler dlya IBM PC. Glava 16. 16 Pereimenovanie fajla: shest. 17 Dlya pereimenovaniya fajla v programme ispol'zuetsya funkciya DOS shest.17. Staroe imya fajla zapisyvaetsya v obychnom meste bloka FCB, a novoe - nachinaya so smeshcheniya 16. MOV AH,17H ; Zapros na pereimenovanie LEA DX,FCBname ; Adres FCB INT 21H ; Vyzov DOS Simvoly ? i * v novom imeni privodyat k sohraneniyu v soot vetstvuyushchih poziciyah simvolov iz starogo imeni. Uspeshnaya ope raciya ustanavlivaet v registre AL kod vozvrata 00, a bezuspeshnaya (fajl po staromu imeni ne najden ili po novomu imeni uzhe sushchestvuet) - kod FF. Poluchenie tekushchego nomera diskovoda: shest.19 Funkciya DOS shest.19 pozvolyaet opredelit' tekushchij nomer diskovoda: MOV AH,19H ; Poluchit' tekushchij diskovod INT 21H ; Vyzov DOS Operaciya vozvrashchaet shest. nomer diskovoda v registre AL (0=A, 1=B i t.d.). Poluchennoe znachenie mozhno pomestit' neposredstvenno v FCB dlya dostupa k fajlu s tekushchego disko voda. Krome perechislennyh sushchestvuyut funkcii dlya polucheniya informacii iz tablicy FAT (1B i 10), ustanovki polya pryamoj zapisi (24), ustanovki vektora preryvanij (25), sozdaniya novogo programmnogo segmenta (26) i analiza imeni fajla (29). |ti funkcii opisany v tehnicheskom rukovodstve po DOS. PROGRAMMA: VYBOROCHNOE UDALENIE FAJLOV ------------------------------------------------------------ Na ris.16.5 privedena COM-programma po imeni SDEL, illyustriruyushchaya funkcii DOS 11H, 12H i 13H dlya udaleniya vyb rannyh fajlov. Dlya zaprosa na udalenie fajlov pol'zovatel' mozhet vvesti,naprimer, sleduyushchie komandy: SDEL *.* (vse fajly) SDEL *.BAK (vse BAK-fajly) SDEL TEST.* (vse fajly po imeni TEST) Posredstvom DOS programma opredelyaet v oglavlenii elemen ty, udovletvoryayushchie zaprosu. DOS zanosit polnoe imya najden nogo elementa v PSP (prefiks programmnogo segmenta) po smeshche niyu shest.81 (DTA po umolchaniyu). Zatem programma vyvodit na ekran imya fajla i zapros podtverzhdeniya. Otvet Y (da) razre shaet udalenie, N (net) sohranyaet fajl, a Return zavershaet vypolnenie. Assembler dlya IBM PC. Glava 16. 17 Obratite vnimanie na to, chto dannaya programma dolzhna byt' sozdana kak COM-programma, tak kak EXE-programma trebuyut otlichnoj adresacii dlya ispol'zovaniya smeshchenij shest.5S i 81 v PSP. Dlya testirovaniya programmy ispol'zujte skopirovannye vremenno fajly. ------------------------------------------------------------ ------------------------------------------------------------ Ris.16.5. Vyborochnoe udalenie fajlov. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ - Programma, ispol'zuyushchaya INT 21H v bazovoj versii DOS dlya operacij vvoda-vyvoda na disk, dolzhna soderzhat' blok upravleniya fajlom (FCB) dlya kazhdogo dostupnogo fajla. - Odin blok soderzhit 128 zapisej. Nomer tekushchego bloka i nomer tekushchej zapisi v FCB ukazyvayut na diskovuyu zapis', kotoraya dolzhna byt' obrabotana. - V obratnoj posledovatel'nosti bajt v FCB zapisyvayutsya sleduyushchie elementy: nomer tekushchego bloka, razmer zapisi, razmer fajla i otnositel'nyj nomer zapisi. - Vse programmy, obrabatyvayushchie odin i tot zhe fajl, dolzhny imet' odinakovo opisannyj blok FCB. - Oblast' vvoda-vyvoda (DTA) opredelyaetsya adresom pamyati, kuda dolzhna byt' pomeshchena zapis' pri chtenii ili otkuda ona zanositsya na disk. Prezhde, chem vypolnit' operaciyu zapisi ili chteniya, v programme neobhodimo ustanovit' kazhduyu oblast' DTA. - Operaciya otkrytiya fajla ustanavlivaet v bloke FCB znache niya dlya sleduyushchih elementov: imya fajla, tip fajla, razmer zapi si (shest.80), razmer fajla i data. Programma dolzhna zamenit' razmer zapisej na pravil'noe znachenie. - Programma, ispol'zuyushchaya dlya zapisi fajla operaciyu DOS INT 21H, dolzhna zakryt' fajl v konce obrabotki dlya togo, chtoby pomestit' na disk vse ostavshiesya v bufere zapisi (esli takovye imeyutsya) i skorrektirovat' sootvetstvuyushchij element oglavleniya. - Pri ispol'zovanii dlya chteniya i zapisi operacii DOS INT 21H sistema avtomaticheski izmenyaet tekushchij nomer zapisi v FCB. - Operaciya chteniya po preryvaniyu DOS INT 21H proveryaet nalichie trebuemoj zapisi snachala v bufere i pri otsutstvii vypolnyaet chtenie s diska. - Pryamoj metod dostupa trebuet ukazaniya nomera zapisi v pole otnositel'nogo nomera zapisi bloka FCB. - Vosem' bajt (dvojnoe slovo) otnositel'nogo nomera zapisi kodiruyutsya v obratnoj posledovatel'nosti bajt. - Esli trebuemaya zapis' pri pryamom dostupe uzhe nahoditsya v bufere, to sistema peredaet ee neposredstvenno v DTA. V protivnom sluchae vypolnyaetsya chtenie s diska v bufer vsego sektora, soderzhashchego neobhodimuyu zapis'. - Operacii pryamogo blochnogo chteniya i zapisi bolee effek tivny pri nalichii dostatochnoj pamyati. |ti operacii osobenno udobny dlya zagruzki tablic. Assembler dlya IBM PC. Glava 16. 18 - Komandy DOS INT 25H i 26H osushchestvlyayut diskovye operacii absolyutnogo chteniya i zapisi, no ne podderzhivayut obrabotku oglavleniya, ne opredelyayut konec fajla i ne obespechivayut blokirovanie i deblokirovanie zapisej. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 16.1. Napishite funkcii bazovoj versii DOS dlya sleduyushchih ope racij: a) sozdanie fajla, b) ustanovka DTA, v) posle dovatel'naya zapis', g) otkrytie fajla, d) posledova tel'noe chtenie. 16.2. Programma ispol'zuet razmer zapisi, ustanavlivaemyj pri otkrytii fajla po umolchaniyu. a) Skol'ko zapisej soderzhit odin sektor? b) Skol'ko zapisej soderzhit disketa s tremya dorozhkami po devyat' sektorov na kazhdoj? v) Esli na diskete (b) nahoditsya odin fajl, to pri posledovatel'nom chtenii skol'ko proizojdet fizicheskih obrashchenij k disku? 16.3. Napishite programmu, kotoraya sozdaet diskovyj fajl, soderzhashchij zapisi iz treh elementov: nomer tovara (pyat' simvolov), naimenovanie tovara (12 simvolov) i stoimost' edinicy tovara (odno slovo). Vvod etih znachenij dolzhen osushchestvlyat'sya pol'zovatelem s klaviatury. Ne zabud'te preobrazovat' chisla iz ASCII predstavleniya v dvoichnoe predstavlenie. 16.4. Napishite programmu, kotoraya vyvodit na ekran fajl, sozdannyj v voprose 16.3. 16.5. Opredelite tekushchij blok i zapis' dlya sleduyushchih nomerov zapisej pri pryamom dostupe: a)45, b)73, v)150, g)260. 16.6. V kakom vide nomer zapisi 2652 (desyatichnoe) ustanavli vaetsya v pole otnositel'noj zapisi bloka FCB? 16.7. Ukazhite shestnadcaterichnye nomera funkcij dlya sledu yushchih operacij: a) pryamaya zapis', b) pryamoe chtenie, v) pryamaya blochnaya zapis', g) pryamoe blochnoe chtenie. 16.8. Napishite komandy dlya opredeleniya chisla zapisej fajla, predpolagaya, chto operaciya otkrytiya uzhe vypolnena. Imena polej s razmerom fajla FCB FLSZ i razmerom zapisi FCB FCSZ. 16.9. Ispol'zuya programmu iz voprosa 16.4 dlya sozdaniya fajla s kolichestvom, cenami i naimenovaniyami tovarov, sformirujte fajl s privedennymi nizhe dannymi. Napishite programmu, kotoraya vypolnyaet odno blochnoe chtenie dannogo fajla i vyvodit kazhduyu zapis' na ekran. Nomer Cena Naimenovanie 023 00315 Assemblery 024 00430 Kompanovshchiki 027 00525 Kompilyatory 049 00920 Kompressory 114 11250 |kstraktory 117 00630 Buksiry Assembler dlya IBM PC. Glava 16. 19 122 10520 Lifty 124 21335 Processory 127 00960 Stanki dlya nakleivaniya metok 232 05635 CHerpateli? 999 00000 16.10. Izmenite programmu iz voprosa 16.9 tak, chtoby ceny zapisyvalis' na disk v dvoichnom formate. 16.11. Izmenite programmu iz voprosa 16.9 tak, chtoby a) is pol'zovalas' operaciya pryamogo chteniya, b) pol'zovatel' mog vvodit' nomer i kolichestvo tovara i v) vypolnya los' vychislenie i vyvod na ekran stoimosti (proizve denie kolichestva tovara na stoimost' edinicy tovara). Assembler dlya IBM PC. Glava 17. 1 GLAVA 17. Diskovaya pamyat' III: Rasshirennye funkcii DOS ------------------------------------------------------------ Diskovaya pamyat' III: Rasshirennye funkcii DOS Cel': Oznakomit' s rasshirennymi funkciyami DOS, nachinaya s versii 2.0 dlya obrabotki diskovyh fajlov. VVEDENIE ------------------------------------------------------------ Funkcii bazovoj versii DOS dlya obrabotki fajlov, pokazan nye v glave 16, dejstvitel'ny dlya vseh posleduyushchih versij DOS. V dannoj glave pokazany ryad rasshirennyh funkcij, vveden nyh v versiyah DOS 2.0 i 3.0 i ne podderzhivaemyh v rannih ver siyah. Prezhde, chem pytat'sya vypolnit' diskovye operacii iz dannoj glavy, sleduet ubedit'sya v nalichii neobhodimoj versii DOS. Mnogie iz rasshirennyh funkcij proshche svoih analogov v bazo voj versii DOS. V rukovodstvah po DOS rekomenduetsya ispol' zovat' novye funkcii, kotorye bolee estestvenny dlya sistem tipa UNIX. Nekotorye operacii vklyuchayut ispol'zovanie strok v formate ASCIIZ dlya nachal'noj ustanovki diskovoda, puti dostupa i imeni fajla; nomera fajla dlya posledovatel'nogo dostupa k fajlu; special'nyh kodov vozvrata. DANNYE V FORMATE ASCIIZ ------------------------------------------------------------ Pri ispol'zovanii mnogih rasshirennyh funkcij dlya disko vyh operacij neobhodimo soobshchit' DOS adres stroki v formate ASCIIZ, soderzhashchej identifikaciyu fajla v vide nomera disko- voda, puti dostupa i imeni fajla (vse parametry neobyazatel' nye) i stroka dolzhna zavershat'sya shestnadcaterichnym nulem, naprimer: PATHNM1 DB 'B:\TEST.ASM',0 PATHNM2 DB 'C:\UTILITY\NU.EXE',0 Obratnaya kosaya (ili pryamaya kosaya) ispol'zuyutsya v kachest ve razdelitelya. Nulevoj bajt (zero) zavershaet stroku (otsyuda nazvanie ASCIIZ formata). Dlya preryvanij, ispol'zuyushchih v ka chestve parametra ASCIIZ stroku, adres etoj stroki zagruzhaet sya v registr DX, naprimer, komandoj LEA DX,PATHNM1. FAJLOVYJ NOMER I KODY VOZVRATA ------------------------------------------------------------ Operacii sozdaniya i otkrytiya fajla trebuyut zagruzki v registr AX dvuhbajtovogo chisla, predstavlyayushchego soboj fajlo vyj nomer. V glave 8 pokazano, chto standartnye ustrojstva ne nuzhdayutsya v operacii otkrytiya i mogut ispol'zovat' neposredstvenno fajlovye nomera: 0 - vvod, 1 - vyvod, 2 - vyvod soobshchenij ob oshibkah, 3 - vneshnee ustrojstvo, 4 - prin ter. Assembler dlya IBM PC. Glava 17. 2 Dlya dostupa k disku pri sozdanii ili otkrytii fajla is pol'zuetsya ASCIIZ stroka i funkcii DOS shest. 3C ili 3D. Us peshnaya operaciya ustanavlivaet flag CF v 0 i pomeshchaet fajlo vyj nomer v registr AX. |tot nomer neobhodimo sohranit' v elemente dannyh DW i ispol'zovat' ego dlya vseh posleduyushchih operacij nad diskovym fajlom. Pri neuspeshnoj operacii flag CF ustanavlivaetsya v 1, a v registr AX pomeshchaetsya kod oshib- ki, zavisyashchij ot operacii (sm.tabl.17.1). 01 Oshibka nomera funkcii 02 Fajl ne najden 03 Put' dostupa ne najden 04 Otkryto slishkom mnogo fajlov 05 Net dostupa (Operaciya otvergnuta) 06 Oshibka fajlovogo nomera 07 Blok upravleniya pamyat'yu razrushen 08 Nedostatochno pamyati 09 Oshibka adresa bloka pamyati 10 Oshibka oborudovaniya 11 Oshibka formata 12 Oshibka koda dostupa 13 Oshibka dannyh 15 Oshibka diskovoda 16 Popytka udalit' oglavlenie 17 Drugoe ustrojstvo ? 18 Net bol'she fajlov SOZDANIE DISKOVOGO FAJLA ------------------------------------------------------------ V posleduyushchih razdelah raskryty trebovaniya k sozdaniyu, zapisi i zakrytiyu diskovyh fajlov dlya rasshirennoj versii DOS. Sozdanie fajla: SHest.3C Dlya sozdaniya novogo fajla ili perepisyvaniya starogo fajla ispol'zuetsya funkciya shest.3C. Pri etom registr DX dolzhen soderzhat' adres ASCIIZ-stroki, a registr CX - neobhodimyj atribut. Bajt atribut byl rassmotren v glave 15; dlya obychno go fajla znachenie atributa - 0. Rassmotrim primer sozdaniya obychnogo fajla: MOV AH,3CH ; Zapros na sozdanie MOV CX,00 ; obychnogo fajla LEA DX,PATHNM1 ; ASCIIZ stroka INT 21H ; Vyzov DOS JC error ; Perehod po oshibke MOV HANDLE1,AX ; Sohranenie fajlovogo nomera v DW Pri pravil'nom otkrytii operaciya sozdaet element oglav leniya s dannym atributom, ochishchaet flag CF i ustanavlivaet fajlovyj nomer v registre AX. |tot nomer dolzhen ispol'zo vat'sya dlya vseh posleduyushchih operacij. Esli sozdavaemyj fajl uzhe sushchestvuet (t.e. imya fajla prisutstvuet v oglavlenii), to dlina etogo fajla ustanavlivaetsya v 0 dlya perezapisi. Assembler dlya IBM PC. Glava 17. 3 V sluchae vozniknoveniya oshibki operaciya ustanavlivaet flag CF v 1 i pomeshchaet v registr AX kod vozvrata: 03, 04 ili 05 (sm.tabl.17.1). Kod 05 svidetel'stvuet libo o perepolnenii oglavleniya, libo o zashchite sushchestvuyushchego fajla atributom "tol'ko chtenie". Pri zavershenii operacii neobhodimo snachala proverit' flag CF, tak kak pri sozdanii fajla vozmozhna ustanovka v registre AX fajlovogo nomera 0005, kotoryj mozhno legko sputat' s kodom oshibki 05 (net dostupa). Zapis' fajla: shest.40 Dlya zapisi fajla ispol'zuetsya funkciya DOS shest.40. Pri etom v registre BX dolzhen byt' ustanovlen fajlovyj nomer, v registre CX - chislo zapisyvaemyh bajt, a v registre DX - adres oblasti vyvoda. V sleduyushchem primere proishodit zapis' 256 bajt iz oblasti OUTREC: HANDLE1 DW ? OUTREC DB 256 DUP (' ') MOV AH,40H ; Zapros zapisi MOV BX,HANDLE1 ; Fajlovyj nomer MOV CX,256 ; Dlina zapisi LEA DX,OUTREC ; Adres oblasti vyvoda INT 21H ; Vyzov DOS JC error2 ; Proverka na oshibku CMP AX,256 ; Vse bajty zapisany? JNE error3 Pravil'naya operaciya zapisyvaet iz pamyati na disk vse dan nye (256 bajt), ochishchaet flag CF i ustanavlivaet v registre AX chislo dejstvitel'no zapisannyh bajtov. Esli disk perepol nen, to chislo zapisannyh bajtov mozhet otlichat'sya ot zadan nogo chisla. V sluchae nepravil'noj operacii flag CF ustanav livaetsya v 1, a v registr AX zanositsya kod 05 (net dostupa) ili 06 (oshibka fajlovogo nomera). Zakrytie fajla : shest.3E Posle zaversheniya zapisi fajla neobhodimo ustanovit' fajlo vyj nomer v registr BX i, ispol'zuya funkciyu DOS shest.3E, zakryt' fajl. |ta operaciya zapisyvaet vse ostavshiesya eshche dannye iz bufera na disk i korrektiruet oglavlenie i tabli cu FAT. MOV AH,3EH ; Zapros na zakrytie fajla MOV BX,HANDLE1 ; Fajlovyj nomer INT 21H ; Vyzov DOS V sluchae oshibki v registre AX ustanavlivaetsya kod 06 (nepravil'nyj fajlovyj nomer). PROGRAMMA:ISPOLXZOVANIE FAJLOVOGO NOMERA DLYA SOZDANIYA FAJLA. ------------------------------------------------------------ Programma, privedennaya na ris.17.2, sozdaet fajl po imeni, kotoroe vvoditsya pol'zovatelem s klaviatury. V programme imeyutsya sleduyushchie osnovnye procedury: Assembler dlya IBM PC. Glava 17. 4 C10CREA Ispol'zuet funkciyu shest.3C dlya sozdaniya fajla i sohranyaet fajlovyj nomer v elemente dannyh po imeni HANDLE. D10PROC Prinimaet vvod s klaviatury i ochishchaet probelom bajty ot konca vvedennogo imeni do konca oblasti vvoda. F10WRIT Zapisyvaet fajl, ispol'zuya funkciyu shest.40. G10CLSE V zavershenii obrabotki, ispol'zuya funkciyu shest.3E, zakryvaet fajl dlya togo, chtoby sozdat' pravil'nyj element oglavleniya. Oblast' vvoda imeet dlinu 30 bajtov i zavershaetsya dvumya bajtami: vozvrat karetki (shest.0DH) i konec stroki (shest. 0AH). Takim obrazom obshchaya dlina oblasti vvoda - 32 bajta. Programma perenosit na disk 32-x bajtovye zapisi, kak zapisi fiksirovannoj dliny. Mozhno opustit' bajty "vozvrat karetki" i "konec stroki", no vklyuchit' ih, esli potrebuetsya sorti rovka fajla. Programma DOS SORT trebuet nalichiya etih bajtov dlya indikacii konca zapisej. Dlya nashego primera komanda SORT mozhet vyglyadet' sleduyushchim obrazom: SORT B:<NAMEFILE.DAT >NAMEFILE.SRT V rezul'tate vypolneniya dannoj komandy zapisi iz fajla NAMEFILE.DAT v vozrastayushchej posledovatel'nosti budut pome shcheny v fajl NAMEFILE.SRT. Programma, privedennaya na ris.17.3 vypolnyaet chtenie zapisej iz fajla NAMEFILE.SRT i vyvod ih na ekran. Obratite vnimanie na dva momenta: 1) Simvoly voz- vrat karetki i konec stroki vklyucheny v konce kazhdoj zapisi tol'ko dlya vypolneniya sortirovki i v drugih sluchayah mogut byt' opushcheny. 2) Zapisi mogut imet' peremennuyu dlinu (po dline vvodimyh s klaviatury imen); eta osobennost' vklyuchaet nekotoroe dopolnitel'noe programmirovanie, kak eto budet po kazano na ris.17.4. ------------------------------------------------------------ ------------------------------------------------------------ Ris.17.2. Ispol'zovanie fajlovogo nomera dlya sozdaniya fajla. CHTENIE DISKOVOGO FAJLA ------------------------------------------------------------ V sleduyushchih razdelah raskryty trebovaniya dlya otkrytiya i chteniya diskovyh fajlov v rasshirennoj versii DOS. Otkrytie fajla: shest.3D Esli v programme trebuetsya prochitat' diskovyj fajl, to prezhde neobhodimo otkryt' ego, ispol'zuya funkciyu shest.3D. |ta operaciya proveryaet pravil'nost' imeni fajla i ego nali chie na diske. Pri otkrytii registr DX dolzhen soderzhat' ad res neobhodimoj ASCIIZ-stroki, a registr AL - kod dostupa: 0 Otkryt' fajl tol'ko dlya vvoda 1 Otkryt' fajl tol'ko dlya vyvoda Assembler dlya IBM PC. Glava 17. 5 2 Otkryt' fajl dlya vvoda i vyvoda Ostal'nye bity registra AL ispol'zuyutsya dlya razdeleniya faj lov DOS versii 3.0 i starshe (sm.tehnicheskoe rukovodstvo po DOS). Obratite vnimanie, chto dlya zapisi fajla ispol'zuetsya funkciya sozdaniya (shest.3C), no ne funkciya otkrytiya fajla. Nizhe priveden primer otkrytiya fajla dlya chteniya: MOV AH,3DH ; Zapros na otkrytie MOV AL,00 ; Tol'ko chtenie LEA DX,PATHNM1 ; Stroka v formate ASCIIZ INT 21H ; Vyzov DOS JC error4 ; Vyhod po oshibke MOV HANDLE2,AX ; Sohranenie nomera v DW Esli fajl s neobhodimym imenem sushchestvuet, to operaciya otkrytiya ustanavlivaet dlinu zapisi ravnoj 1, prinimaet sushchestvuyushchij atribut, sbrasyvaet flag CF i zanosit fajlovyj nomer v registr AX. Fajlovyj nomer ispol'zuetsya v dal'nej shem dlya vseh posleduyushchih operacij. Esli fajl otsutstvuet, to operaciya ustanavlivaet flag CF i zanosit v registr AX kod oshibki: 02, 04, 05 ili 12 (sm. ris.17.1). Ne zabyvajte proveryat' flag CF. Pri uspeshnom sozdanii fajla sistema mozhet ustanovit' v registre AX fajlo vyj nomer 0005, chto legko mozhno sputat' s kodom oshibki 05 (net dostupa). CHtenie fajla: SHest.3F Dlya chteniya zapisej fajla ispol'zuetsya funkciya DOS shest. 3F. Pri etom neobhodimo ustanovit' v registre BX fajlovyj nomer, v registre CX - chislo bajtov i v registre DX - adres oblasti vvoda. V sleduyushchem primere proishodit schityvanie 512-bajtovoj zapisi: HANDLE2 DW ? INPREC DB 512 DUP (' ') MOV AH,3FH ; Zapros na chtenie MOV BX,HANDLE2 ; Fajlovyj nomer MOV CX,512 ; Dlina zapisi LEA DX,INPREC ; Adres oblasti vvoda INT 21H ; Vyzov DOS JC error5 ; Proverka na oshibku CMP AX,00 ; Prochitano 0 bajtov? JE endfile Pravil'no vypolnennaya operaciya schityvaet zapis' v pamyat', sbrasyvaet flag CF i ustanavlivaet v registre AX chislo dejstvitel'no prochitannyh bajtov. Nulevoe znachenie v regist re AX oboznachaet popytku chteniya posle konca fajla. Oshibochnaya operaciya ustanavlivaet flag CF i vozrashchaet v registre AX kod oshibki 05 (net dostupa) ili 06 (oshibka fajlovogo nome ra). Assembler dlya IBM PC. Glava 17. 6 Tak kak DOS ogranichivaet chislo odnovremenno otkrytyh fajlov, to programma, uspeshno otrabotavshaya s neskol'kimi fajlami, dolzhna zakryvat' ih. PROGRAMMA: ISPOLXZOVANIE FAJLOVOGO NOMERA DLYA CHTENIYA FAJLA ------------------------------------------------------------ Na ris.17.3 privedena programma, kotoraya chitaet fajl, sozdannyj predydushchej programmoj (sm.ris.17.2) i otsorti rovannyj komandoj DOS SORT. Dlya otkrytiya fajla ispol'zuetsya funkciya shest.3D. Poluchennyj v rezul'tate fajlovyj nomer zanositsya v pole HANDLE i ispol'zuetsya zatem v funkcii shest.3F dlya chteniya fajla. V programme net neobhodimosti perenosit' kursor na novuyu stroku, tak kak zapisi soderzhat v konce simvoly "vozvrat karetki" i "novaya stroka". ASCII-FAJLY (FAJLY V FORMATE ASCII) ------------------------------------------------------------ V predydushchih primerah byli pokazany operacii sozdaniya i chteniya fajlov. Analogichnym obrazom mozhno obrabatyvat' ASCII- fajly (tekstovye fajly), sozdannye DOS ili redaktorom. Dlya etogo neobhodimo znat' organizaciyu oglavleniya i tablicy FAT, a takzhe sposob zapisi dannyh v sektor diska, ispol'zuemyj sistemoj. Sistema DOS zapisyvaet, naprimer, ASM-fajl v toch nom sootvetstvii s vvodom s klaviatury, vklyuchaya simvoly tabu lyacii (shest.09), vozvrat karetki (shest.OD) i konec stroki (shest.OA). Dlya ekonomii diskovoj pamyati DOS ne zapisyvaet probely, kotorye nahodyatsya na ekrane i predshestvuyut simvolu tabulyacii, i probely, nahodyashchiesya v stroke sprava ot simvola "vozvrat karetki". Sleduyushchij primer illyustriruet assemb lernuyu komandu, kak ona mozhet vyglyadet' na ekrane: <tab>MOV<tab>AH,09<return> ------------------------------------------------------------ ------------------------------------------------------------ Ris.17.3. Ispol'zovanie fajlovogo nomera dlya chteniya fajla. Dlya takoj stroki soderzhimoe ASCII-fajla budet: 094D4F560941482C30390D0A Kogda programma TYPE ili redaktor chitayut fajl i vyvodyat na ekran simvoly "tabulyaciya", "vozvrat karetki" i "konec stroki" avtomaticheski vyravnivayut dannye. Rassmotrim programmu, privedennuyu na ris.17.4, kotoraya chitaet i vyvodit na ekran fajl HANREAD.ASM (primer na ris. 17.3) po sektoram. Esli programma HANREAD uzhe vvedena i proverena, to mozhno prosto skopirovat' ee v fajl s novym imenem. ------------------------------------------------------------ ------------------------------------------------------------ Assembler dlya IBM PC. Glava 17. 7 Ris.17.3. CHtenie ASCII-fajla. Programma vypolnyaet v osnovnom te zhe funkcii, chto i DOS TYPE, t.e. vyvodit na ekran kazhduyu zapis' do simvolov "vozvrat karetki" i "konec stroki" (CR/LE). Prokrutka soderzhimogo ekrana (skrolling) vyzyvaet nekotorye problemy. Esli v programme ne budet predusmotreno special'noj proverki na konec ekrana, to vyvod novyh strok budet osushchestvlyat'sya povreh staryh i pri korotkoj dline starye simvoly budut ostavat'sya sprava ot novoj stroki. Dlya pravil'noj prokrutki neobhodimo podschityvat' stroki i kontrolirovat' dostizhenie konca ekrana. Tak kak stroki ASCII-fajla imeyut peremennuyu dlinu, to sleduet opredelyat' konec kazhdoj stroki prezhde, chem vyvodit' ee na ekran. Rassmatrivaemaya programma schityvaet polnyj sektor dannyh v oblast' SECTOR. Procedura G10XFER peredaet dannye pobajtno iz oblasti SECTOR v oblast' DISAREA, otkuda oni budut vydavat'sya na ekran. Pri obnaruzhenii simvola "konec stroki", procedura vyvodit na ekran soderzhimoe DISAREA, vklyuchaya "konec stroki". (|kran displeya prinimaet takzhe simvoly tabulyacii (shest.09) i avtomaticheski ustanavlivaet kursor v sleduyushchuyu sprava poziciyu kratnuyu 8). V programme neobhodimo proveryat' konec sektora (dlya schityvaniya sleduyushchego) i konec oblasti vyvoda. Dlya standartnyh ASCII-fajlov, takih kak ASM-fajly, kazhdaya stroka imeet otnositel'no korotkuyu dlinu i garantirovano zaversha etsya paroj simvolov CR/LF. Netekstovye fajly, takie kak EXE ili OBJ, ne imeyut strok i poetomu rassmatrivaemaya pro gramma dolzhna proveryat' dostizhenie konca oblasti DISAREA vo izbezhanie razrusheniya. Hotya programma prednaznachena dlya vyvoda na ekran tol'ko ASCII-fajlov, ona imeet proverku dlya strahovki ot vsyakih neozhidannyh nesimvol'nyh fajlov. Procedura G10XFER vypolnyaet sleduyushchee: 1. Inicializiruet adres oblasti SECTOR. 2. Inicializiruet adres oblasti DISAREA. 3. Pri dostizhenii konca oblasti SECTOR schityvaet sleduyushchij sektor. V sluchae konca fajla, zavershaet rabotu programmy, inache inicializiruet adres oblasti SECTOR. 4. Pri dostizhenii konca oblasti DISAREA vstavlyaet simvoly CR/LF, vyvodit stroku na ekran i inicializiruet adres DISAREA. 5. Perepisyvaet simvol iz oblasti SECTOR v oblast' DISAREA. 6. Po simvolu "konec fajla" (shest.1A) zavershaet rabotu pro grammy. 7. Po simvolu "konec stroki" (shest.OA) vyvodit na ekran stroku i perehodit na p.2, po drugim simvolam idet na p.3. Poprobujte vypolnit' etu programmu v otladchike DEBUG. Pri kazhdom vvode s diska prosmotrite soderzhimoe oblasti vvoda i obratite vnimanie na to, kak DOS formatiruet zapisi. Dlya uluchsheniya dannoj programmy organizujte vyvod na ekran zaprosa dlya ukazaniya pol'zovatelem imeni i tipa fajla. Assembler dlya IBM PC. Glava 17. 8 DRUGIE DISKOVYE FUNKCII V RASSHIRENNOJ VERSII DOS ------------------------------------------------------------ Poluche