ryj 1 0 0 0 Sinij 0 0 0 1 YArko-sinij 1 0 0 1 Zelenyj 0 0 1 0 YArko-zelenyj 1 0 1 0 Goluboj 0 0 1 1 YArko-goluboj 1 0 1 1 Krasnyj 0 1 0 0 YArko-krasnyj 1 1 0 0 Sirenevyj 0 1 0 1 YArko-sirenevyj 1 1 0 1 Korichnevyj 0 1 1 0 ZHeltyj 1 1 1 0 Belyj 0 1 1 0 YArko-belyj 1 1 1 1 Takim obrazom lyubye simvoly mogut byt' otobrazheny na ekrane v odnom iz 16 cvetov. Fon lyubogo simvola mozhet imet' odin iz pervyh vos'mi cvetov. Esli fon i tekst imeyut odin i tot zhe cvet, to tekst poluchaetsya nevidimym. Ispol'zuya bajt atributa, mozhno poluchit' takzhe migayushchie simvoly. Bajt-atribut Tekstovoj rezhim dopuskaet ispol'zovanie bajta atributa, rassmotpennogo v glave 9. V privedennoj nizhe tablice, atribut BL oboznachaet miganie (BLinking), RGB - sootvetstven no krasnyj, zelenyj i sinij cvet, I - vydelenie yarkost'yu: Fon Tekst Assembler dlya IBM PC. Glava 10 230 Atribut: BL R G B I R G B Nomera bitov: 7 6 5 4 3 2 1 0 Miganie i vydelenie yarkost'yu otnositsya k tekstu. Nizhe privedeny nekotorye tipichnye atributy: Tekst po fonu Bit: 7 6 5 4 3 2 1 0 BL R G B I R G B SHest. CHernyj po chernomu 0 0 0 0 0 0 0 0 00 Sinij po chernomu 0 0 0 0 0 0 0 1 01 Krasnyj po sinemu 0 0 0 1 0 1 0 0 14 Goluboj po zelenomu 0 0 1 0 0 0 1 1 23 Svetlo-sirenevyj po belomu 0 1 1 1 1 1 0 1 7D Seryj po zelenomu, miganie 1 0 1 0 1 0 0 0 A8 Bajt-atribut ispol'zuetsya analagichno pokazannomu dlya cherno-belogo (BW) monitora. Tip monitora mozhno opredelit' iz programmy s pomoshch'yu komandy INT 11H. Dlya BW monitora kod 07 ustanavlivaet normal'nyj atribut. Dlya cvetnyh monitorov mozh no ispol'zovat' lyubuyu iz cvetovyh kombinacij. Cvet na ekrane sohranyaetsya do teh por, poka drugaya komanda ne izmenit ego. Dlya ustanovki cveta mozhno ispol'zovat' v komande INT 10H funkcii AH=06, AH=07 i AH=09. Naprimer, dlya vyvoda pyati migayushchih zvezdochek setlo-zelenym cvetom na sirenevom fone vozmozhna sleduyushchaya programma: MOV AH,09 ;Funkciya vyvoda na ekran MOV AL,'*' ;Vyvodimyj simvol MOV BH,00 ;Stranica 0 MOV BL,0DAH ;Atribut cveta MOV CX,05 ;CHislo povtorenij INT 10H ;Vyzvat' BIOS GRAFICHESKIJ REZHIM ------------------------------------------------------------ Dlya generacii cvetnyh izobrazhenij v graficheskom rezhime ispol'zuyutsya minimal'nye tochki rastra - pikseli ili pely (pixel). Cvetnoj graficheskij adapter (CGA) imeet tri stepeni razresheniya: 1. Nizkoe razreshenie (ne podderzhivaetsya v ROM) obespechiva et vyvod 100 strok po 160 tochek (t.e. chetyre bita na tochku). Kazhdaya tochka mozhet imet' odin iz 16 standartnyh cvetov, kak opisano v predydushchem razdele "Cveta". Realizaciya dannogo rezhima vklyuchaet pryamuyu adresaciyu kontrolera Motorola 6845 CRT. Dlya etogo ispol'zuyutsya dva porta: shest.3D4 i 3D5. 2. Srednee razreshenie dlya standartnoj cvetnoj grafiki obespechivaet 200 strok po 320 tochek. Kazhdyj bajt v etom sluchae predstavlyaet chetyre tochki (t.e. dva bita na tochku). Assembler dlya IBM PC. Glava 10 231 3. Vysokoe razreshenie obespechivaet 200 strok po 640 tochek. Poskol'ku v dannom sluchae trebuetsya 16K bajt pamyati, vysokoe razreshenie dostigaetsya tol'ko v cherno-belom (BW) rezhime. Kazhdyj bajt zdes' predstavlyaet 8 tochek (t.e. odin bit na tochku). Nulevoe znachenie bita daet chernyj cvet tochki, edinichnoe - belyj. Zametim, chto v graficheskom rezhime ROM soderzhit tochechnye obrazy tol'ko dlya pervyh 128 ASCII-kodov. Komanda INT 1FH obespechivaet dostup k 1K bajtovoj oblasti v pamyati, opredelyayushchej ostal'nye 128 simvolov. (8 bajt na simvol). Otobrazhenie graficheskih bajtov v video signaly analogichno, kak dlya srednego, tak i dlya vysokogo pazresheniya. REZHIM SREDNEGO RAZRESHENIYA ------------------------------------------------------------ Pri srednem razreshenii kazhdyj bajt predstavlyaet chetyre tochki, pronumerovannyh ot 0 do 3: Bajt: |C1 C0|C1 C0|C1 C0|C1 C0| Pikseli: 0 1 2 3 V lyuboj moment dlya kazhdoj tochki vozmozhny chetyre cveta, ot 0 do 3. Ogranichenie v 4 cveta ob®yasnyaetsya tem, chto dvuhbitovaya tochka imeet 4 kombinacii znachenij bitov: 00, 01, 10 i 11. Mozhno vybpat' znachenie 00 dlya lyubogo iz 16 vozmozhnyh cvetov fona ili vybrat' znachenie 01, 10, i 11 dlya odnoj iz dvuh palitr. Kazhdaya palitpa imeet tri cveta: C1 C0 Palitra 0 Palitra 1 0 0 fon fon 0 1 zelenyj goluboj 1 0 krasnyj sirenevyj 1 1 korichnevyj belyj Dlya vybora cveta palitry i fona ispol'zuetsya INT 10H. Takim obpazom, esli, naprimer, vybran fon zheltogo cveta i palitra 0, to vozmozhny sleduyushchie cveta tochki: zheltyj, zelenyj, krasnyj i korichnevyj. Bajt, soderzhashchij znachenie 10101010, sootvetstvuet krasnym tochkam. Esli vybrat' cvet fona - sinij i palitru 1, to vozmozhnye cveta: sinij, goluboj, sirenevyj i belyj. Bajt, soderzhashchij znachenie 00011011, otobrazhaet sinyuyu, golubuyu, sirenevuyu i beluyu tochki. Preryvanie BIOS INT 10H dlya grafiki Assembler dlya IBM PC. Glava 10 232 Funkciya AH=00 komandy INT 10H ustanavlivaet graficheskij rkfim. Funkciya AH=11 komandy INT 10H pozvolyaet vybrat' cvet palitry i vyvesti na ekran graficheskij simvol. Kod v regist re AH opredelyaet funkciyu: AH=00: Ustanovka rezhima. Nulevoe znachenie v registre AH i 04 v pegistre AL ustanavlivayut standartyj cvetnoj grafiches kij rezhim: MOV AH,00 ;Funkciya ustanovki rezhima MOV AL,04 ;Razreshenie 320h200 INT 10H Ustanovka graficheskogo rezhima privodit k ischeznoveniyu kursora s ekrana. Podrobnosti po ustanovke rezhima privedeny v glave 9. AH=0BH: Ustanovka cvetovoj palitry. CHislo v registre BH opredelyaet naznachenie registra BL: BH=00 vybiraet cveta fona i bordyura v sootvetstvii s soderzhimym pegistra BL. Cvet fona ot 1 do 16 sootvetstvuet shest. znacheniyam ot 0 do F; BH=01 vybiraet palitru sootvetstvenno soderzhimomu regist ra BL (0 ili 1): MOV AH,0BH ;Funkciya ustanovki cveta MOV BH,01 ;Vybor palitry MOV BL,00 ; 0 (zelenyj, krasnyj, korich.) INT 10H ;Vyzvat' BIOS Palitra, ustanovlennaya odin raz, sohranyaetsya, poka ne budet otmenena drugoj komandoj. Pri smene palitry ves' ekran menyaet cvetovuyu kombinaciyu. Pri ispol'zovanii funkcii AH=0BH v tekstovom rezhime, znachenie, ustanovlennoe dlya cveta 0 v palitre, opredelyaet cvet bordyura. AH=0CH: Vyvod tochki na ekran. Ispol'zovanie koda 0C v registre AH pozvolyaet vyvesti na ekran tochku v vybrannom cvete (fon i palitra). Naprimer, dlya razresheniya 320h200 zagruzim v registr DX vertikal'nuyu koordinatu (ot 0 do 199), a v registr CX - gorizontal'nuyu koordinatu (ot 0 do 319). V registr AL pomestim cvet tochki (ot 0 do 3): MOV AH,0CH ;Funkciya vyvoda tochki MOV AL,cvet ;Cvet tochki MOV CX,stolbec ;Gorizontal'naya koordinata MOV DX,stroka ;Vertikal'kaya koordinata INT 10H ;Vyzvat' BIOS AH=0DH: CHtenie tochki s ekrana. Dannaya funkciya pozvolyaet prochitat' tochku dlya opredeleniya ee cveta. V registr DX dolzhna byt' zagruzhena vertikal'naya koordinata (ot 0 do 199), Assembler dlya IBM PC. Glava 10 233 a v registr CX - gorizontal'naya (ot 0 do 319). V registre AH dolzhno byt' znachenie 0D. Funkciya vozvrashchaet cvet tochki v registre AL. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 10.1 Vyvod na ekran v cvetnom graficheskom rezhime. PROGRAMMA: USTANOVKA GRAFICHESKOGO REZHIMA I OTOBRAZHENIE CVETA ------------------------------------------------------------ Programma, privedennaya na ris.10.1, ispol'zuet komandu INT 10H dlya ustanovki graficheskogo rezhima, vybora zelenogo fona i vyvoda na ekran tochek (40 strok po 320 stolbcov). V programme proishodit uvelichenie znacheniya cveta na 1 dlya kazhdoj stroki. Tak kak v opredelenii cveta uchastvuyut tol'ko tri pravyh bita, cveta povtoryayutsya cherez kazhdye sem' strok. Posle vypolneniya programmy displej ostaetsya v graficheskom rezhime. Vosstanovlenie tekstovogo rezhima vozmozhno s pomoshch'yu komandy DOS MODE (MODE CO80) ili pol'zovatel'skoj COM programmoj, v kotoroj dlya etoj celi ispol'zuetsya komanda INT 10H. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® Pamyat' ob®emom 16K dlya cvetnogo displeya pozvolyaet hranit' dopolnitel'nye stranicy (ekrany). Vozmozhny chetyre stranicy dlya ekranov na 80 stolbcov ili vosem' stranic dlya ekranov na 40 stolbcov. ® Graficheskij rezhim obespechivaet nizkoe razreshenie (ne podderzhivaetsya v ROM), srednee razreshenie (dlya cvetnoj grafiki) i vysokoe razreshenie (dlya cherno-beloj grafi ki). ® Tochka rastra (minimal'nyj element graficheskogo izobrazheniya) predstavlyaetsya opredelennym chislom bit v zavisimosti ot graficheskogo adaptera i razreshayushchej sposobnosti (nizkoj, srednej ili vysokoj). ® Dlya grafiki srednego razresheniya na cvetnom graficheskom adaptere (CGA) mozhno vybrat' chetyre cveta, odin iz kotoryh prinadlezhit k 16 vozmozhnym cvetam, a tri drugih formiruyut cvetovuyu palitru. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 10.1. Skol'ko cvetov vozmozhno dlya fona i dlya teksta na standartnom cvetnom adaptere (CGA) v tekstovom rezhime? Assembler dlya IBM PC. Glava 10 234 10.2. Napishite bajty atributy v dvoichnom formate dlya a) sirenevogo na yarko-golubom, b) korichnevogo na zheltom, v)krasnogo na serom s miganiem. 10.3. Ob®yasnite raznicu v kolichestve cvetov, vozmozhnyh pri nizkom, srednem i vysokom razreshenii. 10.4. Napishite komandy dlya vyvoda pyati simvolov kartochnoj masti "bubny" v tekstovom rezhime yarko-zelenym cvetom na sirenevom fone. 10.5. Napishite komandy dlya ustanovki graficheskogo rezhima s razresheniem a) 320h200 v adaptere CGA i b) 640h200 v adaptere EGA. 10.6. Napishite komandy dlya ustanovki sinego fona v grafiches kom rezhime. 10.7. Napishite komandy dlya chteniya tochki na 12 stroke i 13 stolbce v graficheskom rezhime. 10.8. Modificirujte programmu na ris.10.1 dlya: a) grafichesko go rezhima na vashem monitore; b) krasnogo fona; v) strok s 10 po 30; g) stolbcov s 20 po 300. Assembler dlya IBM PC. Glava 11 241 GLAVA 11. Komandy obrabotki strok ------------------------------------------------------------ Komandy obrabotki strok Cel': Oob®yasnit' naznachenie special'nyh cepochechnyh komand, ispol'zuemyh dlya obrabotki simvol'nyh dannyh. VVEDENIE ------------------------------------------------------------ Komandy, pokazannye v predydushchih glavah, operirovali odnim bajtom, ili odnim slovom za odno vypolnenie. CHasto, odnako, byvaet neobhodimo pereslat' ili sravnit' polya dannyh, kotorye prevyshayut po dline odno slovo. Naprimer, neobhodimo sravnit' opisaniya ili imena dlya togo, chtoby otsortirovat' ih v voshodyashchej posledovatel'nosti. |lementy takogo formata izvestny kak strokovye dannye i mogut yavlyatsya kak simvol'nymi, tak i chislovymi. Dlya obrabotki strokovyh dannyh assembler imeet pyat' komand obrabotki strok: MOVS pereslat' odin bajt ili odno slovo iz odnoj oblasti pamyati v druguyu; LODS zagruzit' iz pamyati odin bajt v registr AL ili odno slovo v registr AX; STOS zapisat' soderzhimoe registra AL ili AX v pamyat'; CMPS sravnit' soderzhimoe dvuh oblastej pamyati, razmerom v odin bajt ili v odno slovo; SCAS sravnit' soderzhimoe registra AL ili AX s soderzhimym pamyati. Prefiks REP pozvolyaet etim komandam obrabatyvat' stroki lyuboj dliny. SVOJSTVA OPERACIJ NAD STROKAMI ------------------------------------------------------------ Cepochechnaya komanda mozhet byt' zakodirovana dlya povtoryayu shchejsya obpabotki odnogo bajta ili odnogo slova za odno vypolnenie. Naprimer, mozhno vybrat' "bajtovuyu" komandu dlya obrabotki stroki s nechetnym chislom bajt ili "dvuhbajtovuyu" komandu dlya obrabotki chetnogo chisla bajt. Nizhe perechisleny registry, uchastvuyushchie v cepochechnyh komandah (dlya odnobajtovyh i dvuhbajtovyh variantov). Predpolozhim, chto registry DI i SI soderzhat neobhodimye adresa: Komanda Operandy Bajt Slovo MOVS DI,SI MOVSB MOVSW LODS AL,SI ili AX,SI LODSB LODSW Assembler dlya IBM PC. Glava 11 242 STOS DI,AL ili DI,AX STOSB STOSW CMPS SI,DI CMPSB CMPSW SCAS DI,AL ili DI,AX SCASB SCASW Naprimer, mozhno kodirovat' operandy dlya komandy MOVS, no opustit' ih dlya MOVSB i MOVSW. |ti komandy predpolagayut, chto pegistry DI i SI soderzhat otnositel'nye adresa, ukazyvayushchie na neobhodimye oblasti pamyati (dlya zagruzki mozhno ispol'zo vat' komandu LEA). Registr SI obychno svyazan s registrom segmenta dannyh - DS:SI. Registr DI vsegda svyazan s registrom dopolnitel'nogo segmenta - ES:DI. Sledovatel'no, komandy MOVS, STOS, CMPS i SCAS trebuyut inicializacii registra ES (obychno adresom v registre DS). REP: PREFIKS POVTORENIYA CEPOCHECHNOJ KOMANDY ------------------------------------------------------------ Nesmotrya na to, chto cepochechnye komandy imeyut otnoshenie k odnomu bajtu ili odnomu slovu, prefiks REP obespechivaet povtorenie komandy neskol'ko raz. Prefiks kodiruetsya nepo sredstvenno pered cepochechnoj komandoj, naprimer, REP MOVSB. Dlya ispol'zovaniya prefiksa REP neobhodimo ustanovit' nachal'noe znachenie v registre CX. Pri vypolnenii cepochechnoj komandy s prefiksom REP proishodit umen'shenie na 1 znacheniya v registre CX do nulya. Takim obrazom, mozhno obrabatyvat' stroki lyuboj dliny. Flag napravleniya opredelyaet napravlenie povtoryayushchejsya operacii: - dlya napravleniya sleva napravo neohodimo s pomoshch'yu komandy CLD ustanovit' flag DF v 0; - dlya napravleniya sprava nalevo neobhodimo s pomoshch'yu komandy STD ustanovit' flag DF v 1. V sleduyushchem primere vypolnyaetsya peresylka 20 bajt iz STRING1 v STRING2. Predpolozhim, chto oba registra DS i ES inicializirovany adresom segmenta dannyh: STRING1 DB 20 DUP('*') STRING2 DB 20 DUP(' ') ... CLD ;Sbros flaga DF MOV CX,20 ;Schetchik na 20 bajt LEA DI,STRING2 ;Adres oblasti "kuda" LEA SI,STRING1 ;Adres odlasti "otkuda" REP MOVSB ;Pereslat' dannye Pri vypolneeii komand CMPS i SCAS vozmozhna ustanovka flagov sostoyaniya, tak chtoby operaciya mogla prekratit'sya srazu posle obnaruzheniya neobhodimogo usloviya. Nizhe privedeny modifikacii prefiksa REP dlya etih celej. REP - povtoryat' operaciyu, poka CX ne ravno 0; Assembler dlya IBM PC. Glava 11 243 REPZili REPE - povtoryat' operaciyu,poka flag ZF pokazyvaet "ravnoili nol'".Prekratit' operaciyu pri flage ZF, ukazyvayushchemu na ne ravno ili ne nol' ili pri CX ravnom 0; REPNE ili REPNZ - povtoryat' operaciyu, poka flag ZF pokazyvaet "ne ravno ili ne nol'". Prekratit' operaciyu pri flage ZF, ukazyvayushchemu na "ravno ili nul'" ili pri CX ravnym 0. Dlya processorov 8086, 80286 i 80386, obrabatyvayushchih slovo za odno vypolnenie, ispol'zovanie cepochechnyh komand, gde eto vozmozhno, privodit k povysheniyu effektivnosti raboty programmy. MOVS: PERESYLKA STROK ------------------------------------------------------------ Na ris.7.5 byla pokazana programma dlya peresylki devyati bajtovogo polya. Programma vklyuchala tri komandy dlya iniciali zacii i pyat' komand dlya cikla. Komanda MOVS s prefiksom REP i dlinoj v registre CX mozhet vypolnyat' peresylku lyubogo chisla simvolov bolee effektivno. Dlya oblasti, prinimayushchej stroku, segmentnym registrom, yavlyaetsya pegistr ES, a registr DI soderzhit otnositel'nyj adres oblasti, peredayushchej stroku. Segmentnym registrom yavlyaetsya registr DS, a registr SI soderzhit otnositel'nyj adres. Takim obrazom,v nachale programmy pered vypolneniem komandy MOVS neobhodimo inicializirovat' registr ES vmeste s registrom DS, a takzhe zagruzit' trebuemye otnositel'nye adresa polej v registry DI i SI. V zavisimosti ot sostoyaniya flaga DF komanda MOVS proizvodit uvelichenie ili umen'shenie na 1 (dlya bajta) ili na 2 (dlya slova) soderzhimogo registrov DI i SI. Privedem komandy, ekvivalentnye cepochechnoj komande REP MOVSB: JCXZ LABEL2 LABEL1: MOV AL,[SI] MOV [DI],AL INC/DEC DI ;Inkrement ili dekrement UNC/DEC SI ;Inkrement ili dekrement LOOP LABEL1 LABEL2: ... V programme na ris. 11.1 procedura C10MVSB ispol'zuet komandu MOVSB dlya peresylki soderzhimogo desyatibajtovogo polya NAME1 v pole NAME2. Pervaya komanda CLD sbrasyvaet flag napravleniya v 0 dlya obespecheniya processa peresylki sleva napravo. V normal'nom sostoyanii flag DF obychno imeet nulevoe znachenie i komanda CLD ispol'zuetsya iz predostorozhnosti. Assembler dlya IBM PC. Glava 11 244 Dve komandy LEA zagruzhayut registry SI i DI otnositel'nymi adresami NAME1 i NAME2 sootvetstvenno. Tak kak registry DS i ES byli ranee inicializirovany adresom DATASG, to polnye adresa polej NAME1 i NAME2 budut v registrah ES:DI i DS:SI. (COM programma avtomaticheski inicializiruet registry ES i DS). Komanda MOV zanosit v registr CX znachenie 10 - dlinu polej NAME1 i NAME2. Komanda REP MOVSB vypolnyaet sleduyushchee: ® Peresylaet samyj levyj bajt iz polya NAME1 (adresovanno go pegistrami ES:DI) v samyj levyj bajt polya NAME2 (adresovannogo registrami DS:SI). ® Uvelichivaet na 1 adresa v registrah DI i SI dlya sleduyushchego bajta. ® Umen'shaet CX na 1. ® Povtoryaet perechislennye dejstviya (v dannom sluchae 10 raz), poka soderzhimoe registra CX ne stanet ravnym nulyu. Poskol'ku flag DF imeet nulevoe znachenie, komanda MOVSB uvelichivaet adresa v registrah DI i SI, i v kazhdoj iteracii process perehodit na bajt vpravo, t.e. peresylaet bajt iz NAME1+1 v NAME2+1 i t.d. Esli by flag DF byl raven 1, togda komanda MOVSB umen'shala by adresa v registrih DI i SI, vypolnyaya process sprava nalevo. No v etom sluchae registry SI i DI neobhodimo inicializirovat' adresami poslednih bajtov polej, t.e. NAME1+9 i NAME2+9 sootvetstvenno. V procedure D10MVSW (ris.11.1) ispol'zuetsya komanda MOVSW, peresylayushchaya odno slovo za odno vypolnenie. Tak kak komanda MOVSW uvelichivaet adresa v registrah DS i SI na 2, operaciya trebuet tol'ko pyat' ciklov. Dlya processa peresylki sprava nalevo registr SI dolzhen byt' inicializirovan adresom NAME1+8, a registr DI - NAME2+8. LODS: ZAGRUZKA STROKI ------------------------------------------------------------ Komanda LODS zagruzhaet iz pamyati v registr AL odin bajt ili v registr AX odno slovo. Adres pamyati opredelyaetsya registrami DS:SI. V zavisimosti ot znacheniya flaga DF proishodit uvelichenie ili umen'shenie registra SI. Poskol'ku odna komanda LODS zagruzhaet registr, to prakti cheskoj pol'zy ot prefiksa REP v dannom sluchae net. CHasto prostaya komanda MOV polnost'yu adekvatna komande LODS, hotya MOV generiruet tri bajta mashinnogo koda, a LODS - tol'ko odin, no trebuet inicializaciyu registra SI. Mozhno ispol'zo vat' komandu LODS v tom sluchae, kogda trebuetsya prodvigat'sya vdol' stroki (po bajtu ili po slovu), proveryaya zagruzhaemyj registr na konkretnoe znachenie. Komandy, ekvivalentnye komande LODSB: MOV AL,[SI] INC SI Assembler dlya IBM PC. Glava 11 245 Na ris.11.1 procedura E10LODS demonstriruet ispol'zovanie komandy LODSW. V primere obrabatyvaetsya tol'ko odno slovo: pervyj bajt iz oblasti NAME1 (soderzhashchij As) zanositsya v registr AL, a vtoroj bajt - v registr AH. V rezul'tate v registre AX poluchitsya znachenie sA. STOS: ZAPISX STROKI ------------------------------------------------------------ Komanda STOS zapisyvaet (sohranyaet) soderzhimoe registra AL ili AX v bajte ili v slove pamyati. Adres pamyati vsegda predstavlyaetsya registrami ES:DI. V zavisimosti ot flaga DF komanda STOS takzhe uvelichivaet ili umen'shaet adres v registre DI na 1 dlya bajta ili na 2 dlya slova. Prakticheskaya pol'za komandy STOS s prefiksom REP - inicializaciya oblasti dannyh konkretnym znacheniem, naprimer, ochistka displejnogo bufera probelami. Dlina oblasti (v bajtah ili v clovah) zagruzhaetsya v registr AX. Komandy, ekvivalentnye komande REP STOSB: JCXZ LABEL2 LABEL1: MOV [DI],AL INC/DEC DI ;Inkrement ili dekrement LOOP LABEL1 LABEL2: ... Na ris.11.1 procedura F10STOS demonstriruet ispol'zovanie komandy STOSW. Operaciya osushchestvlyaet zapis' shest. 2020 (probely) pyat' raz v oblast' NAME3, prichem znachenie iz registra AL zanositsya v pervyj bajt, a iz registra AH - vo vtoroj. Po zavershenii komandy registr DI soderzhit adres NAME3+10. CMPS: SRAVNENIE STROK ------------------------------------------------------------ Komanda CMPS sravnivaet soderzhimoe odnoj oblasti pamyati (adresuemoj registrami DS:SI) s soderzhimymi drugoj oblasti (adresuemoj kak ES:DI). V zavisimosti ot flaga DF komanda CMPS takzhe uvelichivaet ili umen'shaet adresa v registrah SI i DI na 1 dlya bajta ili na 2 dlya slova. Komanda CMPS ustanavlivaet flagi AF, CF, OF, PF, SF i ZF. Pri ispol'zovanii prefiksa REP v registre CX dolzhna nahodit'sya dlina sravnivaemyh polej. Komanda CMPS mozhet sravnivat' lyuboe chislo bajt ili slov. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 11.1. Ispol'zovanie cepochechnyh komand. Rassmotrim process sravneniya dvuh strok, soderzhashchih imena JEAN i JOAN. Sravnenie pobajtno sleva napravo privodit k sleduyushchemu: Assembler dlya IBM PC. Glava 11 246 J : J Ravno E : O Ne ravno (E men'she O) A : A Ravno N : N Ravno Sravnenie vseh chetyreh bajt zakanchivaetsya sravneniem N:N - pavno/nul'. Tak kak imena "ne ravny", operaciya dolzhna pre kratit'sya, kak tol'ko budet obnaruzheno uslovie "ne ravno". Dlya etih celej komanda REP imeet modifikaciyu REPE, kotoraya povtoryaet sravnenie do teh por, poka sravnivaemye elementy ravny, ili registr CX ne paven nulyu. Kodiruetsya povtoryayushchee sya odnobajtovoe sravnenie sleduyushchim obrazom: REPE CMPSB Na ris.11.1 v procedere G10CMPS imeyutsya dva primera ispol'zovaniya komandy CMPSB. V pervom primere proishodit sravnenie soderzhimogo polej NAME1 i NAME2. Tak kak ranee komanda MOVSB pereslala soderzhimoe polya NAME1 v pole NAME2, to komanda CMPSB prodolzhaetsya na vseh desyati bajtah i zavershaetsya sostoyaniem pavno/nul': flag SF poluchaet znachenie 0 (polozhitel'no) i flag ZF - 1(nul'). Vo vtorom primere sravnivaetsya polya NAME2 i NAME3. Ranee komanda STOSW zapolnila pole NAME3 probelami, poetomu komanda CMPB zavershaetsya posle sravneniya pervyh zhe bajt s rezul'tatom "bol'she/neravno": flag SF poluchaet znachenie 0 (polozhitel'no) i flag ZF - 0 (nenul'). Pervyj primer zakanchivaetsya s rezul'tatom "ravno/nul'" i zanosit 01 v registr BH. Vtoroj primer zakanchivaetsya s rezul'tatom "neravno" i zanosit 02 v registr BL. Pri trassirovke komand s pomoshch'yu otladchika DEBUG mozhno uvidet', chto v konce procedury G10CMPS registr BX budet soderzhat' znachenie 0102. Preduprezhdenie! Pokazannye primery ispol'zuyut komandu CMPSB dlya sravneniya odnogo bajta za odno vypolnenie. Pri ispol'zovanii komandy CMPSW dlya sravneniya odnogo slova, neobhodimo inicializipovat' registr CX znacheniem 5. Krome togo sleduet pomnit', chto komanda CMPSW pri sravnenii slov perestavlyaet bajty. Naprimer, sravnivaya imena SAMUEL i ARNOLD komanda CMPSW vybiraet vmesto SA i AR perestavlennye znacheniya, t.e. AS i RA. V rezul'tate vmesto "bol'she" poluchitsya "men'she", t.e. nepravel'nyj rezul'tat. Takim obrazom komanda CMPSW rabotaet pravil'no tol'ko pri sravne nii strok, kotorye soderzhat chislovye dannye, opredelennye kak DW, DD ili DQ. SCAS: SKANIROVANIE STROK ------------------------------------------------------------ Komanda SCAS otlichaetsya ot komandy CMPS tem, chto skaniruet (prosmatrivaet) stroku na opredelennoe znachenie bajta ili slova. Komanda SCAS sravnivaet soderzhimoe oblasti Assembler dlya IBM PC. Glava 11 247 pamyati (adresuemoj pegistrami ES:DI) s soderzhimym registra AL ili AX. V zavisimosti ot znacheniya flaga DF komanda SCAS takzhe uvelichivaet ili umen'shaet adres v registre DI na 1 dlya bajta ili na 2 dlya slova. Komanda SCAS ustanavlivaet flagi AF, CF, OF, PF, SF i ZF. Pri ispol'zovanii prefiksa REP i znacheniya dliny v registre CX komanda SCAS mozhet skanirovat' stroki lyuboj dliny. Komanda SCAS osobenno polezna, naprimer, v tekstovyh redaktorah, gde programma dolzhna skanirovat' stroki, vypolnyaya poisk znakov punktuacii: tochek, zapyatyh i probelov. Na ris.11.1 procedura H10SCAS skaniruet oblast' NAME1 na strochnuyu bukvu "m". Tak kak komanda SCASB dolzhna prodolzhat' skanirovanie, poka rezul'tat sravneniya - "ne ravno" ili registr CX ne raven nulyu, to ispol'zuetsya prefiks REPNE: REPNE SCASB Tak kak oblast' NAME1 soderzhit slovo "Assemblers", to komanda SCASB nahodit simvol "m" v pyatom sravnenii. Pri ispol'zovanii otladchika DEBUG dlya trassirovki komand v konce procedury H10SCAS mozhno uvidet' v registre AH znachenie 03 dlya indikacii togo, chto simvol "m" najden. Komanda REP SCASB krome togo umen'shit znachenie registra CX ot 10 do 06. Komanda SCASW skaniruet v pamyati slovo na sootvetstvie znacheniyu v registre AX. Pri ispol'zovanii komand LODSW ili MOV dlya peresylki slova v registr AX, sleduet pomnit', chto pervyj bajt budet v registre AL, a vtoroj bajt - v registre AH. Tak kak komanda SCAS sravnivaet bajty v obratnoj posledovatel'nosti, to operaciya korrektna. SKANIROVANIE I ZAMENA ------------------------------------------------------------ V processe obrabotki tekstovoj informacii mozhet vozniknut' neobhodimost' zameny opredelennyh simvolov v tekste na drugie, naprimer, podstanovka probelov vmesto razlichnyh redaktiruyushchih simvolov. V privedennom nizhe fragmente programmy osushchestvlyaetsya skanirovanie ctroki STRING i zamena simvola ampersand (&) na simvol probela. Kogda komanda SCASB obnaruzhit simvol & (v primere eto budet poziciya STRING+8), to operaciya skanirovaniya prekratit sya i registr DI budet soderzhat' adres STRING+9. Dlya poluche niya adresa simvola & neobhodimo umen'shit' soderzhimoe DI na edinicu i zapisat' po poluchennomu adresu simvol probela. STRLEN EQU 15 ;Dlina polya STRING STRING DB 'The time&is now' ... CLD MOV AL,'&' ;Iskomyj simvol MOV CX,STRLEN ;Dlina polya STRING LEA DI,STRING ;Adres polya STRING REPNE SCASB ;Skanirovat' Assembler dlya IBM PC. Glava 11 248 JNZ K20 ;Simvol najden? DEC DI ;Da - umen'shit' adres MOV BYTE PTR[DI],20H ;Podstavit' probel K20: RET ALXTERNATIVNOE KODIROVANIE ------------------------------------------------------------ Pri ispol'zovanii komand MOVSB ili MOVSW assembler predpolagaet nalichie korrektnoj dliny strokovyh dannyh i ne trebuet kodirovaniya operandov v komande. Dlya komandy MOVS dlina dolzhna byt' zakodirovana v operandah . Naprimer, esli polya FLDA i FLDB opredeleny kak bajtovye (DB), to komanda REP MOVS FLDA,FLDB predpolagaet povtoryayushchuyusya peresylku bajtov iz polya FLDB v pole FLDA. |tu komandu mozhno zapisat' takzhe v sleduyushchem vide: REP MOVS ES:BYTE PTR[DI],DS:[SI] Odnako zagruzka registrov DI i SI adresami FLDA i FLDB obyazatel'na v lyubom sluchae. DUBLIROVANIE OBRAZCA ------------------------------------------------------------ Komanda STOS byvaet polezna dlya ustanovki v nekotoroj oblasti opredelennyh znachenij bajtov i slov. Dlya dublirova niya obrazca, dlina kotorogo prevyshaet razmer slova, mozhno ispol'zovat' komandu MOVS s nebol'shoj modifikaciej. Predpolozhim, chto neobhodimo sformirovat' stroku sleduyushchego vida: ***---***---***---***---***--- . . . Vmesto togo, chtoby opredelyat' polnost'yu vsyu stroku, mozhno opredelit' tol'ko pervye shest' bajtov. Zakodiruem obrazec neposredstvenno pered obrabatyvaemoj strokoj sleduyushchim obrazom: PATTERN DB '***---' DISAREA DB 42 DUP(?) . . CLD MOV CX,21 LEA DI,DISAREA LEA SI,PATTERN REP MOVSW V processe vypolneniya komanda MOVSW snachala peresylaet pervoe slovo (**) iz obrazca PATTERN v pervoe slovo oblasti DISAREA, zatem - vtoroe slovo (*-), potom tret'e (--): Assembler dlya IBM PC. Glava 11 249 ***---***--- | | PATTERN DISAREA K etomu momentu registr DI budet soderzhat' adres DISAREA+6, a pegistr SI - PATTERN+6, kotoryj takzhe yavlyaetsya adresom DISAREA. Zatem komanda MOVSW avtomaticheski dubliruet obrazec, peresylaya pervoe slovo iz DISAREA v DISAREA+6, iz DISAREA+2, v DISAREA+8, iz DISAREA+4 v DISAREA+10 i t.d. V rezul'tate obrazec budet polnost'yu produblirovan po vsej oblasti DISAREA: ***---***---***---***---***--- . . . ***--- | | | | PATTERN DISAREA+6 DISAREA+12 DISAREA+42 Dannuyu tehniku mozhno ispol'zovat' dlya dublirovaniya v oblasti pamyati lyubogo obrazca lyuboj dliny. Obrazec dolzhen byt' raspolozhen neposredstvenno pered prinimayushchej oblast'yu. PROGRAMMA: VYRAVNIVANIE VPRAVO PRI VYVODE NA |KRAN ------------------------------------------------------------ COM-programma, izobrazhennaya na ris.1.2, illyustriruet pochti ves' material, privedennyj v etoj glave. Procedury programmy vypolnyayut sleduyushchie dejstviya: B10INPT Prinimaet imena dlinoj do 30 simvolov, vvodimyh vverhu ekrana. D10SCAS Ispol'zuet komandu SCASB dlya skanirovaniya imen i ob hoda lyubogo vvoda, soderzhashchego simvol "zvezdochka". E10RGHT Ispol'zuet komandu MOVSB dlya vyravnivaniya imen po pravoj granice, vyvodit imena v kolonku v pravoj chasti ekrana. Dlina v pole ACTNLEN iz spiska parametrov vvoda ispol'zuetsya dlya vychisleniya samogo pravogo simvola v imeni, naprimer: JEROME KERN OSCAR HAMMERSTEIN RICHARD ROGERS F10CLNM Ispol'zuet komandu STOSW dlya ochistki oblasti imeni v pamyati. ------------------------------------------------------------ ------------------------------------------------------------ Ris.11.2. Vyravnivanie vpravo pri vyvode na ekran. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ Assembler dlya IBM PC. Glava 11 250 ® Dlya cepochechnyh komand MOVS, STOS, CMPS i SCAS ne zaby- vajte inicializirovat' registr ES. ® Sbrasyvajte (CLD) ili ustanavlivajte (STD) flag naprav leniya v sootvetstvii s napravleniem obrabotki. ® Ne zabyvajte ustanavlivat' v registrah DI i SI neobhodi mye znacheniya. Naprimer, komanda MOVS predpolagaet operandy DI,SI, a komanda CMPS - SI,DI. ® Inicializirujte registr CX v sootvetstvii s kolichestvom bajtov ili slov, uchastvuyushchih v processe obrabotki. ® Dlya obychnoj obrabotki ispol'zujte prefiks REP dlya komand MOVS i STOS i modificirovannyj prefiks (REPE ili REPNE) dlya komand CMPS i SCAS. ® Pomnite ob obratnoj posledovatel'nosti bajtov v sravni vaemyh clovah pri vypolnenii komand CMPSW i SCASW. ® Pri obrabotke sprava nalevo ustanavlivajte nachal'nye adresa na poslednij bajt obrabatyvaemoj oblasti. Esli, naprimer, pole NAME1 imeet dlinu 10 bajtov, to dlya pobajtovoj obrabotki dannyh v etoj oblasti sprava nalevo nachal'nyj adres , zagruzhaemyj komandoj LEA, dolzhen byt' NAME1+9. Dlya brabotki slov nachal'nyj adres v etom sluchae - NAME1+8. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 11.1. V dannoj glave privedeny ekvivalentnye komandy dlya a) MOVSB, b) LODSB i v)STOSB s prefiksom REP. Napishite ekvivalentnye komandy dlya obrabotki po slovam a) MOVSW, b) LODSW i v) STOSW s prefiksom REP. 11.2. Vvedite, assemblirujte i vypolnite kompanovku programmy, privedennoj na ris.11.1. Ne zabud'te o inicializacii registra ES. Zamenite komandy MOVSB i MOVSW dlya peresylki sprava nalevo. Izmenite proceduru H10SCAS dlya skanirovaniya polya NAME1 na slovo "mb". Ispol'zuya otladchik DEBUG dlya trassirovki procedur, obratite veimanie na soderzhimoe segmenta dannyh i registrov. 11.3. Imeyutsya sleduyushchie opredeleniya: DATASG SEGMENT PARA CONAME DB 'SPACE EXPLORERS INC.' PRLINE DB 20 DUP(' ') Ispol'zuya cepochechnye komandy, vypolnite: a) peresylku dannyh iz CONAME v PRLINE sleva napravo; Assembler dlya IBM PC. Glava 11 251 b) peresylku dannyh iz CONAME v PRLINE sprava nalevo; v) zagruzku tret'ego i chetvertogo bajtov oblasti CONAME v registr AX; g) sohranenie soderzhimogo registra AX v oblast' po adresu PRLINE+5; d) sravnenie dannyh v oblastyah CONAME i PRLINE (oni dolzhny byt' ne ravny); e) skanirovanie oblastej CONAME i PRLINE, i poisk v nej simvola probel. Esli simvol budet najden, to pereslat' ego v registr BH. 11.4. Peredelajte proceduru H10SCAS (ris.11.1) tak, chtoby vypolnyalos' skanirovanie polya NAME1 na simvol "er". Obratite vnimanie, chto simvoly "er" ne vstrechayutsya v pole NAME1 kak odno slovo: /As/se/mb/le/rs/. Dlya resheniya etoj problemy vozmozhny dva varianta: a) ispol'zovat' komandu SCASW dvazhdy, prichem pervaya dolzhna nachinat'sya po adresu NAME1, a vtoraya - po adresu NAME1+1; b) ispol'zovat' komandu SCASB dlya poiska simvola "e" i sravnit' zatem sleduyushchij bajt na simvol "r". 11.5. Opredelite pole, soderzhashchee shest.znacheniya 03, 04, 05 i B4. Produblirujte eto pole 20 raz i vydajte rezul'tat na ekran. Assembler dlya IBM PC. Glava 12 262 GLAVA 12. Arifmeticheskie operacii I: Obrabotka dvoichnyh dannyh ------------------------------------------------------------ Arifmeticheskie operacii I: Obrabotka dvoichnyh dannyh Cel': Dat' svedeniya ob operaciyah slozheniya, vychitaniya, umnozheniya i deleniya dvoichnyh dannyh. VVEDENIE ------------------------------------------------------------ Nesmotrya na to, chto my privykli k desyatichnoj arifmetike (baza 10), komp'yuter rabotaet tol'ko s dvoichnoj arifmetikoj (baza 2). Krome togo, vvidu ogranicheniya, nakladyvaemogo 16-bitovymi registrami, bol'shie velichiny trebuyut special'noj obrabotki. Dannaya glava daet svedeniya ob operaciyah slozheniya, vychitaniya, umnozheniya i deleniya dlya bezznakovyh i znakovyh dannyh. V glave privodyatsya mnogo primerov i preduprezhdenij o razlichnyh lovushkah dlya oprometchivyh issledovatelej mira mikroprocessora. V sleduyushchej glave budut raskryty operacii preobrazovaniya mezhdu dvoichnymi dannymi i ASCII kodami. SLOZHENIE I VYCHITANIE ------------------------------------------------------------ Komandy ADD i SUB vypolnyayut slozhenie i vychitanie bajtov ili slov, soderzhashchih dvoichnye dannye. Vychitanie vypolnyaetsya v komp'yutere po metodu slozheniya s dvoichnym dopolneniem: dlya vtorogo operanda ustanavlivayutsya obratnye znacheniya bit i pribavlyaetsya 1, a zatem proiCXodit slozhenie s pervym operandom. Vo vsem, krome pervogo shaga, operacii slozheniya i vychitaniya identichny. Na ris. 12.1 predstavlenny primery komand ADD i SUB, obrabatyvayushchie bajty ili slova. V procedure B10ADD ispol'zuetsya komanda ADD dlya slozheniya bajtov, a v procedure C10SUB komanda SUB vychitaet slova. Primery pokazyvayut vse pyat' vozmozhnyh situacij: slozhenie/vychitanie registr-registr; slozhenie/vychitanie pamyat'-registr; slozhenie/vychitanie registr-pamyat'; slozhenie/vychitanie registr-neposr.znachenie; slozhenie/vychitanie pamyat'-neposr.znachenie. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 12.1 Primery komand ADD i SUB. Poskol'ku pryamoj operacii pamyat'-pamyat' ne sushchestvuet, dannaya operaciya vypolnyaetsya cherez registr. V sleduyushchem primere k soderzhimomu slova WORDB pribavlyaetsya soderzhimoe slova WORDA, opisannyh kak DW: Assembler dlya IBM PC. Glava 12 263 MOV AX,WORDA ADD AX,WORDB MOV WORDB,AX Perepolneniya Opasajtes' perepolnenij v arifmeticheskih operaciyah. Odin bajt soderzhit znakovyj bit i sem' bit dannyh, t.e. znacheniya ot -128 do +127. Rezul'tat arifmeticheskoj operacii mozhet legko prevzojti emkost' odnobajtovogo registra. Naprimer, rezul'tat slozheniya v registre AL, prevyshayushchij ego emkost', avtomaticheski ne perehodit v registr AH. Predpolozhim, chto registr AL soderzhit shest.60, togda rezul'tat komandy ADD AL,20H generiruet v AL suummu - shest.80. No operaciya takzhe ustanavlivaet flag perepolneniya i znakovyj flag v sostoyanie "otricatel'no". Prichina zaklyuchaetsya v tom, chto shest.80 ili dvoichnoe 1000 0000 yavlyaetsya otricatel'nym chislom. T.e. v rezul'tate, vmesto +128, my poluchim -128. Tak kak registr AL slishkom mal dlya takoj operacii i sleduet vospol'zovat'sya registrom AX. V sleduyushchem primere komanda CBW (Convert Byte to Word - preobrazovat' bajt v slovo) preobrazuet shest.60 v registre AL v shest.0060 v registre AX, peredavaya pri etom znakovyj bit (0) cherez registr AH. Komanda ADD generiruet teper' v registre AX pravil'nyj rezul'tat: shest.0080, ili +128: CBW ;Rasshirenie AL do AX ADD AX,20H ;Pribavit' k AX No polnoe slovo imeet takzhe ogranichenie: odin znakovyj bit i 15 bit dannyh, chto sootvetstvuet znacheniyam ot -32768 do +32767. Rassmotrim dalee kak mozhno obrabatyvat' chisla, prevyshayushchie eti predely. Mnogoslovnoe slozhenie Maksimal'noe vozmozhnoe znachenie v registre +32767 ograni chivaet vozmozhnost' komp'yutera dlya vypolneniya arifmeticheskih operacij. Rassmotrim dva sposoba vypolneniya arifmeticheskih operacij. Pervyj sposob - bolee prost, no specifichen, vtoroj - slozhnee, no imeet obshchij harakter. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 12.2. Slozhenie dvojnyh slov. Assembler dlya IBM PC. Glava 12 264 Na