JNZ ... ; nechetnoe znachenie? 3. TEST DX,OFFH ;Registr DX soderzhit JZ ... ; nulevoe znachenie? Eshche odna logicheskaya komanda NOT ustanavlivaet obpatnoe znache nie bit v bajte ili v slove, v registre ili v pamyati: nuli stanovyatsya edinicami, a edinicy - nulyami. Esli, naprimer, pegistr AL soderzhit 1100 0101, to komanda NOT AL izmenyaet eto znachenie na 0011 1010. Flagi ne menyayutsya. Komanda NOT ne ekvivalentna komande NEG, kotoraya menyaet znachenie s polozhitel'nogo na otricatel'noe i naoborot, posredstvom zameny bit na protivopolozhnoe znachenie i pribavleniya edinicy (sm."Otricatel'nye chisla" v gl.1.). PROGRAMMA: IZMENENIE STROCHNYH BUKV NA ZAGLAVNYE ------------------------------------------------------------ Sushchestvuyut razlichnye prichiny dlya preobrazovanij mezhdu strochnymi i zaglavnymi bukvami. Naprimer, vy mogli poluchit' fajl dannyh, sozdannyj na komp'yutere, kotoryj rabotaet tol'ko s zaglavnymi bukvami. Ili nekaya programma dolzhna pozvolit' pol'zovatelyam vvodit' komandy kak zaglavnymi, tak i strochnymi bukvami (naprimer, YES ili yes) i preobrazovat' ih v zaglavnye dlya proverki. Zaglavnye bukvy ot A do Z imeyut Assembler dlya IBM PC. Glava 7 146 shest.kody ot 41 do 5A, a strochnye bukvy ot a do z imeyut shest.kody ot 61 do 7A. Edinstvennaya paznica v tom, chto pyatyj bit raven 0 dlya zaglavnyh bukv i 1 dlya strochnyh: Bity: 76543210 Bity: 76543210 Bukva A: 01000001 Bukva a: 01100001 Bukva Z: 01011010 Bukva z: 01111010 COM-programma, privedennaya na ris. 7.6, preobrazuet dannye v pole TITLEX iz strochnyh bukv v propisnye, nachinaya s adresa TITLEX+1. Programma inicializiruet registr BX adresom TITLEX+1 i ispol'zuet ego dlya peresylki simvolov v registr AH, nachinaya s TITLEX+1. Esli poluchennoe znachenie lezhit v predelah ot shest.61 i do 7A, to komanda AND ustanavlivaet bit 5 v 0: AND AH,11011111B Vse simvoly, otlichnye ot strochnyh bukv (ot a do z), ne izmenyayutsya. Izmenennye simvoly zasylayutsya obratno v oblast' TITLEX, znachenie v registre BX uvelichivaetsya dlya ocherednogo simvola i osushchestvlyaetsya perehod na sleduyushchij cikl. Ispol'zuemyj takim obrazom registr BX dejstvuet kak indeksnyj registr dlya adresacii v pamyati. Dlya etih celej mozhno ispol'zovat' takzhe registry SI i DI. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 7.6. Izmenenie strochnyh bukv na propisnye. KOMANDY SDVIGA I CIKLICHESKOGO SDVIGA ------------------------------------------------------------ Komandy sdviga i ciklicheskogo sdviga, kotorye predstavlya yut soboj chast' logicheskih vozmozhnostej komp'yutera, imeyut sleduyushchie svojstva: - obrabatyvayut bajt ili slovo; - imeyut dostup k registru ili k pamyati; - sdvigayut vlevo ili vpravo; - sdvigayut na velichinu do 8 bit (dlya bajta) i 16 bit (dlya slova); - sdvigayut logicheski (bez znaka) ili arifmeticheski (so znakom). Znachenie sdviga na 1 mozhet byt' zakodirovano kak neposred ctvennyj operand, znachenie bol'she 1 dolzhno nahodit'sya v registre CL. Komandy sdviga Pri vypolnenii komand sdviga flag CF vsegda soderzhit zna chenie poslednego vydvinutogo bita. Sushchestvuyut sleduyushchie komandy cdviga: Assembler dlya IBM PC. Glava 7 147 SHR ;Logicheskij (bezznakovyj) sdvig vpravo SHL ;Logicheskij (bezznakovyj) sdvig vlevo SAR ;Arifmeticheskij sdvig vpravo SAL ;Arifmeticheskij sdvig vlevo Sleduyushchij fragment illyustriruet vypolnenie komandy SHR: MOV CL,03 ; AX: MOV AX,10110111B ; 10110111 SHR AX,1 ; 01011011 ;Sdvig vpravo na 1 SHR AX,CL ; 00001011 ;Sdvig vpravo na 3 Pervaya komanda SHR sdvigaet soderzhimoe registra AX vpravo na 1 bit. Vydvinutyj v rezul'tate odin bit popadaet v flag CF, a samyj levyj bit registra AX zapolnyaetsya nulem. Vtoraya komanda cdvigaet soderzhimoe registra AX eshche na tri bita. Pri etom flag CF posledovatel'no prinimaet znacheniya 1, 1, 0, a v tri levyh bita v registre AX zanosyatsya nuli. Rassmotrim dejstvie komand arifmeticheskogo vpravo SAR: MOV CL,03 ; AX: MOV AX,10110111B ; 10110111 SAR AX,1 ; 11011011 ;Sdvig vpravo na 1 SAR AX,CL ; 11111011 ;Sdvig vpravo na 3 Komanda SAR imeet vazhnoe otlichie ot komandy SHR: dlya zapolne niya levogo bita ispol'zuetsya znakovyj bit. Takim obrazom, polozhitel'nye i otricatel'nye velichiny sohranyayut svoj znak. V privedennom primere znakovyj bit soderzhit edinicu. Pri sdvigah vlevo pravye bity zapolnyayutsya nulyami. Takim obpazom, rezul'tat komand sdviga SHL i SAL indentichen. Sdvig vlevo chasto ispol'zuetsya dlya udvaivaniya chisel, a sdvig vpravo - dlya deleniya na 2. |ti operacii osushchestvlyayutsya znachitel'no bystree, chem komandy umnozheniya ili deleniya. Delenie popolam nechetnyh chisel (naprimer, 5 ili 7) obrazuet men'shie znacheniya (2 ili 3, sootvetstvenno) i ustanavlivaeyut flag CF v 1. Krome togo, esli neobhodimo vypolnit' sdvig na 2 bita, to ispol'zovanie dvuh komand sdviga bolee effektiv no, chem ispol'zovanie odnoj komandy s zagruzkoj registra CL znacheniem 2. Dlya proverki bita, zanesennogo v flag CF ispol'zuetsya komanda JC (perehod, esli est' perenos). Komandy ciklicheskogo sdviga Ciklicheskij sdvig predstavlyaet soboj operaciyu sdviga, pri kotoroj vydvinutyj bit zanimaet osvobodivshijsya razryad. Sushchestvuyut sleduyushchie komandy ciklicheskogo sdviga: ROR ;Ciklicheskij sdvig vpravo ROL ;Ciklicheskij sdvig vlevo RCR ;Ciklicheskij sdvig vpravo s perenosom RCL ;Ciklicheskij sdvig vlevo s perenosom Assembler dlya IBM PC. Glava 7 148 Sleduyushchaya posledovatel'nost' komand illyustriruet operaciyu ciklicheskogo sdviga ROR: MOV CL,03 ; BX: MOV BX,10110111B ; 10110111 ROR BX,1 ; 11011011 ;Sdvig vpravo na 1 ROR BX,CL ; 01111011 ;Sdvig vpravo na 3 Pervaya komanda ROR pri vypolnenii ciklicheskogo sdviga perenosit pravyj edinichnyj bit registra BX v osvobodivshuyusya levuyu poziciyu. Vtoraya komanda ROR perenosit takim obrazom tri pravyh bita. V komandah RCR i RCL v sdvige uchastvuet flag CF. Vydvigae myj iz registra bit zanositsya v flag CF, a znachenie CF pri etom postupaet v osvobodivshuyusya poziciyu. Rassmotrim primer, v kotorom ispol'zuyutsya komandy ciklicheskogo i prostogo sdviga. Predpolozhim, chto 32-bitovoe znachenie nahoditsya v registrah DX:AX tak, chto levye 16 bit lezhat v registre DX, a pravye - v AX. Dlya umnozheniya na 2 etogo znacheniya vozmozhny cleduyushchie dve komandy: SHL AX,1 ;Umnozhenie pary registrov RCL DX,1 ; DX:AX na 2 Zdes' komanda SHL sdvigaet vse bity registra AX vlevo, prichem samyj levyj bit popadaet v flag CF. Zatem komanda RCL sdvigaet vse bity registra DX vlevo i v osvobodivshijsya pravyj bit zanosit znachenie iz flaga CF. ORGANIZACIYA PROGRAMM ------------------------------------------------------------ Nizhe dany osnovnye rekomendacii dlya napisaniya assembler nyh programm: 1. CHetko predstavlyajte sebe zadachu, kotoruyu dolzhna reshit' programma 2. Sdelajte eskiz zadachi v obshchih chertah i splanirujte obshchuyu logiku programmy. Naprimer, esli neobhodimo prove rit' operacii pepesylki neskol'kih bajt (kak v primere na ris.7.5), nachnite c opredeleniya polej s peresylaemy mi dannymi. Zatem splanirujte obshchuyu strategiyu dlya inicializacii, uslovnogo perehoda i komandy LOOP. Privedem osnovnuyu logiku, kotoruyu ispol'zuyut mnogie programmisty v takom sluchae: inicializaciya steka i segmentnyh registrov vyzov podprogrammy cikla vozvrat Podprogramma cikla mozhet byt' splanirovana sleduyushchim obrazom: inicializaciya registrov znacheniyami adresov Assembler dlya IBM PC. Glava 7 149 i chisla ciklov Metka: peresylka odnogo bajta uvelichenie adresov na 1 umen'shenie schetchika na 1: esli schetchik ne nol', to idti na metku esli nol', vozvrat 3. Predstav'te programmu v vide logicheskih blokov, sleduyu shchih drug za drugom. Procedury ne prevyshayushchie 25 strok (razmer ekrana) udobnee dlya otladki. 4. Pol'zujtes' testovymi primerami programm. Popytki zapom nit' vse tehnicheskie detali i programmirovanie slozhnyh programm "iz golovy" chasto privodyat k mnogochislennym oshibkam. 5. Ispol'zujte kommentarii dlya opisaniya togo, chto dolzhna delat' procedura, kakie arifmeticheskie dejstviya ili operacii sravneniya budut vypolnyat'sya i chto delayut redko ispol'zuemye komandy. (Naprimer, komanda XLAT, ne imeyushchaya operandov). 6. Dlya kodirovaniya programmy ispol'zujte zagotovku program my, skopirovannoj v fajl s novym imenem. V sleduyushchih programmah dannoj knigi vazhnym yavlyaetsya ispol'zovanie komandy LEA, indeksnyh registrov SI i DI, vyzyvaemyh procedur. Poluchiv teper' bazovye znaniya po assembleru, mozhem perejti k bolee razvitomu i poleznomu programmirovaniyu. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® Metki procedur (naprimer, B20:) dolzhny zavershat'sya dvoe tochiem dlya ukazaniya tipa NEAR. Otsutstvie dvoetochiya privodit k assemblernoj oshibke. ® Metki dlya komand uslovnogo perehoda i LOOP dolzhny lezhat' v granicah -128 do +127 bajt. Operand takih komand generiruet odin bajt ob®ektnogo koda. SHest. ot 01 do 7F sootvetstvuet desyatichnym znacheniyam ot +1 do +127, a shest. ot FF do 80 pokryvaet znacheniya ot -1 do +128. Tak kak dlina mashinnoj komandy mozhet byt' ot 1 do 4 bajt, to soblyudat' granicy ne prosto. Prakticheski mozhno orientirovat'sya na razmer v dva ekrana ishodnogo teksta (primerno 50 strok). ® Pri ispol'zovanii komandy LOOP, inicializirujte registr CX polozhitel'nym chislom. Komanda LOOP kontroliruet tol'ko nulevoe znachenie, pri otricatel'nom programma budet prodolzhat' ciklit'sya. Assembler dlya IBM PC. Glava 7 150 ® Esli nekotoraya komanda ustanavlivaet flag, to dannyj flag sohranyaet eto znachenie, poka drugaya komanda ego ne izmenit. Naprimer, esli za arifmeticheskoj komandoj, kotoraya ustanavlivaet flagi, sleduyut komandy MOV, to oni ne izmenyat flagi. Odnako, dlya minimizacii chisla vozmozhnyh oshibok, cleduet kodirovat' komandy uslovnogo perehoda neposredstvenno posle komand, ustanavlivayushchih proveryaemye flagi. ® Vybirajte komandy uslovnogo perehoda sootvetstvenno operaciyam nad znakovymi ili bezznakovymi dannymi. ® Dlya vyzova procedury ispol'zujte komandu CALL, a dlya vozvrata iz procedury - komandu RET. Vyzyvaemaya procedu ra mozhet, v svoyu ochered', vyzvat' druguyu proceduru, i esli sledovat' sushchestvuyushchim soglasheniyam, to komanda RET vsegda budet vybirat' iz steka pravil'nyj adres vozvra ta. Edinstvennye primery v etoj knige, gde ispol'zuetsya perehod v proceduru vmesto ee vyzova - v nachale COM- programm. ® Bud'te vnimatel'ny pri ispol'zovanii indeksnyh operan dov. Sravnite: MOV AX,SI MOV AX,[SI] Pervaya komanda MOV peresylaet v registr AX soderzhimoe registra SI. Vtoraya komanda MOV dlya dostupa k peresylae momu slovu v pamyati ispol'zuet otnositel'nyj adres v registre SI. ® Ispol'zujte komandy sdviga dlya udvanivaniya znachenij i dlya deleniya popolam, no pri etom vnimatel'no vybirajte sootvetstvuyushchie komandy dlya znakovyh i bezznakovyh dannyh. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 7.1. Kakoe maksimal'noe kolichestvo bajt mogut obojti koman dy kopotkij JMP, LOOP i otnositel'nyj perehod? Kakoj mashinnyj kod operanda pri etom generiruetsya? 7.2. Komanda JMP nachinaetsya na shest. 0624. Opredelite adres perehoda, esli shest. ob®ektnyj kod dlya operanda komandy JMP: a) 27, b) 6B, v) C6. 7.3. Napishite programmu vychisleniya 12 chisel Fibonachi: 1, 1, 2, 3, 5, 8, 13,... (kazhdoe chislo v posledovatel'nosti predstavlyaet soboj summu dvuh predydushchih chisel). Dlya organizacii cikla ispol'zujte komandu LOOP. Vypolnite assemblirovanie, kompanovku i s pomoshch'yu otladchika DEBUG trassirovku programmy. Assembler dlya IBM PC. Glava 7 151 7.4. Predpolozhim, chto registry AX i BX soderzhat znakovye dannye, a CX i DX - bezznakovye. Opredelite komandy CMP (gde neobhodimo) i komandy bezuslovnogo perehoda dlya sleduyushchih proverok: a) znachenie v DX bol'she, chem v CX? b) znachenie v BX bol'she, chem v AX? v) CX soderzhit nul'? g) bylo li perepolnenie? d) znachenie v BX ravno ili men'she, chem v AX? e) znachenie v DX ravno ili men'she, chem v CX? 7.5. Na kakie flagi vozdejstvuyut sleduyushchie sobytiya i kakoe znachenie etih flagov? a) proizoshlo perepolnenie; b) rezul'tat otricatel'nyj; v) rezul'tat nulevoj; g) obrabotka v odnoshagovom rezhime; d) peredacha dannyh dolzhna byt' sprava nalevo. 7.6. CHto proizojdet pri vypolnenii programmy , privedennoj na ris.7.4, esli v procedure BEGIN budet otsutstvovat' komanda RET? 7.7. Kakaya raznica mezhdu kodirovaniem v direktive PROC opepanda s tipom FAR i s tipom NEAR? 7.8. Kakim obrazom mozhet programma nachat' vypolnenie procedury? 7.9. V EXE-programme procedura A10 vyzyvaet B10, B10 vyzyvaet C10, a C10 vyzyvaet D10. Skol'ko adresov, krome nachal'nyh adresov vozvrata v DOS, soderzhit stek? 7.10. Predpolozhim , chto registr BL soderzhit 11100011 i pole po imeni BOONO soderzhit 01111001. Opredelite vozdejst vie na registr BL dlya sleduyushchih komand: a) XOR BL,BOONO; b) AND BL,BOONO; v) OR BL,BOONO; g) XOR BL,11111111B; d) AND BL,00000000B. 7.11. Izmenite programmu na ris.7.6 dlya: a) opredeleniya soderzhimogo TITLEX zaglavnymi bukvami; b) preobrazova nie zaglavnyh bukv v strochnye. 7.12. Predpolozhim, chto registr DX soderzhit 10111001 10111001, a pegistr CL - 03. Opredelite soderzhimoe registra DX posle sleduyushchih nesvyazannyh komand: a) SHR DX,1; b) SHR DX,CL; v) SHL DX,CL; g) SHL DL,1; d) ROR DX,CL; e) ROR DL,CL; zh) SAL DH,1. 7.13. Ispol'zuya komandy sdviga, peresylki i slozheniya, umnozh'te soderzhimoe registra AX na 10. 7.14. Primer programmy, privedennoj v konce razdela "sdvig i ciklicheskij sdvig", umnozhaet soderzhimoe pary registrov DX:AX na 2. Izmenite programmu dlya: a) umnozheniya na 4; b) deleniya na 4; v) umnozheniya 48 bit v registrah DX:AX:BX na 2. Assembler dlya IBM PC. Glava 8 172 GLAVA 8. |krannye operacii I: Osnovnye svojstva ------------------------------------------------------------ |krannye operacii I: Osnovnye svojstva Cel': Ob®yasnit' trebovaniya dlya vyvoda informacii na ekran, a takzhe dlya vvoda dannyh s klaviatury. VVEDENIE ------------------------------------------------------------ V predydushchih glavah my imeli delo s programmami, v kotor yh dannye opredelyalis' v operandah komand (neposredstvennye dannye) ili inicializirovalis' v konkretnyh polyah programmy. CHislo prakticheskih primenenij takih programm v dejstvitel' nosti malo. Bol'shinctvo programm trebuyut vvoda dannyh s klaviatury, diska ili modema i obespechivayut vyvod dannyh v udobnom formate na ekran, printer ili disk. Dannye, prednaznachennye dlya vyvoda na ekran i vvoda s klaviatury, imeyut ASCII format. Dlya vypolneniya vvoda i vyvoda ispol'zuetsya komanda INT (preryvanie). Sushchestvuyut razlichnye trebovaniya dlya ukazaniya sisteme kakoe dejstvie (vvod ili vyvod) i na kakom ustrojstve neobhodimo vypolnit'. Dannaya glava raskryvaet osnovnye trebovaniya dlya vyvoda informacii na ekran i vvoda dannyh s klaviatury. Vse neobhodimye ekrannye i klaviaturnye operacii mozhno vypolnit' ispol'zuya komandu INT 10H, kotoraya peredaet upravlenie neposredstvenno v BIOS. Dlya vypolneniya nekotoryh bolee slozhnyh operacij sushchestvuet preryvanie bolee vysokogo urovnya INT 21H, kotoroe snachala peredaet upravlenie v DOS. Naprimer, pri vvode s klaviatury mozhet potrebovat'sya podschet vvedennyh simvolov, proverku na maksimal'noe chislo simvolov i proverku na simvol Return. Prepyvanie DOS INT 21H vypolnyaet mnogie iz etih dopolnitel'nyh vychislenij i zatem avtomaticheski peredaet upravlenie v BIOS. Material dannoj glavy podhodit kak dlya monohromnyh (cherno-belyh, BW), tak i dlya cvetnyh videommonitorov. V glavah 9 i 10 priveden material dlya upravleniya bolee sovershennymi ekranami i dlya ispol'zovaeniya cveta. KOMANDA PRERYVANIYA: INT ------------------------------------------------------------ Komanda INT preryvaet obrabotku programmy, peredaet upravlenie v DOS ili BIOS dlya opredelennogo dejstviya i zatem vozvrashchaet upravlenie v prervannuyu programmu dlya prodolzheniya obrabotki. Naibolee chasto preryvanie ispol'zuetsya dlya vypolneniya operacij vvoda ili vyvoda. Dlya vyhoda iz programmy na obrabotku preryvaniya i dlya posleduyushchego vozvrata komanda INT vypolnyaet sleduyushchie dejstviya: Assembler dlya IBM PC. Glava 8 173 ® umen'shaet ukazatel' steka na 2 i zanosit v vershinu steka soderzhimoe flagovogo registra; ® ochishchaet flagi TF i IF; ® umen'shaet ukazatel' steka na 2 i zanosit soderzhimoe registra CS v stek; ® umen'shaet ukazatel' steka na 2 i zanosit v stek znachenie komandnogo ukazatelya; ® obespechivaet vypolnenie neobhodimyh ddejstvij; ® vosstanavlivaet iz steka znachenie registra i vozvrashchaet upravlenie v prervannuyu programmu na komandu, sleduyushchuyu posle INT. |tot process vypolnyaetsya polnost'yu avtomaticheski. Neobho dimo lish' opredelit' segment steka dostatochno bol'shim dlya zapisi v nego znachenij registrov. V dannoj glave rassmotrim dva tipa preryvanij: komandu BIOS INT 10H i komandu DOS INT 21H dlya vyvoda na ekran i vvoda s klaviatury. V posleduyushchih primerah v zavisimosti ot trebovanij ispol'zuyutsya kak INT 10H tak i INT 21H. USTANOVKA KURSORA ------------------------------------------------------------ |kran mozhno predstavit' v vide dvumernogo prostranstva s adresuemymi poziciyami v lyubuyu iz kotoryh mozhet byt' ustanov len kursor. Obychnyj videomonitor, naprimer, imeet 25 strok (numeruemyh ot 0 do 24) i 80 stolbcov (numeruemyh ot 0 do 79). V sleduyushchej tablice privedeny nekotorye primery polozhenij kursora na ekrane: -------------------------------------------------------- Des. format SHest.format -------------- -------------- Polozhenie stroka stolbec stroka stolbec -------------------------------------------------------- Verhnij levyj ugol 00 00 00 00 Verhnij pravyj ugol 00 79 00 4F Centr ekrana 12 39/40 00 27/28 Nizhnij levyj ugol 24 00 18 00 Nizhnij pravyj ugol 24 79 18 4F -------------------------------------------------------- Komanda INT 10H vklyuchaet v sebya ustanovku kursora v lyubuyu poziciyu i ochistku ekrana. Nizhe priveden primer ustanovki kursora na 5-uyu stroku i 12-yj stolbec: MOV AH,02 ;Zapros na ustanovku kursora MOV BH,00 ;|kran 0 MOV DH,05 ;Stroka 05 MOV DL,12 ;Stolbec 12 INT 10H ;Peredacha upravleniya v BIOS Assembler dlya IBM PC. Glava 8 174 Znachenie 02 v registre AH ukazyvaet komande INT 10H na vypol nenie operacii ustanovki kursora. Znachenie stroki i stolbca dolzhny byt' v registre DX, a nomer ekrana (ili stranicy) v registre BH (obychno 0). Soderzhimoe drugih registrov nesushchest venno. Dlya ustanovki stroki i stolbca mozhno takzhe ispol'zo vat' odnu komandu MOV c neposredstvennym shest. znacheniem: MOV DX,050CH ;Stroka 5, stolbec 12 OCHISTKA |KRANA ------------------------------------------------------------ Zaprosy i komandy ostayutsya na ekrane poka ne budut smeshche ny v rezul'tate prokruchivaniya ("skrolinga") ili perepisany na etom zhe meste drugimi zaprosami ili komandami. Kogda programma nachinaet cvoe vypolnenie, ekran mozhet byt' ochishchen. Ochishchaemaya oblast' ekrana mozhet nachinat'sya v lyuboj pozicii i zakanchivat'sya v lyuboj drugoj pozicii s bol'shim nomerom. Nachal'noe znachenie stroki i stolbca zanositsya v registr DX, znachenie 07 - v registr BH i 0600H v AX. V sleduyushchem primere vypolnyaetsya ochistka vsego ekrana: MOV AX,0600H ;AH 06 (prokrutka) ;AL 00 (ves' ekran) MOV BH,07 ;Normal'nyj atribut (cherno/belyj) MOV CX,0000 ;Verhnyaya levaya poziciya MOV DX,184FH ;Nizhnyaya pravaya poziciya INT 10H ;Peredacha upravleniya v BIOS Znachenie 06 v registre AH ukazyvaet komande INT 10H na vypolnenie oparacii ochistki ekrana. |ta operaciya ochishchaet ekran probelami; v sleduyushchej glave skroling (prokrutka) budet passmotren podrobnee. Esli vy po oshibke ustanovili nizhnyuyu pravuyu poziciyu bol'she, chem shest. 184F, to ochistka perejdet vnov' k nachalu ekrana i vtorichno zapolnit nekotorye pozicii prrobelami. Dlya monohromnyh ekranov eto ne vyzyvaet kakih-libo nepriyatnostej, no dlya nekotoryh cvetnyh monitorov mogut vozniknut' ser'eznye oshibki. |KRANNYE I KLAVIATURNYE OPERACII: BAZOVAYA VERSIYA DOS ------------------------------------------------------------ Obychno programmy dolzhny vydat' na ekran soobshchenie o zaver shenii ili ob obnaruzhenii oshibki, otobrazit' zapros dlya vvoda dannyh ili dlya polucheniya ukazaniya pol'zovatelya. Rassmotrim snachala metody, primenyaemye v bazovoj versii DOS, v posleduyu shchih pazdelah budut pokazany rasshirennye metody, vvedennye v DOS versii 2.0. Operacii iz bazovoj DOS rabotayut vo vseh versiyah, hotya v rukovodstve po DOS rekomenduetsya primenyat' rasshirennye vozmozhnosti dlya novyh razrabotok. V bazovoj versii DOS komandy vyvoda na ekran bolee slozhny, no komandy vvoda s klaviatury proshche v ispol'zovanii, blagodarya vstroen nym proverkam. Assembler dlya IBM PC. Glava 8 175 VYVOD NA |KRAN: BAZOVAYA VERSIYA DOS ------------------------------------------------------------ Vyvod na ekran v bazovoj versii DOS trebuet opredeleniya tekstovogo soobshcheniya v oblasti dannyh, ustanovki v registre AH znacheniya 09 (vyzov funkciii DOS) i ukazaniya komandy DOS INT 21H. V processe vypolneniya operacii konec soobshcheniya opredelyaetsya po ogranichitelyu ($), kak eto pokazano nizhe: NAMPRMP DB 'Imya pokupatelya?','$' . . MOV AH,09 ;Zapros vyvoda na ekran LEA DX,NAMPRMP ;Zagruzka adresa soobshch. INT 21H ;Vyzov DOS Znak ogranichitelya "$" mozhno kodirovat' neposredstvenno posle cimvol'noj stroki (kak pokazano v primere), vnutri stroki: 'Imya pokupatelya?$', ili v sleduyushchem operatore DB '$'. Ispol'zuya dannuyu operaciyu, nel'zya vyvesti na ekran simvol dollara "$". Krome togo, esli znak dollara budet otsutstvo vat' v koce stroki, to na ekran budut vyvodit'sya vse posleduyushchie simvoly, poka znak "$" ne vstretit'sya v pamyati. Komanda LEA zagruzhaet adres oblasti NAMPRMP v registr DX dlya peredachi v DOS adresa vyvodimoj informacii. Adres polya NAMPRMP, zagruzhaemyj v DX po komande LEA, yavlyaetsya otnosi tel'nym, poetomu dlya vychisleniya absolyutnogo adresa dannyh DOS skladyvaet znacheniya registrov DS i DX (DS:DX). PROGRAMMA: VYVOD NA |KRAN NABORA SIMVOLOV KODA ASCII ------------------------------------------------------------ Bol'shinstvo iz 256 kodov ASCII imeyut simvol'noe predstav lenie, i mogut byt' vyvedeny na ekran. SHest. kody 00 i FF ne imeyut simvolov i vyvodyatsya na ekran v vide probelov, hotya simvol probela imeet v ASCII shest. kod 20. Na ris. 8.1 pokazana COM-programma, kotoraya vyvodit na ekran polnyj nabor simvolov koda ASCII. Programma vyzyvaet tri procedury; B10CLR, C10SET i D10DISP. Procedura B10CLR ochishchaet ekran, a procedura C10SET ustanavlivaet kursor v polozhenie 00,00. Procedura D10DISP vyvodit soderzhimoe polya CTR, kotoroe v nachale inicializirovano znacheniem 00 i zatem yvelichivaetsya na 1 pri kazhdom vyvode na ekran, poka ne dostignet shest. znacheniya FF. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 8.1. Vyvod na ekran nabora simvolov koda ASCII Tak kak simvol dollara ne vyvoditsya na ekran i krome togo kody ot shest. 08 do shest. 0D yavlyayutsya special'nymi upravlyayushchimi cimvolami, to eto privodit k peremeshcheniyu Assembler dlya IBM PC. Glava 8 176 kursora i drugim upravlyayushchim vozdejstviyam. Zadanie: vvedite programmu (ris.8.1), vypolnite assemblirovanie, kompanovku i preobrazovanie v COM-fajl. Dlya zapuska programmy vvedite ee imya, naprimer, V:ASCII.COM. Pervaya vyvedennaya stroka nachinaetsya s probel'nogo simvola (shest.00), dvuh "ulybayushchihsya lic" (shest. 01 i 02) i treh kartochnyh simvolov (shest.03, 04 i 05). Kod 07 vydaet zvuko voj signal. Kod 06 dolzhen otobrazit'sya kartochnym simvolom "piki", no upravlyayushchie simvoly ot shest.08 do 0D sotrut ego. Kod 0D yavlyaetsya "vozvratom karetki" i privodit k perehodu na novuyu (sleduyushchuyu)stroku. Kod shest.0E - predstavlyaetsya v vide muzykal'noj noty. Simvoly posle shest. 7F yavlyayutsya graficheski mi. Mozhno izmenit' programmu dlya obhoda upravlyayushchih simvolov. Nizhe priveden primer fragmenta programmy, pozvolyayushchij obojti vse simvoly mezhdu shest. 08 i 0D. Vy mozhete poeksperimentirovat', obhodya tol'ko, skazhem, shest. 08 (vozvrat na simvol) i 0D (vozvrat karetki): CMP CTR,08H ;Men'she chem 08? JB D30 ; da - prinyat' CMP CTR,0DH ; Men'she/ravno 0D? JBE D40 ; da - obojti D30: MOV AH,40H ;Vyvod simvolov < 08 ... ; i > 0D INT 21H D40: INC CTR VVOD DANNYH S KLAVIATURY: BAZOVAYA VERSIYA DOS ------------------------------------------------------------ Procedura vvoda dannyh s klaviatury proshche, chem vyvod na ekran. Dlya vvoda, ispol'zuyushchego bazovuyu DOS, oblast' vvoda trebuet nalichiya cpiska parametrov, soderzhashchego polya, kotorye neobhodimy pri vypolnenii komandy INT. Vo-pervyh, dolzhna byt' opredelena maksimal'naya dlina vvodimogo teksta. |to neobhodimo dlya preduprezhdeniya pol'zovatelya zvukovym signa lom, esli nabran slishkom dlinnyj tekst; simvoly, prevyshayushchie maksimal'nuyu dlinu ne prinimayutsya. Vo-vtoryh, v spiske parametrov dolzhno byt' opredelennoe pole, kuda komanda vozvrashchaet dejstvitel'nuyu dlinu vvedennogo teksta v bajtah. Nizhe priveden primer, v kotorom opredelen spisok paramet rov dlya oblasti vvoda. LABEL predstavlyaet soboj direktivu s atributom BYTE. Pervyj bajt soderzhit maksimal'nuyu dlinu vvodimyh dannyh. Tak kak eto odnobajtovoe pole, to vozmozhnoe maksimal'noe znachenie ego - shest. FF ili 255. Vtoroj bajt neobhodim DOS dlya zaneseniya v nego dejstvitel'nogo chisla vvedennyh simvolov. Tret'im bajtom nachinaetsya pole, kotoroe budet soderzhat' vvedennye simvoly. NAMEPAR LABEL BYTE ;Spisok parametrov: Assembler dlya IBM PC. Glava 8 177 MAXLEN DB 20 ; Maksimal'naya dlina ACTLEN DB ? ; Real'naya dlina NAMEFLD DB 20 DUP (' ') ; Vvedennye simvoly Tak kak v spiske parametrov direktiva LABEL ne zanimaet mesta, to NAMEPAR i MAXLEN ukazyvayut na odin i tot zhe adres pamyati. V translyatore MASM dlya opredeleniya spiska parametrov v vide struktury mozhet ispol'zovat'sya takzhe direktiva STRUC. Odnako, v svyazi s tem, chto ssylki na imena, opredelennye vnutri, trebuyut special'noj adresacii, vozderzhimsya cejchas ot rassmotreniya dannoj temy do glavy 24 "Direktivy assemblera". Dlya zaprosa na vvod neobhodimo pomestit' v registr AH nomer funkcii - 10 (shest. 0AH), zagruzit' adres spiska para metrov (NAMEPAR v nashem primere) v registr DX i vypolnit' INT 21H: MOV AH,0AH ;Zapros funkcii vvoda LEA DX,NAMEPAR ;Zagruzit' adresa spiska parametrov INT 21H ;Vyzvat' DOS Komanda INT ozhidaet poka pol'zovatel' ne vvedet s klavia tury tekst, proveryaya pri etom, chtoby chislo vvedennyh cimvo lov ne prevyshalo maksimal'nogo znacheniya, ukazannogo v spiske parametrov (20 v nashem primere). Dlya ukazaniya konca vvoda pol'zovatel' nazhimaet klavishu Return. Kod etoj klavishi (shest. 0D) takzhe zanositsya v pole vvoda (NAMEFLD v nashem primere). Esli, naprimer, pol'zovatel' vvel imya BROWN (Return), to cpisok parametrov budet soderzhat' informaciyu: des.: |20| 5| V| R| O| W| N| #| | | | | ... shest.: |14|05|42|52|4F|57|4E|0D|20|20|20|20| ... Vo vtoroj bajt spiska parametrov (ACTLEN v nashem primere) komanda zanosit dlinu vvedennogo imeni - 05. Kod Return nahoditsya po adresu NAMEFLD +5. Simvol # ispol'zovan zdes' dlya indikacii konca dannyh, tak kak shest. 0D ne imeet otobrazhaemogo simvola. Poskol'ku maksimal'naya dlina v 20 simvolov vklyuchaet shest.0D, to dejstvitel'naya dlina vvodimogo teksta mozhet byt' tol'ko 19 simvolov. PROGRAMMA: VVOD I VYVOD IMEN ------------------------------------------------------------ EXE-programma, privedennaya na ris. 8.2, zaprashivaet vvod imeni, zatem otobrazhaet v seredine ekrana vvedennoe imya i vklyuchaet zvukovoj signal. Programma prodolzhaet zaprashivat' i otobrazhat' imena, poka pol'zovatel' ne nazhmet Return v otvet na ocherednoj zapros. Rassmotrim situaciyu, kogda pol'zovatel' vvel imya TED SMITH: ------------------------------------------------------------ ------------------------------------------------------------ Ris. 8.2. Vvod i otobrazhenie imen Assembler dlya IBM PC. Glava 8 178 1. Razdelim dlinu 09 na 2 poluchim 4, i 2. Vychtem eto znachenie iz 40, poluchim 36 Komanda SHR v procedure E10CENT sdvigaet dlinu 09 na odin bit vpravo, vypolnyaya takim obrazom delenie na 2. Znachenie bit 00001001 perehodit v 00000100. Komanda NEG menyaet znak +4 Na -4. Komanda ADD pribavlyaet znachenie 40, poluchaya v registre DL nomer nachal'nogo stolbca - 36. Pri ustanovke kursora na stroku 12 i stolbec 36 imya budet vyvedeno na ekran v sleduyushchem vide: Stroka 12: TED SMITH | | Stolbec: 36 40 V procedure E10CODE imeetsya komanda, kotoraya ustanavliva et cimvol zvukovogo signala (07) v oblasti vvoda neposred stvenno posle imeni: MOV NAMEFLD[BX],07 Predshestvuyushchaya komanda ustanavlivaet v registre BX znachenie dliny, i komanda MOV zatem, kombiniruya dlinu v registre BX i adres polya NAMEFLD, peresylaet kod 07. Naprimer, pri dline imeni 05 kod 07 budet pomeshchen po adresu NAMEFLD+05 (zameshchaya znachenie koda Return). Poslednyaya komanda v procedure E10CODE ustanavlivaet ogranichitel' "$" posle koda 07. Takim obrazom, kogda procedura F10CENT vyvodit na ekran imya, to generipuet sya takzhe zvukovoj signal. Vvod edinstvennogo simvola Return Pri vvode imeni, prevyshayushchego po dline maksimal'noe znachenie, ukazannoe v spiske parametrov, voznikaet zvukovoj signal i sistema ozhidaet vvoda tol'ko simvola Return. Esli voobshche ne vvodit' imya, a tol'ko nazhat' klavishu Return, to sistema primet ee i ystanovit v spiske parametrov nulevuyu dlinu sleduyushchim obrazom: Spisok parametrov (shest.): |14|00|0D|... Dlya oboznacheniya konca vvodimyh imen pol'zovatel' mozhet pros to nazhat' Return v otvet na ocherednoj zapros na vvod imeni. Progpamma opredelyaet konec vvoda po nulevoj dline. Zamena simvola Return Vvodimye znacheniya mozhno ispol'zovat' dlya samyh raznyh celej, naprimer: dlya pechati soobshchenij, sohraneniya v tablice, zapisi na disk. Pri etom, vozmozhno, poyavitsya neobhodimost' zameny simvola Return (shest.0D) v oblasti NAMEFLD na simvol probela (shest.20). Pole NAMELEN soderzhit Assembler dlya IBM PC. Glava 8 179 dejstvitel'nuyu dlinu ili otnocitel'nyj adres koda 0D. Esli, naprimer, NAMELEN soderzhit dlinu 05, to adres koda 0D raven NAMEFLD+5. Mozhno zanesti etu dlinu v registr BX dlya indeksnoj adresacii v pole NAMEFLD: MOV BH,00 ;Ustanovit' v registre BX MOV BL,NAMELEN ; znachenie 0005 MOV NAMEFLD[BX],20H ;Zamenit' 0D na probel Tret'ya komanda MOV zanosit simvol probela (shest.20) po adresu, opredelennomu pervym operandom: adres polya NAMEFLD plyus soderzhimoe registra BX, t.e. NAMEFLD+5. Ochistka oblasti vvoda Vvodimye simvoly zamenyayut predydushchee soderzhimoe oblasti vvoda i ostayutsya tam, poka drugie simvoly ne zamenyat ih. Rassmotrim sleduyushchie tri uspeshnyh vvoda imen: Vvod NAMEPAR (shest.) 1. BROWN |14|05|42|52|4F|57|4E|0D|20|20|20| ... |20| 2. HAMILTON |14|08|48|41|4D|49|4C|54|4F|4E|0D| ... |20| 3. ADAMS |14|05|41|44|41|4D|53|0D|4F|4E|0D| ... |20| Imya HAMILTON zamenyaet bolee korotkoe imya BROWN. No, tak kak imya ADAMS koroche imeni HAMILTON, to ono zamenyaet tol'ko HAMIL. Kod Return zamenyaet simvol T. Ostal'nye bukvy - ON ostayutsya posle imeni ADAMS. Dlya ochistki polya NAMEFLD do vvoda ocherednogo imeni mozhet sluzhit' sleduyushchaya programma: MOV CX,20 ;Ustanovit' 20 ciklov MOV SI,0000 ;Nachal'naya poziciya polya B30: MOV NAMEFLD[si],20H ;Pereslat' odin probel INC SI ;Sleduyushchaya poziciya polya LOOP B30 ;20 ciklov Vmesto registra SI mozhno ispol'zovat' DI ili BX. Bolee effek tivnyj sposob ochistki polya, predpologayushchij peresylku slova iz dvuh probelov, trebuet tol'ko desyat' ciklov. Odnako, vvidu togo chto pole NAMEFLD opredeleno kak DB (bajtovoe), neobhodimo izmenit' dlinu v komande peresylki, posredstvom operanda WORD, a takzhe vospol'zovat'sya operandom PTR (ukazatel'), kak pokazano nizhe: MOV CX,10 ;Ustanovit' 10 ciklov LEA SI,NAMEFLD ;Nachal'nyj adres B30: MOV WORD PTR[SI],2020H ;Pereslat' dva probela INC SI ;Poluchit' adres INC SI ; sleduyushchego slova LOOP B30 ;10 ciklov Assembler dlya IBM PC. Glava 8 180 Komanda MOV po metke B30 oboznachaet peresylku slova iz dvuh probelov po adresu, nahodyashchemusya v registre SI. V poslednem primepe ispol'zuetsya komanda LEA dlya inicializacii registra SI i neskol'ko inoj sposob v komande MOV po metke V30, tak kak nel'zya zakodirovat', naprimer, sleduyushchuyu komandu: MOV WORD PTR[NAMEFLD],2020H ;Nepravil'no Ochistka vhodnoj oblasti reshaet problemu vvoda korotkih imen, za kotorymi sleduyut predydushchie dannye. Eshche bolee effek tivnyj cposob predpologaet ochistku tol'ko teh bajt, kotorye raspolozheny posle vvedennogo imeni. |KRANNYE I KLAVIATURNYE OPERACII: RASSHIRENNAYA VERSIYA DOS ------------------------------------------------------------ Rassmotrim teper' rasshirennye vozmozhnosti, vvedennye v DOS 2.0 (realizovannye v stile operacionnoj sistemy UNIX). Esli vy ispol'zuete bolee mladshuyu versiyu DOS, to ne smozhete vypolnit' primery iz dannogo razdela. Rasshirennye vozmozhnos ti vklyuchayut fajlovyj nomer (file handle), kotoryj ystanav livaetsya v registre BX, kogda trebuetsya vypolnit' operaciyu vvoda/vyvoda. Sushchestvuyut sleduyushchie standartnye fajlovye nomera: 0 Vvod (obychno s klaviatury) CON 1 Vyvod (obychno na ekran) CON 2 Vyvod po oshibke (na ekran) CON 3 Vvod/vyvod na vneshnee ustrojstvo AUX 4 Vyvod na pechat' LPT1 ili PRN Preryvanie DOS dlya vvoda/vyvoda - INT 21H, neobhodimaya funkciya zaprashivaetsya cherez registr AH: shest.3F - dlya vvoda, shest.40 - dlya vyvoda. V registr CX zanositsya chislo bajt dlya vvoda/vyvoda, a v registr DX - adres oblasti vvoda/vyvoda. V rezul'tate uspeshnogo vypolneniya operacii vvoda/vyvoda ochishchaetsya flag perenosa (CF) i v registr AX ustanavlivaetsya dejstvitel'noe chislo bajt, uchastvuyushchih v operacii. Pri neuspeshnoj operacii ustanavlivaetsya flag CF, a kod oshibki (v dannom sluchae 6) zanositsya v registr AX. Poskol'ku registr AX mozhet soderzhat' kak dlinu dannyh, tak i kod oshibki, to edinstvennyj sposob opredelit' nalichie oshibki - proverit' flag CF, hotya oshibki chteniya s klaviatury i vyvoda na ekran - yavleniya krajne redkie. Analogichnym obrazom ispol'zuyutsya fajlovye nomera dlya diskovyh fajlov, zdes' oshibki vvoda/vyvoda vstrechayutsya chashche. Mozhno ispol'zovat' eti funkcii dlya perenapravleniya vvoda- vyvoda na drugie ustrojstva, odnako eta osobennost' zdes' ne rassmatpivaetsya. VYVOD NA |KRAN: RASSHIRENNAYA VERSIYA DOS ------------------------------------------------------------ Assembler dlya IBM PC. Glava 8 181 Sleduyushchie komandy illyustriruyut operaciyu vyvoda na ekran v rasshirennoj versii DOS: DISAREA DB 20 DUP(' ') ;Oblast' dannyh ... MOV AH,40H ;Zapros na vyvod MOV BX,01 ;Vyvodnoe ustrojstvo MOV CX,20 ;Maksimal'noe chislo bajt LEA DX,DISAREA ;Adres oblasti dannyh INT 21H ;Vyzov DOS Komanda LEA zagruzhaet v registr DX adres DISAREA dlya vozmozhnosti DOS lokalizovat' informaciyu, prednaznachennuyu dlya vyvoda. V rezul'tate uspeshnoj operacii flag perenosa ochishchaet sya (eto mozhno proverit'), a v registre AX ustanavlivaetsya chislo vyvedennyh simvolov. Oshibka v dannoj operacii mozhet proizojti, esli ystanovlen nepravil'nyj fajlovyj nomer. V etom sluchae budet ustanovlen flag CF i kod oshibki (v dannom sluchae 6) v registre AX. Poskol'ku registr AX mozhet soderzhat' ili dlinu, ili kod oshibki, to edinstvennyj sposob opredelit' sostoyanie oshibki - proverit' flag CF. Uprazhnenie: Vyvod na ekran Vospol'zuemsya otladchikom DEBUG dlya proverki vnutrennih effektov preryvaniya. Zagruzite DEBUG i posle vyvoda na ekran priglasheniya vvedite A 100 dlya vvoda assemblernyh komand (ne mashinnyh koman) po adpesu 100. Ne zabud'te, chto DEBUG predpolagaet, chto vse chisla vvodyatsya v shesnadcaterichnom formate. 100 MOV AH,40 102 MOV BX,01 105 MOV CX,hh (vvedite dlinu vashego imeni) 108 MOV DX,10E 10B INT 21 10D RET 10E DB 'Vashe imya' programma ustanavlivaet v registre AH zapros na vyvod i ustanavlivaet shest. znachenie 10F v registre DX - adres DB, soderzhashchej vashe imya v konce programmy. Kogda vy naberete vse komandy, nazhmite eshche raz Return. S pomoshch'yu komandy U (U 100,10D) disassemblirujte programmu dlya proverki. Zatem ispol'zujte komandy R i T dlya trassirov ki vypolneniya. Pri vypolnenii komandy INT 21H otladchik perejdet v BIOS, poetomu pri dostizhenii adresa 10B vvedite komandu GO (G 10D) dlya perehoda k komande RET. Vashe imya budet vyvedeno na ekran. S pomoshch'yu komandy Q vernites' v DOS. VVOD S KLAVIATURY: RASSHIRENNYJ DOS ------------------------------------------------------------ Assembler dlya IBM PC. Glava 8 182 Nizhe privedeny komandy, illyustriruyushchie ispol'zovanie funkcii vvoda s klaviatury v rasshirennoj versii DOS: INAREA DB 20 DUP (' ') ;Oblast' vvoda MOV AH,3FH ;Zapros na vvod MOV BX,00 ;Nomer dlya klaviatury MOV CX,20 ;Maksimum bajt dlya vvoda LEA DX,INAREA ;Adres oblasti vvoda INT 21H ;Vyzov DOS Komanda LEA zagruzhaet otnositel'nyj adres INAREA v registr DX. Komanda INT ozhidaet, poka pol'zovatel' ne vvedet cimvoly s klaviatury, no ne proveryaet prevyshaet li chislo vvedennyh simvolov ma