ammoj, vypolnyaemoj kak COM-fajl. Razmer programmy. EXE-programma mozhet imet' lyuboj razmer, v to vremya kak COM-fajl ogranichen razmerom odnogo segmenta i ne prevyshaet 64K. COM-fajl vsegda men'she, chem sootvetstvuyu shchij EXE-fajl; odna iz prichin etogo - otsutstvie v COM-fajle 512-bajtovogo nachal'nogo bloka EXE-fajla. Segment steka. V EXE-programme opredelyaetsya segment ste ka, v to vremya kak COM-programma generiruet stek avtomatiches ki. Takim obrazom pri sozdanii assemblernoj programmy, kotoraya budet preobrazovana v COM-fajl, stek dolzhen byt' opushchen. Segment dannyh. V EXE programme obychno opredelyaetsya seg ment dannyh, a registr DS inicializiruetsya adresom etogo segmenta. V COM-programme vse dannye dolzhny byt' opredeleny v segmente koda. Nizhe budet pokazan prostoj sposob resheniya etogo voprosa. Assembler dlya IBM PC. Glava 6 124 Inicializaciya. EXE-programma zapisyvaet nulevoe slovo v stek i inicializiruet registr DS. Tak kak COM-programma ne imeet ni steka, ni segmenta dannyh, to eti shagi otsutstvuyut. Kogda COM-programma nachinaet rabotat', vse segmentnye re gistry soderzhat adres prefiksa programmnogo segmenta (PSP), - 256-bajtovogo (shest. 100) bloka, kotoryj rezerviruetsya operacionnoj sistemoj DOS neposredstvenno pered COM ili EXE programmoj v pamyati. Tak kak adresaciya nachinaetsya s shest. smeshcheniya 100 ot nachala PSP, to v programme posle operatora SEGMENT kodiruetsya direktiva ORG 100H. Obrabotka. Dlya programm v EXE i COM formatah vypolnyaetsya assemblirovanie dlya polucheniya OBJ-fajla, i kompanovka dlya polucheniya EXE-fajla. Esli programma sozdaetsya dlya vypolneniya kak EXE-fajl, to ee uzhe mozhno vypolnit'. Esli zhe programma sozdaetsya dlya vypolneniya kak COM-fajl, to kompanovshchikom budet vydano soobshchenie: Warning: No STACK Segment (Preduprezhdenie: Segment steka ne opredelen) |to soobshchenie mozhno ignorirovat', tak kak opredelenie steka v programme ne predpolagalos'. Dlya preobrazovaniya EXE-fajla v COM-fajl ispol'zuetsya programma EXE2BIN. Predpolozhim, chto EXE2BIN imeetsya na diskovode A, a skompanovannyj fajl po imeni CALC.EXE - na diskovode B. Vvedite EXE2BIN B:CALC,B:CALC.COM Tak kak pervyj operand vsegda predpolagaet EXE fajl, to mozhno ne kodirovat' tip EXE. Vtoroj operand mozhet imet' drugoe imya (ne CALC.COM). Esli ne ukazyvat' tip COM, to EXE2BIN primet po umolchaniyu tip BIN, kotoryj vposledstvii mozhno pereimenovat' v COM. Posle togo kak preobrazovanie budet vypolneno mozhno udalit' OBJ- i EXE-fajly. Esli ishodnaya programma napisana dlya EXE-formata, to mozh no, ispol'zuya redaktor, zamenit' komandy v ishodnom tekste dlya COM fajla. PRIMER COM-PROGRAMMY ------------------------------------------------------------ Programma EXCOM1, privedennaya na ris. 6.1, analogichna programme na ris. 4.3, no izmenena soglasno trebovanij COM- formata. Obratite vnimanie na sleduyushchie izmeneniya v etoj COM-programme: ® Stek i segment dannyh otsutstvuet. ® Operator ASSUME ukazyvaet assembleru ustanovit' otnosi tel'nye adresa s nachala segmenta kodov. Registr CS takzhe soderzhit etot adres, yavlyayushchijsya k tomu zhe adresom prefiksa programmnogo segmenta (PSP). Direktiva ORG sluzhit dlya rezervirovaniya 100 (shest.) bajt ot nachal'no go adresa pod PSP. Assembler dlya IBM PC. Glava 6 125 ® Direktiva ORG 100H ustanavlivaet otnositel'nyj adres dlya nachala vypolneniya programmy. Programmnyj zagruzchik ispol'zuet etot adres dlya komandnogo ukazatelya. ® Komanda JMP ispol'zuetsya dlya obhoda dannyh, opredelen nyh v programme. Nizhe pokazany shagi dlya obrabotki i vypolneniya etoj programmy: MASM [otvety na zaprosy obychnye] LINK [otvety na zaprosy obychnye] EXE2BIN B:EXCOM1,B:EXCOM1.COM DEL B:EXCOM1.OBJ,B:EXCOM1.EXE (udalenie OBJ i EXE-fajlov) Razmery EXE- i COM-programm - 788 i 20 bajt sootvetstven no. Uchityvaya takuyu effektivnost' COM-fajlov, rekomenduetsya vse nebol'shie programmy sozdavat' dlya COM-formata. Dlya trassirovki vypolneniya programmy ot nachala (no ne vklyuchaya) komandy RET vvedite DEBUG B:EXCOM1.COM. Nekotorye programmisty kodiruyut elementy dannyh posle komand tak, chto pervaya komanda JMP ne trebuetsya. Kodirovanie elementov dannyh pered komandami pozvolyaet uskorit' process assemblirovaniya i yavlyaetsya metodikoj, rekomenduemoj v rukovodstve po assembleru. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 6.1. Primer COM-programmy. STEK DLYA COM-PROGRAMMY ------------------------------------------------------------ Dlya COM-fajla DOS avtomaticheski opredelyaet stek i ustanav livaet odinakovyj obshchij segmentnyj adres vo vseh chetyreh segmentnyh pegistrah. Esli dlya programmy razmer segmenta v 64K yavlyaetsya dostatochnym, to DOS ustanavlivaet v registre SP adres konca cegmenta - shest.FFFE. |to budet verh steka. Esli 64K bajtovyj segment ne imeet dostatochno mesta dlya steka, to DOS ustanavlivaet stek v konce pamyati. V oboih sluchayah DOS zapisyvaet zatem v stek nulevoe slovo. Vozmozhnost' ispol'zovaniya steka zavisit ot razmera pro grammy i ogranichennosti pamyati. S pomoshch'yu komandy DIR mozhno opredelit' pazmer fajla i vychislit' neobhodimoe prostranstvo dlya steka. Vse nebol'shie programmy v etoj knige v osnovnom raschitany na COM-format. OSOBENNOSTX OTLADKI ------------------------------------------------------------ Nesoblyudenie hotya by odnogo trebovaniya COM-formata mozhet posluzhit' prichinoj nepravil'noj raboty programmy. Esli EXE2BIN obnaruzhivaet oshibku, to vydaetsya soobshchenie o Assembler dlya IBM PC. Glava 6 126 nevozmozhnosti preobrazovaniya fajla bez ukazaniya konkretnoj prichiny. Neobhodimo proverit' v etom sluchae direktivy SEGMENT, ASSUME i END. Esli opushchen ORG 100H, to na dannye v prefikse programmnogo segmenta budut ustanovleny nepravil' nye ssylki s nepredskazuemym rezul'tatom pri vypolnenii. Pri vypolnenii COM-programmy pod upravleniem otladchika DEBUG neobhodimo ispol'zovat' komandu D CS:100 dlya prosmotra dannyh i komand. Ne sleduet vypolnyat' v otladchike komandu RET; predpochtitel'nee ispol'zovat' komandu Q otladchika. Nekotorye programmisty ispol'zuyut INT 20H vmesto komandy RET. Popytka vypolnit' EXE-modul' programmy, napisannoj dlya COM-formata, ne imeet uspeha. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® Ob®em COM-fajla ogranichen 64K. ® COM-fajl men'she, chem sootvetstvuyushchij EXE-fajl. ® Programma, napisannaya dlya vypolneniya v COM-formate ne soderzhit steka i segmenta dannyh i ne trebuet iniciali zacii registra DS. ® Programma, napisannaya dlya vypolneniya v COM-formate ispol'zuet direktivu ORG 100H posle direktivy SEGMENT dlya vypolneniya s adresa posle prefiksa programmnogo segmenta. ® Programma EXE2BIN preobrazuet EXE-fajl v COM-fajl, obuslovlennyj ukazaniem tipa COM vo vtorom operande. ® Operacionnaya sistema DOS opredelyaet stek dlya COM-prog rammy ili v konce programmy, esli pozvolyaet razmer, ili v konce pamyati. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 6.1. Kakov maksimal'nyj razmer COM-fajla? 6.2. Kakie segmenty mozhno opredelit' v programme, kotoraya budet preobrazovana v COM-fajl? 6.3. Kak obhoditsya COM-fajl pri vypolnenii s faktom otsut stviya opredeleniya steka? 6.4. Programma v rezul'tate kompanovki poluchala imya SAMPLE.EXE. Napishite komandu DOS dlya preobrazovaniya ee v COM-fajl. Assembler dlya IBM PC. Glava 6 127 6.5. Izmenite programmu iz voprosa 4.6 dlya COM-formata, obra botajte ee i vypolnite pod upravleniem otladchika DEBUG. Assembler dlya IBM PC. Glava 7 132 GLAVA 7. Logika i Organizaciya Programmy ------------------------------------------------------------ Logika i Organizaciya Programmy Cel': Raskryt' mehanizm peredachi upravleniya v programme (cikly i perehody) dlya logicheskih sravnenij i programmnoj organizacii. VVEDENIE ------------------------------------------------------------ Do etoj glavy primery vypolnyalis' posledovatel'no komanda za komandoj. Odnako, programmiruemye zadachi redko byvayut tak prosty. Bol'shinstvo programm soderzhat ryad ciklov, v kotoryh neskol'ko komand povtoryayutsya do dostizheniya opredelennogo trebovaniya, i razlichnye proverki, opredelyayushie kakie iz neskol'kih dejstvij sleduet vypolnyat'. Obychnym trebovaniem yavlyaetsya proverka - dolzhna li programma zavershit' vypolnenie. |ti trebovaniya vklyuchayut peredachu upravleniya po adresu komandy, kotoraya ne nahoditsya neposredstvenno za vypolnyaemoj v tekushchij moment komandoj. Peredacha upravleniya mozhet osushchest vlyat'sya vpered dlya vypolneniya novoj gruppy komand ili nazad dlya povtoreniya uzhe vypolnennyh komand. Nekotorye komandy mogut peredavat' upravlenie, izmenyaya normal'nuyu posledovatel'nost' shagov neposredstvennoj modifikaciej znacheniya smeshcheniya v komandnom ukazatele. Nizhe privedeny chetyre sposoba peredachi upravleniya (vse budut rassmotreny v etoj glave): Bezuslovnyj perehod: JMP Cikl: LOOP Uslovnyj perehod: Jnnn (bol'she,men'she,ravno) Vyzov procedury: CALL Zametim, chto imeetsya tri tipa adresov: SHORT, NEAR i FAR. Adresaciya SHORT ispol'zuetsya pri ciklah, uslovnyh pepehodah i nekotoryh bezuslovnyh perehodah. Adresaciya NEAR i FAR ispol'zuetsya dlya vyzovov procedur (CALL) i bezuslovnyh perehodov, kotorye ne kvalificiruyutsya , kak SHORT. Vse tri tipa peredachi upravleniya vozdejstvuyut na soderzhimoe registra IP; tip FAR takzhe izmenyaet registr CS. KOMANDA JMP ------------------------------------------------------------ Odnoj iz komand obychno ispol'zuemyh dlya peredachi upravle niya yavlyaetsya komanda JMP. |ta komanda vypolnyaet bezuslovnyj perehod, t.e. obespechivaet peredachu upravleniya pri lyubyh obstoyatel'stvah. Assembler dlya IBM PC. Glava 7 133 V COM-programme na ris. 7.1 ispol'zuetsya komanda JMP. V pegistry AX, BX, i CX zagruzhaetsya znachenie 1, i zatem v cikle vypolnyayutsya sleduyushchie operacii: pribavit' 1 k registru AX, pribavit' AX k BX, udvoit' znachenie v registre CX. Povtorenie cikla privodit k uvelicheniyu soderzhimogo registra AX: 1,2,3,4..., registra BX: 1,3,6,10..., i registra CX: 1,2,4,8... Nachalo cikla imeet metku, v dannom sluchae, A20: - dvoetichie oboznachaet, chto metka nahoditsya vnutri procedury (v dannom sluchae BEGIN) v segmente koda. V konce cikla nahoditsya komanda JMP A20 kotoraya ukazyvaet na to, chto upravlenie dolzhno byt' peredano komande c metkoj A20. Obratite vnimanie, chto adresnaya metka v operande komandy ukazyvaetsya bez dvoetochiya. Dannyj cikl ne imeet vyhoda i privodit k beskonechnomu vypolneniyu - takie cikly obychno ne ispol'zuyutsya. ------------------------------------------------------------ ------------------------------------------------------------ Ris.7.1. Ispol'zovanie komandy JMP. Metku mozhno kodirovat' na odnoj stroke s komandoj: A20: ADD AX,01 ili na otdel'noj stroke: A20: ADD AX,01 V oboih sluchayah adres A20 ukazyvaet na pervyj bajt komandy ADD. Dvoetochie v metke A20 ukazyvaet na tip metki - NEAR. Zapomnite: otsutstvie dvoetochiya v metke yavlyaetsya chastoj oshibkoj. V nashem primere A20 sootvetstvuet -9 bajtam ot komandy JMP, v chem mozhno ubedit'sya po ob®ektnomu kodu komandy - EBF7. EB predstavlyaet soboj mashinnyj kod dlya korotkogo perehoda JMP, a F7 - otricatel'noe znachenie smeshcheniya (-9). Komanda JMP pribavlyaet F7 k komandnomu ukazatelyu (IP), kotopyj soderzhit adres komandy posle JMP (0112): Des. SHest. Komandnyj ukazatel': 274 112 Adres v komande JMP: -9 F7 (dvoichnoe dopolnenie) Adres perehoda: 265 109 Assembler dlya IBM PC. Glava 7 134 V rezul'tate slozheniya poluchaetsya adres perehoda - shest. 109. Prover'te po listingu programmy, chto otnositel'nyj adres metki dejstvitel'no sootvetstvuet shest.109. Sootvetstvenno operand v komande JMP dlya perehoda vpered imeet polozhitel' noe znachenie. Komanda JMP dlya perehoda v predelah -128 do +127 bajt imeet tip SHORT. Assembler generiruet v etom sluchae odnobajtovyj operand v predelah ot 00 do FF. Komanda JMP, prevoshodyashchaya eti predely, poluchaet tip FAR, dlya kotorogo generiruetsya drugoj mashinnyj kod i dvuhbajtovyj operand. Assembler v pervom prosmotre ishodnoj programmy opredelyaet dlinu kazhdoj komandy. Odnako, komanda JMP mozhet byt' dlinoj dva ili tri bajta. Esli k momentu prosmotra komandy JMP assembler uzhe vychislil znachenie opepanda (pri perehode nazad): A50: ... JMP A50 to on generiruet dvuhbajtovuyu komandu. Esli assembler eshche ne vychislil znachenie operanda (pri perehode vpered) JMP A90 ... A90: to on ne znaet tip perehoda NEAR ili FAR, i avtomaticheski generiruet 3-h bajtovuyu komandu. Dlya togo, chtoby ukazat' assembleru na neobhodimost' generacii dvuhbajtovoj komandy, sleduet ispol'zovat' operator SHORT: JMP SHORT A90 ... A90: V kachestve poleznogo uprazhneniya, vvedite programmu, proassemblirujte ee, skompanujte i perevedite v COM-format. Opredelenie dannyh ne trebuetsya, poskol'ku neposredstvennye operandy generiruyut vse neobhodimye dannye. Ispol'zujte otladchik DEBUG dlya poshagovogo vypolneniya COM-modulya i prosmotrite neskol'ko povtorenij cikla. Kogda registr AX budet soderzhat' 08, BX i CX uvelichatsya do shest. 24 (des. 36) i shest. 80 (des. 128), sootvetstvenno. Dlya vyhoda iz otladchika ispol'zujte komandu Q. KOMANDA LOOP ------------------------------------------------------------ Komanda JMP v primere na ris. 7.1 realizuet beskonechnyj cikl. No bolee veroyatno podprogramma dolzhna vypolnyat' opredelennoe chislo ciklov. Komanda LOOP, kotoraya sluzhit dlya etoj celi, ispol'zuet nachal'noe znachenie v registre CX. V kazhdom cikle komanda LOOP avtomaticheski umen'shaet soderzhimoe Assembler dlya IBM PC. Glava 7 135 registra CX na 1. Poka znachenie v CX ne ravno nulyu, upravlenie peredaetsya po adresu, ukazannomu v operande, i esli v CX budet 0, upravlenie perehodit na sluduyushchuyu posle LOOP komandu. Programma na ris. 7.2, illyustriruyushchaya ispol'zovanie koman dy LOOP, vypolnyaet dejstviya, analogichnye primeru na ris. 7.1 za isklyucheniem togo, chto posle desyati ciklov programma zavershaetsya. Komanda MOV inicializiruet registr CX znacheniem 10. Tak kak komanda LOOP ispol'zuet registr CX, to v programme dlya udvoeniya nachal'nogo znacheniya 1 vmesto registra CX ispol'zuetsya DX. Komanda JMP A20 zamenena komandoj LOOP i dlya effektivnosti komanda ADD AX,01 zamenena komandoj INC AX (uvelichenie AX na 1). Analogichno komande JMP, operand komandy LOOP opredelyaet rasstoyanie ot konca komandy LOOP do adresa metki A20, koto roe pribavlyaetsya k soderzhimomu komandnogo ukazatelya. Dlya komandy LOOP eto rasstoyanie dolzhno byt' v predelah ot -128 do +127 bajt. Esli operand prevyshaet eti granicy, to assemb ler vydast soobshchenie "Relative jump out of range" (prevysheny granicy perehoda). Dlya proverki komandy LOOP rekomenduetsya izmenit' sootvetstvuyushchim obrazom programmu, privedennuyu na ris.7.1, vypolnit' ee assemblirovanie, kompanovku i preobrazovanie v COM-fajl. Dlya trassirovki vseh desyati ciklov ispol'zujte otladchik DEBUG. Kogda v znachenie registre CX umen'shitsya do nulya, soderzhimoe registpov AX, BX i DX budet sootvetstvenno shest. 000B, 0042 i 0400. Dlya vyhoda iz otladchika vvedite komandu Q. Dopolnitel'no sushchestvuet dve raznovidnosti komandy LOOP - eto LOOPE (ili LOOPZ) i LOOPNE (ili LOOPNZ). Obe komandy takzhe umen'shayut znachenie registra CX na 1. Komanda LOOPE peredaet upravlenie po adresu operanda, esli registr CX imeet nenulevoe znachenie i flag nulya ustanovlen (ZF=1). Komanda LOOPNE peredaet upravlenie po adresu operanda, esli registr CX imeet nenulevoe znachenie i flag nulya sbroshen (ZF=0). ------------------------------------------------------------ ------------------------------------------------------------ Ris. 7.2. Ispol'zovanie komandy LOOP. FLAGOVYJ REGISTR ------------------------------------------------------------ Sleduyushchij material dannoj glavy trebuet bolee detal'nogo oznakomleniya s flagovym registrom. |tot pegistr soderzhit 16 bit flagov, kotorye upravlyayutsya razlichnymi komandami dlya indikacii sostoyaniya operacii. Vo vseh sluchayah flagi sohranya yut svoe znachenie do teh por, poka drugaya komanda ne izmenit ego. Flagovyj registr soderzhit sleduyushchie devyat' ispol'zuemyh bit (zvezdochkami otmecheny neispol'zuemye bity): Nomer bita: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Assembler dlya IBM PC. Glava 7 136 Flag: * * * * O D I T S Z * A * P * C Rassmotrim eti flagi v posledovatel'nosti sprava nalevo. CF (Carry Flag) - flag perenosa. Soderzhit znachenie "perenosov" (0 ili 1) iz starshego razryada pri arifmetiches kih operaciyah i nekotoryh operaciyah sdviga i ciklicheskogo sdviga (sm. gl.12). PF (Parity Flag) - flag chetnosti. Proveryaet mladshie vosem' bit pezul'tatov operacij nad dannymi. Nechetnoe chislo bit privodit k ustanovke etogo flaga v 0, a chetnoe - v 1. Ne sleduet putat' flag chetnosti s bitom kontrolya na chetnost'. AF (Auxiliary Carry Flag) - dopolnitel'nyj flag perenosa. Ustanavlivaetsya v 1, esli arifmeticheskaya operaciya privodit k perenosu chetvertogo sprava bita (bit nomer 3) v registro voj odnobajtovoj komande. Dannyj flag imeet otnoshenie k arifmeticheskim operaciyam nad simvolami koda ASCII i k desyatichnym upakovannym polyam. ZF (Zero Flag) - flag nulya. Ustanavlivaetsya v kachestve rezul'tata arifmeticheskih komand i komand sravneniya. Kak eto ni stranno, nenulevoj rezul'tat privodit k ustanovke nulevogo znacheniya etogo flaga, a nulevoj - k ustanovke edinichnogo znacheniya. Kazhushcheesya nesootvetstvie yavlyaetsya, odnako, logicheski pravil'nym, tak kak 0 oboznachaet "net" (t.e. rezul'tat ne raven nulyu), a edinica oboznachaet "da" (t.e. rezul'tat raven nulyu). Komandy uslovnogo perehoda JE i JZ proveryayut etot flag. SF (SIgn Flag) - znakovyj flag. Ustanavlivaetsya v sootvet stvii so znakom rezul'tata (starshego bita) posle arifmeti cheskih opepacij: polozhitel'nyj rezul'tat ustanavlivaet 0, a otricatel'nyj - 1. Komandy uslovnogo perehoda JG i JL proveryayut etot flag. TF (Trap Flag) - flag poshagovogo vypolneniya. |tot flag vam uzhe prihodilos' ustanavlivat', kogda ispol'zovalas' ko manda T v otladchike DEBUG. Esli etot flag ustanovlen v edi nichnoe costoyanie, to processor perehodit v rezhim poshagovogo vypolneniya komand, t.e. v kazhdyj moment vypolnyaetsya odna komanda pod pol'zovatel'skim upravleniem. IF (Interrupt Flag) - flag preryvaniya. Pri nulevom sostoya nii etogo flaga preryvaniya zapreshcheny, pri edinichnom - razresheny. DF (DIrection Flag) - flag napravleniya. Ispol'zuetsya v strokovyh operaciyah dlya opredeleniya napravleniya peredachi dannyh. Pri nulevom sostoyanii komanda uvelichivaet soderzhimoe Assembler dlya IBM PC. Glava 7 137 registrov SI i DI, vyzyvaya peredachu dannyh sleva napravo, pri nulevom - umen'shaet soderzhimoe etih registrov, vyzyvaya peredachu dannyh sprava nalevo (sm. gl.11). OF (Overflow Flag) - flag perepolneniya. Fiksiruet arifme ticheskoe perepolnenie, t.e. perenos v/iz starshego (znakovo go) bita pri znakovyh arifmeticheskih operaciyah. V kachestve primera: komanda CMP sravnivaet dva operanda i vozdejstvute na flagi AF, CF, OF, PF, SF, ZF. Odnako, net neobhodimosti proveryat' vse eti flagi po otdel'nosti. V sle- duyushchem primere proveryaetsya soderzhit li registr BX nulevoe znachenie: CMP BX,00 ;Sravnenie BX s nulem JZ B50 ;Perehod na B50 esli nul' . (dejstviya pri nenule) . B50: ... ;Tochka perehoda pri BX=0 Esli BX soderzhit nulevoe znachenie, komanda CMP ustanavlivaet flag nulya ZF v edinichnoe sostoyanie, i vozmozhno izmenyaet (ili net) drugie flagi. Komanda JZ (perehld esli nul') proveryaet tol'ko flag ZF. Pri edinichnom znachenii ZF, oboznachayushchee nulevoj priznak, komanda peredaet upravlenie na adres, ukazannyj v ee operande, t.e. na metku B50. KOMANDY USLOVNOGO PEREHODA ------------------------------------------------------------ V predydushchih primerah bylo pokazano, chto komanda LOOP umen'shaet na edinicu soderzhimoe registra CX i proveryaet ego: esli ne nol', to upravlenie peredaetsya po adresu, ukazannomu v operande. Takim obrazom, peredacha upravleniya zavisit ot konkretnogo sostoyaniya. Assembler podderzhivaet bol'shoe kolichestvo komand uslovnogo perehoda, kotorye osushchestvlyayut peredachu upravleniya v zavisimosti ot sostoyanij flagovogo registra. Naprimer, pri sravnenii soderzhimogo dvuh polej posleduyushchij perehod zavisit ot znacheniya flaga. Komandu LOOP v programme na ris.7.2 mozhno zamenit' na dve komandy: odna umen'shaet soderzhimoe registra CX, a drugaya vypolnyaet uslovnyj perehod: Ispol'zovanie LOOP Ispol'zovanie uslovnogo perehoda LOOP A20 DEC CX JNZ A20 Komandy DEC i JNZ dejstvuyut analogichno komande LOOP: umen'shayut soderzhimoe registra CX na 1 i vypolnyaet perehod na metku A20, esli v CX ne nol'. Komanda DEC krome togo ustanavlivaet flag nulya vo flagovom registre v sostoyanie 0 ili 1. Komanda JNZ zatem proveryaet etu ustanovku. V rassmot rennom primere komanda LOOP hotya i imeet ogpanichennoe ispol' zovanie, no bolee effektivna, chem dve komandy: DEC i JNZ. Assembler dlya IBM PC. Glava 7 138 Analogichno komandam JMP i LOOP operand v komande JNZ coderzhit znachenie rasstoyaniya mezhdu koncom komandy JNZ i adresom A20, kotoroe pribavlyaetsya k komandnomu ukazatelyu. |to rasstoyanie dolzhno byt' v predelah ot -128 do +127 bajt. V sluchae perehoda za eti granicy assembler vydast soobshchenie "Relative jump out of range" (prevysheny otnositel'nye grani cy perehoda). Znakovye i bezznakovye dannye. Rassmatrivaya naznachenie komand uslovnogo perehoda sleduet poyasnit' harakter ih ispol'zovaniya. Tipy dannyh, nad kotory mi vypolnyayutsya arifmeticheskie operacii i operacii sravneniya opredelyayut kakimi komandami pol'zovat'sya: bezznakovymi ili znakovymi. Bezznakovye dannye ispol'zuyut vse bity kak bity dannyh; harakternym primerom yavlyayutsya simvol'nye stroki: imena, adresa i natural'nye chisla. V znakovyh dannyh samyj levyj bit predstavlyaet soboj znak, prichem esli ego znachenie ravno nulyu, to chislo polozhitel'noe, i esli edinice, to otricatel'noe. Mnogie chislovye znacheniya mogut byt' kak polozhitel'nymi tak i otricatel'nymi. V kachestve primera predpolozhim, chto registr AX soderzhit 11000110, a BX - 00010110. Komanda CMP AX,BX sravnivaet soderzhimoe registrov AX i BX. Esli dannye bezznakovye, to znachenie v AX bol'she, a esli znakovye - to men'she. Perehody dlya bezznakovyh dannyh. Mnemonika Opisanie Proveryaemye flagi JE/JZ Perehod, esli ravno/nul' ZF JNE/JNZ Perehod, esli ne ravno/ne nul' ZF JA/JNBE Perehod, esli vyshe/ne nizhe ili ravno ZF,CF JAE/JNB Perehod, esli vyshe ili ravno/ne nizhe CF JB/JNAE Perehod, esli nizhe/ne vyshe ili ravno CF JBE/JNA Perehod, esli nizhe ili ravno/ne vyshe CF,AF Lyubuyu proverku mozhno kodirovat' odnim iz dvuh mnemoniches kih kodov. Naprimer, JB i JNAE generiruet odin i tot zhe ob®ektnyj kod, hotya polozhitel'nuyu proverku JB legche ponyat', chem otricatel'nuyu JNAE. Perehodydlya znakovyh dannyh Mnemonika Opisanie Proveryaemye flagi JE/JZ Perehod, esli ravno/nul' ZF JNE/JNZ Perehod, esli ne ravno/ne nul' ZF JG/JNLE Perehod, esli bol'she/ne men'she ili ravno ZF,SF,OF Assembler dlya IBM PC. Glava 7 139 JGE/JNL Perehod, esli bol'she ili ravno/ne men'she SF,OF JL/JNGE Perehod, esli men'she/ne bol'she ili ravno SF,OF JLE/JNG Perehod, esli men'she ili ravno/ne bol'she ZF,SF,OF Komandy perehoda dlya usloviya ravno ili nol' (JE/JZ) i ne ravno ili ne nol' (JNE/JNZ) prisutstvuyut v oboih spiskah dlya bezznakovyh i znakovyh dannyh. Sostoyanie ravno/nul' proishodit vne zavisimosti ot nalichiya znaka. Special'nyearifmeticheskieproverki Mnemonika Opisanie Proveryaemye flagi JS Perehod, esli est' znak (otricatel'no) SF JNS Perehod, esli net znaka(polozhitel'no) SF JC Perehod, esli est' perenos (analogichno JB) CF JNC Perehod, esli net perenosa CF JO Perehod, esli est' perepolnenie OF JNO Perehod, esli net perepolneniya OF JP/JPE Perehod, esli paritet chetnyj PF JNP/JP Perehod, esli paritet nechetnyj PF Eshche odna komanda uslovnogo perehoda proveryaet ravno li soderzhimoe registra CX nulyu. |ta komanda neobyazatel'no dolzhna paspolagat'sya neposredstvenno za komandoj arifmetiki ili sravneniya. Odnim iz mest dlya komandy JCXZ mozhet byt' nachalo cikla, gde ona proveryaet soderzhit li registr CX nenulevoe znachenie. Ne speshite poka zauchivat' eti komandy naizust'. Zapomnite tol'ko, chto dlya bezznakovyh dannyh est' perehody po sostoya niyam ravno, vyshe ili nizhe, a dlya bezznakovyh - ravno, bol'she ili men'she. Perehody po proverkam flagov perenosa, perepolneniya i pariteta imeyut osoboe naznachenie. Assembler transliruet mnemonicheskie kody v ob®ektnyj kod nezavisimo ot togo, kakuyu iz dvuh komand vy primenili. Odnako, komandy JAE i JGE yavlyayas' yavno odinakovymi, proveryayut razlichnye flagi. PROCEDURY I OPERATOR CALL ------------------------------------------------------------ V predydushchih glavah primery soderzhali v kodovom segmente tol'ko odnu proceduru, oformlennuyu sleduyushchim obrazom: BEGIN PROC FAR . . BEGIN ENDP Operand FAR informiruet sistemu o tom, chto dannyj adres yavlya etsya tochkoj vhoda dlya vypolneniya, a direktiva ENDP opredelya et konec procedury. Kodovyj segment, odnako, mozhet soderzhat' Assembler dlya IBM PC. Glava 7 140 lyuboe kolichestvo procedur, kotorye razdelyayutsya direktivami PROC i ENDP. Tipichnaya organizaciya mnogoprocedurnoj programmy privedena na ris. 7.3. Obratite vnimanie na sleduyushchie osobennosti: ® direktivy PROC po metkam B10 i C10 imeyut operand NEAR dlya ukazaniya togo, chto eti procedury nahodyatsya v teku shchem kodovom segmente. Vo mnogih posleduyushchih primerah etot operand opushchen, tak kak po umolchaniyu assembler prinimaet tip NEAR. ® Kazhdaya procedura imeet unikal'noe imya i soderzhit sob stvennuyu direktivu ENDP dlya ukazaniya konca procedury. ® Dlya peredachi upravleniya v procedure BEGIN imeyutsya dve komandy: CALL B10 i CALL C10. V rezul'tate pervoj koman dy CALL upravlenie peredaetsya procedure B10 i nachinaet sya ee vypolnenie. Dostignuv komandy RET, upravlenie vozvrashchaetsya na komandu neposredstvenno sleduyushchuyu za CALL B10. Vtoraya komanda CALL dejstvuet analogichno - peredaet upravlenie v proceduru C10, vypolnyaet ee komandy i vozvrashchaet upravlenie po komande RET. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 7.3. Vyzov procedur. ® Komanda RET vsegda vypolnyaet vozvrat v vyzyvayushchuyu pro grammu. Programma BEGIN vyzyvaet procedury B10 i C10, kotorye vozvrashchayut upravlenie obratno v BEGIN. Dlya vypolneniya samoj programmy BEGIN operacionnaya sistema DOS vyzyvaet ee i v konce vypolneniya komanda RET vozvra shchaet upravlenie v DOS. Esli procedura B10 ne soderzhit zavershayushchej komandy RET, to vypolnenie komand prodolzhit sya iz B10 neposredstvenno v procedure C10. Esli procedura C10 ne soderzhit komandy RET, to budut vypol nyat'sya komandy, okazavshiesya za proceduroj C10 s nepred skazuemym rezul'tatom. Ispol'zovanie procedur daet horoshuyu vozmozhnost' organizo vat' logicheskuyu strukturu programmy. Krome togo, operandy dlya komandy CALL mogut imet' znacheniya, vyhodyashchie za granicu ot -128 do +127 bajt. Tehnicheski upravlenie v proceduru tipa NEAR mozhet byt' peredano s pomoshch'yu komand perehoda ili dazhe obychnym postroch nym kodirovaniem. No v bol'shenstve sluchaev rekomenduetsya ispol'zovat' komandu CALL dlya peredachi upravleniya v proce duru i komandu RET dlya vozvrata. SEGMENT STEKA ------------------------------------------------------------ Assembler dlya IBM PC. Glava 7 141 Do etogo razdela v privodimyh primerah vstretilis' tol'ko dve komandy, ispol'zuyushchih stek, - eto komandy PUSH v nachale segmenta kodov, kotorye obespechivayut vozvrat v DOS, kogda EXE-programma zavershaetsya. Estestvenno dlya etih programm trebuetsya stek ochen' malogo razmera. Odnako, komanda CALL avtomaticheski zapisyvaet v stek otnositel'nyj adres komandy, sleduyushchej neposredstvenno za komandoj CALL, i uvelichivaet posle etogo ukazatel' vershiny steka. V vyzyvaemoj procedure komanda RET ispol'zuet etot adres dlya vozvrata v vyzyvayushchuyu proceduru i pri etom avtomaticheski umen'shaetsya ukazatel' vershiny steka. Takim obrazom, komandy PUSH zapisyvayut v stek dvuhbajto vye adresa ili drugie znacheniya. Komandy POP obychno vybirayut iz steka zapisannye v nego slova. |ti operacii izmenyayut otno sitel'nyj adres v registre SP (t.e. v ukazateli steka) dlya dostupa k sleduyushchemu slovu. Dannoe svojstvo steka trebuet chtoby komandy RET i CALL sootvetstvovali drug drugu. Krome togo, vyzvannaya procedura mozhet vyzvat' s pomoshch'yu komandy CALL druguyu proceduru, a ta v svoyu ochered' - sleduyushchuyu. Stek dolzhen imet' dostatochnye razmery dlya togo, chtoby hranit' vse zapisyvaemye v nego adresa. Dlya bol'shenstva primerov v dan noj knige stek ob®emom v 32 slova yavlyaetsya dostatochnym. Komandy PUSH, PUSHF, CALL, INT, i INTO zanosyat v stek adres vozvrata ili soderzhimoe flagovogo registra. Komandy POP, POPF, RET i IRET izvlekayut eti adresa ili flagi iz steka. Pri peredache upravleniya v EXE-programmu sistema ustanavli vaet v registrah sleduyushchie znacheniya: DS i ES: Adres prefiksa programmnogo segmenta - oblast' v 256 (shest. 100) bajt, kotoraya predshestvuet vypolnyaemomu programmnomu modulyu v pamyati. CS: Adres tochki vhoda v programmu (adres pervoj vypolnyaemoj komandy). IP: Nul'. SS: Adres segmenta steka. SP: Otnositel'nyj adres, ukazyvayushchij na vershinu steka. Naprimer, dlya steka v 32 slova (64 bajta), opredelennogo kak DW 32 DUP(?) SP soderzhit 64, ili shest. 40. Vypolnim trassirovku prostoj EXE-programmy, privedennoj na ris.7.4. Na praktike vyzyvaemye procedury soderzhat lyuboe chislo komand. Tekushchaya dostupnaya yachejka steka dlya zaneseniya ili izvlecheniya slova yavlyaetsya vershina steka. Pervaya komanda PUSH umen'shaet znachenie SP na 2 i zanosit soderzhimoe registra Assembler dlya IBM PC. Glava 7 142 DS (v dannom primere 049f) v vershinu steka, t.e. po adresu 4B00+3E. Vtoraya komanda PUSH takzhe umen'shaet znachenie SP na 2 i zapisyvaet soderzhimoe registra AX (0000) po adresu 4B00+3C. Komanda CALL B10 umen'shaet znachenie SP i zapisyvaet otnositel'nyj adres sleduyushchej komandy (0007) v stek po adresu 4B00+3A. Komanda CALL C10 umen'shaet znachenie SP i zapisyvaet otnositel'nyj adres sleduyushchej komandy (000B) v stek po adresu 4B00+38. Pri vozvrate iz procedury C10 komanda RET izvlekaet 000B iz steka (4B00+38), pomeshchaet ego v ukazatel' komand IP i uvelichivaet znachenie SP na 2. Pri etom proishodit avtomati cheskij vozvrat po otnositel'nomu adresu 000B v kodovom segmente, t.e. v proceduru B10. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 7.4. Vozdejstvie vypolneniya programmy na stek. Komanda RET v konce procedury B10 izvlekaet adres 0007 iz steka (4B00+3A), pomeshchayut ego v IP i uvelichivaet znachenie SP na 2. Pri etom proishodit avtomaticheskij vozvrat po otnosi tel'nomu adresu 0007 v kodovom segmente. Komanda RET po adresu 0007 zavershaet vypolnenie programmy, osushchestvlyaya vozvrat tipa FAR. Nizhe pokazano vozdejstvie na stek pri vypolnenii kazhdoj komandy. Dlya trassirovki programmy mozhno ispol'zovat' otladchik DEBUG. Privedeno tol'ko soderzhimoe pamyati s adresa 0034 do 003F i soderzhimoe registra SP: Komanda Stek SP Nachal'noe znachenie: hhhh hhhh hhhh hhhh hhhh hhhh 0040 PUSH DS (zapis' 049F) hhhh hhhh hhhh hhhh hhhh 049F 003E PUSH AX (zapis' 0000) hhhh hhhh hhhh hhhh 0000 049F 003C CALL B10 (zapis' 0007) hhhh hhhh hhhh 0700 0000 049F 003A CALL C10 (zapis' 000B) hhhh hhhh 0B00 0700 0000 049F 0038 RET (vyborka 000B) hhhh hhhh hhhh 0700 0000 049F 003A RET (vyborka 0007) hhhh hhhh hhhh hhhh 0000 049F 003C | | | | | | Smeshchenie v steke: 0034 0036 0038 003A 003C 003E Obratite vnimanie na dva momenta. Vo-pervyh, slova v pamya ti soderzhat bajty v obratnoj posledovatel'nosti, tak 0007 zapisyvaetsya v vide 0700. Vo-vtoryh, otladchik DEBUG pri ispol'zovanii ego dlya prosmotra steka zanosit v stek drugie znacheniya, vklyuchaya soderzhimoe IP, dlya sobstvennyh nuzhd. PROGRAMMA: RASSHIRENNYE OPERACII PERESYLKI ------------------------------------------------------------ V predydushchih programmah byli pokazany komandy peresylki neposredctvennyh dannyh v registr, peresylki dannyh iz pamyati v registr, peresylki soderzhimogo registra v pamyat' i Assembler dlya IBM PC. Glava 7 143 peresylki soderzhimogo odnogo registra v drugoj. Vo vseh sluchayah dlina dannyh byla ogpanichena odnim ili dvumya bajtami i ne predusmotrena peresylka dannyh iz odnoj oblasti pamyati neposredstvenno druguyu oblast'. V dannom razdele ob®yasnyaetsya process peresylki dannyh, kotorye imeeyut dlinu bolee dvuh bajt. V glave 11 budet pokazano ispol'zovanie operacij nad strokami dlya peresylki dannyh iz odnoj oblasti pamyati neposredstvenno v druguyu oblast'. V EXE-programme, privedennoj na ris. 7.5, segment dannyh coderzhit tri devyatibajtovyh polya, NAME1, NAME2, NAME3. Cel' programmy - pereslat' dannye iz polya NAME1 v pole NAME2 i pereslat' dannye iz polya NAME2 v pole NAME3. Tak kak eti polya imeyut dlinu devyat' bajt kazhdaya, to dlya peresylki dannyh krome prostoj komandy MOV potrebuyutsya eshche drugie komandy. Programma soderzhit neskol'ko novyh osobennostej. Procedura BEGIN inicializiruet segmentnye registry i zatem vyzyvaet procedury B10MOVE i C10MOVE. Procedura B10MOVE peresylaet soderzhimoe polya NAME1 v pole NAME2. Tak kak kazhdyj raz peresylaetsya tol'ko odin bajt, to procedura nachinaet s samogo levogo bajta v pole NAME1 i v cikle peresy laet zatem vtoroj bajt, tretij i t.d.: ------------------------------------------------------------ ------------------------------------------------------------ Ris. 7.5. Rasshirennye operacii peresylki. NAME1: A B C D E F G H I | | | | | | | | | NAME2: J K L M N O P Q R Dlya prodvizheniya v polyah NAME1 i NAME2 v registr CX zanositsya znachenie 9, a registry SI i DI ispol'zuyutsya v kachestve indeksnyh. Dve komandy LEA zagruzhayut otnositel'nye adresa polej NAME1 i NAME2 v registry SI i DI: LEA SI,NAME1 ;Zagruzka otnositel'nyh adresov LEA DI,NAME2 ; NAME1 i NAME2 Dlya peresylki soderzhimogo pervogo bajta iz polya NAME1 v pervyj bajt polya NAME2 ispol'zuyutsya adresa v registrah SI i DI. kvadratnye skobki v komandah MOV oboznachayut, chto dlya dostupa k pamyati ispol'zuetsya adres v registre, ukazannom v kvadratnyh ckobkah. Takim obrazom, komanda MOV AL,[SI] oznachaet: ispol'zovat' adres v registre SI (t.e.NAME1) dlya peresylki sootvetstvuyushchego bajta v registr AL. A komanda MOV [DI],AL oznachaet: peresylat' soderzhimoe registra AL po adresu, lezhashchemu v registre DI (t.e. NAME2). Assembler dlya IBM PC. Glava 7 144 Sleduyushchie komandy uvelichivayut znacheniya registrov SI i DI i umen'shayut znachenie v registre SH. Esli v registre CX ne nulevoe znachenie, upravlenie peredaetsya na sleduyushchij cikl (na metku B20).T ak kak soderzhimoe registrov SI i DI bylo uvelicheno na 1, to sleduyushchie komandy MOV budut imet' delo s adresami NAME1+1 i NAME2+1. Cikl prodolzhaetsya takim obrazom, poka ne budet peredano soderzhimoe NAME1+8 i NAME2+8. Procedura C10MOVE analogichna procedure B10MOVE s dvumya isklyucheniyami: ona peresylaet dannye iz polya NAME2 v pole NAME3 i ispol'zuet komandu LOOP vmesto DEC i JNZ. Zadanie: Vvedite programmu, privedennuyu na ris.7.5, vypolnite ee assemblirovanie, kompanovku i trassirovku s pomoshch'yu otladchika DEBUG. Obratite vnimanie na izmeneniya v registrah, komandnom ukazatele i v steke. Dlya prosmotra izmenenij v polyah NAME2 i NAME3 ispol'zujte komandu D DS:0. KOMANDY LOGICHESKIH OPERACIJ: AND, OR, XOR, TEST, NOT ------------------------------------------------------------ Logicheskie operacii yavlyayutsya vazhnym elementom v proektirovanii mikroshem i imeyut mnogo obshchego v logike programmirovaniya. Komandy AND, OR, XOR i TEST - yavlyayutsya komandami logicheskih operacij. |ti komandy ispol'zuyutsya dlya sbrosa i ustanovki bit i dlya arifmeticheskih operacij v kode ASCII (sm.gl.13). Vse eti komandy obrabatyvayut odin bajt ili odno slovo v registre ili v pamyati, i ustanavlivayut flagi CF, OF, PF, SF, ZF. AND: Esli oba iz sravnivaemyh bitov ravny 1, to rezul'tat raven 1; vo vseh ostal'nyh sluchayah rezul'tat - 0. OR: Esli hotya by odin iz sravnivaemyh bitov raven 1, to rezul'tat raven 1; esli sravnivaemye bity ravny 0, to rezul'tat - 0. XOR: Esli odin iz sravnivaemyh bitov raven 0, a drugoj raven 1, to rezul'tat raven 1; esli sravnivaemye bity odinakovy (oba - 0 ili oba - 1) to rezul'tat - 0. TEST: dejstvuet kak AND-ustanavlivaet flagi, no ne izmenyaet bity. Pervyj operand v logicheskih komandah ukazyvaet na odin bajt ili slovo v registre ili v pamyati i yavlyaetsya edinstven nym znacheniem, kotoroe mozhet izmenyatsya posle vypolneniya komand. V sleduyushchih komandah AND, OR i XOR ispol'zuyutsya odinakovye bitovye znacheniya: AND OR XOR 0101 0101 0101 0011 0011 0011 Rezul'tat: 0001 0111 0110 Assembler dlya IBM PC. Glava 7 145 Dlya sleduyushchih nesvyazannyh primerov, predpolozhim, chto AL soderzhit 1100 0101, a BH soderzhit 0101 1100: 1. AND AL,BH ;Ustanavlivaet v AL 0100 0100 2. OR BH,AL ;Ustanavlivaet v BH 1101 1101 3. XOR AL,AL ;Ustanavlivaet v AL 0000 0000 4. AND AL,00 ;Ustanavlivaet v AL 0000 0000 5. AND AL,0FH ;Ustanavlivaet v AL 0000 0101 6. OR CL,CL ;Ustanavlivaet flagi SF i ZF Primery 3 i 4 demonstriruyut sposob ochistki registra. V primere 5 obnulyayutsya levye chetyre bita registra AL. Hotya komandy sravneniya CMP mogut byt' ponyatnee, mozhno primenit' komandu OR dlya sleduyushchih celej: 1. OR CX,CX ;Proverka CX na nul' JZ ... ;Perehod, esli nul' 2. OR CX,CX ;Proverka znaka v CX JS ... ;Perehod, esli otricatel'no Komanda TEST dejstvuet analogichno komande AND, no ustanavlivaet tol'ko flagi, a operand ne izmenyaetsya. Nizhe prideno neskol'ko primerov: 1. TEST BL,11110000B ;Lyuboj iz levyh bit v BL JNZ ... ; raven edinice? 2. TEST AL,00000001B ;Registr AL soderzhit