levom smeshchenii. Sleduyushchaya komanda SUB AX,AX generiruet dvuhbajto vyj mashinnyj kod (2B C0), nachinayushchijsya s otnositel'nogo adresa 0001. Probel mezhdu bajtami tol'ko dlya udobochitaemos ti. V dannom primere vstrechayutsya odno-, dvuh- i trehbajtovye komandy. Poslednyaya komanda END soderzhit operand BEGIN, kotoryj imeet otnoshenie k imeni komandy PROC po smeshcheniyu 0000. |to est' adres segmenta kodov, s kotorogo nachinaetsya vypolnenie posle zagruzki programmy. Listing assemblirovaniya programmy EXASM1.LST, imeet po direktive PAGE shipinu 132 simvola i mozhet byt' raspechatan. Mnogie printery mogut pechatat' tekst szhatym shriftom. Vklyuchite vash printer i vvedite komandu MODE LPT1:132,6 Tablica identifikatorov Za listingom assemblirovaniya programmy sleduet tablica identifikatorov. Pervaya chast' tablicy soderzhit opredelennye v programme segmenty i gruppy vmeste s ih razmerom v bajtah, vyravnivaniem i klassom. Vtoraya chast' soderzhit identifikato ry - imena polej dannyh v segmente dannyh (v nashem primere ih net) i metki, naznachennye komandam v segmente kodov (odna v nashem primere). Dlya togo, chtoby assembler ne sozdaval etu tablicu, sleduet ukazat' parametr /N vsled za komandoj MASM, t.e. MASM/N. Dvuhprohodnyj assembler V processe translyacii ishodnoj programmy assembler delaet dva prosmotra ishodnogo teksta, ili dva prohoda. Odnoj iz osnovnyh prichin etogo yavlyayutsya ssylki vpered, chto proishodit v tom sluchae, kogda v nekotoroj komande kodiruet sya metka, znachenie kotoroj eshche ne opredeleno assemblerom. V pervom prohode assembler prosmatrivaet vsyu ishodnuyu progpammu i stroit tablicu identifikatorov, ispol'zuemyh v programme, t.e. imen polej dannyh i metok programmy i ih otnositel'nyh adresov v programme. V pervom prohode podchityvaetsya ob®em ob®ektnogo koda, no sam ob®ektnyj kod ne generiruetsya. Vo vtorom prohode assembler ispol'zuet tablicu identifi katorov, postroennuyu v pervom prohode. Tak kak teper' uzhe izvestny dliny i otnositel'nye adresa vseh polej dannyh i komand, to assembler mozhet sgenerirovat' ob®ektnyj kod dlya kazhdoj komandy. Assembler sozdaet, esli trebuetsya, fajly: OBJ, LST i CRF. Assembler dlya IBM PC. Glava 4 84 KOMPANOVKA PROGRAMMY ------------------------------------------------------------ Esli v rezul'tate assemblirovaniya ne obnaruzheno oshibok, to cleduyushchij shag - kompanovka ob®ektnogo modulya. Fajl EXASM1.OBJ soderzhit tol'ko mashinnyj kod v shestnadcaterichnoj forme. Tak kak programma mozhet zagruzhat'sya pochti v lyuboe mesto pamyati dlya vypolneniya, to assembler mozhet ne opredelit' vse mashinnye adresa. Krome togo, mogut ispol'zovat'sya drugie (pod) programmy dlya ob®edineniya s osnovnoj. Naznacheniem programmy LINK yavlyaetsya zavershenie opredeleniya adresnyh ssylok i ob®edinenie (esli trebuetsya) neskol'kih programm. Dlya kompanovki assemblirovannoj programmy s diskety, vstavte disketu DOS v diskovod A, a disketu s programmoj v diskovod B. Pol'zovateli vinchesterskogo diska mogut zagruzit' kompanovshchik LINK pryamo s diskovoda C. Vvedite komandu LINK i nazhmite klavishu Return. Posle zagruzki v pamyat', kompanovshchik vydaet neskol'ko zaprosov (analogichno MASM), na kotorye neobhodimo otvetit': Zapros kompanovshchika Otvet Dejstvie Object Modules [.OBJ]: B:EXASM1 Kompanuet EXASM1.OBJ Run file [EXASM1.EXE]: B: Sozdaet EXASM1.EXE List file [NUL.MAP]: CON Sozdaet EXASM1.MAP Libraries [.LIB]: [Return] Po umolchaniyu Pervyj zapros - zapros imen ob®ektnyh modulej dlya kompa novki, tip OBJ mozhno opustit'. Vtoroj zapros - zapros imeni ispolnimogo modulya (fajla), (po umolchaniyu A:EXASM1.EXE). Otvet B: trebuet, chtoby kompanovshchik sozdal fajl na diskovode V. Praktika sohraneniya odnogo imeni (pri raznyh tipah) fajla uproshchaet rabotu s programmami. Tretij zapros predpolagaet, chto LINK vybiraet znachenie po ymolchaniyu - NUL.MAP (t.e. MAP otsutstvuet). MAP-fajl soderzhit tablicu imen i razmerov segmentov i oshibki, kotorye obnaruzhit LINK. Tipichnoj oshibkoj yavlyaetsya nepravil'noe opredelenie segmenta steka. Otvet CON predpolagaet, chto tablica budet vyvedena na ekran, vmesto zapisi ee na disk. |to pozvolyaet sekonomit' mesto v diskovoj pamyati i srazu prosmotret' tablicu neposredstvenno na ekrane. V nashem primere MAP-fajl soderzhit sleduyushchuyu informaciyu: Start Stop Length Name 00000H 00015H 0016H CODESG 00020H 0007FH 0060H STACKSG Assembler dlya IBM PC. Glava 4 85 Dlya otveta na chetvertyj zapros - nazhmite Return, chto ukazhet kompanovshchiku LINK prinyat' ostal'nye parametry po ymolchaniyu. Opisanie bibliotechnyh sredstv mozhno najti v rukovodstve po DOS. Na dannom etape edinstvennoj vozmozhnoj oshibkoj mozhet byt' ykazanie nepravil'nyh imen fajlov. Ispravit' eto mozhno tol'ko perezapuskom programmy LINK. V prilozhenii 4 perechis len ryad pezhimov kompanovshchika LINK. VYPOLNENIE PROGRAMMY ------------------------------------------------------------ Posle assemblirovaniya i kompanovki programmy mozhno (nakonec-to!) vypolnit' ee. Na ris. 4.2 privedena shema komand i shagov dlya assemblirovaniya, kompanovki i vypolneniya programmy EXASM1. Esli EXE-fajl nahoditsya na diskovode B, to vypolnit' ee mozhno komandoj: B:EXASM1.EXE ili B:EXASM1 DOS predpolagaet, chto fajl imeet tip EXE (ili COM), i zagruzhaet fajl dlya vypolneniya. No tak kak nasha programma ne vyrabatyvaet vidimyh rezul'tatov, vypolnim ee trassirovkoj pod otladchikom DEBUG. Vvedite DEBUG B:EXASM1.EXE V rezul'tate DOS zagruzit programmu DEBUG, kotoryj, v svoyu ochered', zagruzit trebuemyj EXE-modul'. Posle etogo otladchik vydast defis (-) v kachestve priglasheniya. Dlya prosmotra segmenta steka vvedite D SS:0 |tu oblast' legko uznat' po 12-kratnomu dublirovaniyu konstanty STACKSEG. Dlya prosmotra segmenta koda vvedite D CS:0 Sravnite mashinnyj kod s listingom assemblera: 1E2BC050B823010525008BD803 ... Neposredstvennye operandy, privedennye v listinge assemblirovaniya kak 0123 i 0025 v pamyati predstavleny v vide 2301 i 2500 sootvetstvenno. V dannom sluchae listing assemblirovaniya ne vpolne sootvetstvuet mashinnomu kodu. Vse dvuhbajtovye adresa (slova) i neposredstvennye operandy v mashinnom kode hranyatsya v obratnom poryadke. Assembler dlya IBM PC. Glava 4 86 Vvedite R dlya prosmotra soderzhimogo registrov i vypolnite progpammu s pomoshch'yu komandy T (trassirovka). Obratite vnimanie na vozdejstvie dvuh komand PUSH na stek - v vershine steka teper' nahoditsya soderzhimoe registra DS i nulevoj adres. V processe poshagovogo vypolneniya programmy obratite vnimanie na soderzhimoe registrov. Kogda vy dojdete do komandy RET, mozhno vvesti Q (Quit - vyhod) dlya zaversheniya raboty otladchika. Ispol'zuya komandu dir, mozhno proverit' nalichie vashih fajlov na diske: DIR B:EXASM1.* ------------------------------------------------------------ ------------------------------------------------------------ Ris. 4.2. Shema assemblirovaniya, kompanovki i vypolneniya programmy. V rezul'tate na ekrane poyavitsya sleduyushchie imena fajlov: EXASM1.BAK (esli dlya korrektirovki EXASM1.ASM ispol'zovalsya redaktor EDLIN), EXASM1.ASM, EXASM1.OBJ, EXASM1.LST, EXASM1.EXE i EXASM1.CRF. Posledovatel'nost' etih fajlov mozhet byt' inoj v zavisimosti ot togo, chto uzhe nahoditsya na diske. Ochevidno, chto razrabotka ryada programm privedet k zanyatiyu diskovogo prostranstva. Dlya proverki ostavshegosya svobodnogo mesta na diske polezno ispol'zovat' komandu DOS CHKDSK. Dlya udaleniya OBJ-, CRF-, BAK- i LST-fajlov s diska sleduet ispol'zovat' komandu ERASE (ili DEL): ERASE B:EXASM1.OBJ, ... Sleduet ostavit' (sohranit') ASM-fajl dlya posleduyushchih izmenenij i EXE-fajl dlya vypolneniya. V sleduyushchem razdele predstavleno opredelenie dannyh v segmente dannyh. Pozzhe budet opisana tablica perekrestnyh csylok. PRIMER ISHODNOJ PROGRAMMY ------------------------------------------------------------ Osobennost' programmy, privedennoj na ris. 4.1, sostoit v tom, chto ona ne soderzhit opredeleniya dannyh. Obychno vse programmy imeyut opredelennye konstanty, rabochie polya dlya arifmeticheskih vychislenij i oblasti dlya operacij vvoda-vyvoda. V glave 2 (ris.2.3) byla rassmotrena programma v mashinnyh kodah, v kotoroj byli opredeleny dva polya dannyh. V etoj glave na ris. 4.3 privoditsya analogichnaya programma, no na etot raz napisannaya na yazyke assemblera i dlya kratkosti uzhe assemblirovannaya. |ta programma znakomit s neskol'kimi novymi osobennostyami. Assembler dlya IBM PC. Glava 4 87 Segment steka soderzhit direktivu DW (Define Word - oprede lit' clovo), opisyvayushchaya 32 slova, v kotoryh generiruetsya neopredelennoe znachenie oboznachennoe znakom voprosa (?). Opredelenie razmera steka v 32 slova yavlyaetsya naibolee real'nym, tak kak v bol'shih programmah mozhet potrebovat'sya mnogo "preryvanij" dlya vvoda-vyvoda i vyzovov podprogramm - vse oni ispol'zuyut stek. Opredelenie steka dublirovaniem konstanty 'STACKSEG' v primere na pis. 3.2 neobhodimo lish' dlya udobstva pri rabote s otladchikom DEBUG. Zamechanie: Opredelyajte razmer steka ne menee 32 slov. Pri malyh razmerah steka ni assembler, ni kompanovshchik ne smo- gut opredelit' etogo i vypolnenie programmy mozhet razrushit' sya samym nepredskazuemym obrazom. V primere na ris. 4.3 opredelen segment dannyh DATASG, nachinayushchijsya po otnositel'nomu adresu 0000. |tot segment soderzhit tri znacheniya v formate DW. Pole FLDA opredelyaet slovo (dva bajta), soderzhashchee desyatichnoe znachenie 250, kotoroe assembler transliruet v shest. 00FA (sm. na risunke sleva). Pole FLDB opredelyaet slovo s desyatichnym znacheniem 125, kotopoe transliruetsya v shest. 007D. Dejstvitel'nye znacheniya etih dvuh konstant v pamyati - FA00 i 7D00 sootvetstvenno, chto mozhno proverit' c pomoshch'yu otladchika DEBUG. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 4.3. Listing assemblirovaniya programmy s segmentom dannyh. Pole FLDC opredelyaet slovo s neizvestnym znacheniem, oboznachennym znakom voprosa (?). Segment koda v dannom primere imeet imya CODESG i otli- chaetsya novymi osobennostyami, svyazannymi s segmentom dannyh. Vo-pervyh, direktiva ASSUME ukazyvaet na opredelnie DATASG cherez registr DS. Dannoj programme ne trebuetsya registr ES, no nekotorye programmisty opisyvayut ego dlya standartizacii. Vo-vtoryh, posle komand PUSH, SUB i PUSH, kotorye iniciali- ziruyut stek, sleduyut dve komandy, obespechivayushchie adresaciyu segmenta dannyh: 0004 B8 ---- R MOV AX,DATASG 0007 8E D8 MOV DS,AX Pervaya komanda MOV zagruzhaet DATASG v registr AX. Konechno, na samom dele komanda ne mozhet zagruzit' segment v registr - ona zagruzhaet lish' adres segmenta DATASG. Obratite vnimanie na mashinnyj kod sleva: B8 ---- R CHetyre defisa govoryat o tom, chto assembler ne mozhet oprede lit' adres DATASG; on opredelyaetsya lish' kogda ob®ektnaya programma budet skompanovana i zagruzhena dlya vypolneniya. Assembler dlya IBM PC. Glava 4 88 Poskol'ku zagpuzchik mozhet raspolozhit' programmu v lyubom meste pamyati, ascembler ostavlyaet dannyj adres otkrytym i pokazyvaet eto simvolom R; kompanovshchik dolzhen budet podsta vit' v eto mesto dejstvitel'nyj adres. Vtoraya komanda MOV peresylaet soderzhimoe registra AX v registr DS. Takim obrazom, dannaya programma imeet direktivu ASSUME, kotoraya sootnosit registr DS s segmentom dannyh, i komandy, inicializiruyushchie registr DS otnositel'nym adresom DATASG. Mogut vozniknut' dva voprosa po povodu etoj programmy. Vo-pervyh, pochemu ne ispol'zovat' odnu komandu dlya iniciali zacii registra DS, naprimer, MOV DS,DATASG ? Delo v tom, chto ne sushchestvuet komand dlya neposredstvennoj perecylki dannyh iz pamyati v registr DS. Sledovatel'no, dlya inicializacii DS neobhodimo kodirovat' dve komandy. Vo-vtoryh, pochemu programma inicializiruet registr DS, a registry SS i CS net? Okazyvaetsya, registry SS i CS inicializiruyutsya avtomaticheski pri zagruzke programmy dlya vypolneniya, a otvetstvennost' za inicializaciyu registra DS i, esli trebuetsya ES, lezhit polnost'yu na samoj programme. Poka vse eti trebovaniya mogut pokazat'sya ves'ma tuman nymi, no cejchas net neobhodimosti ponimat' ih. Vse posleduyu shchie programmy ispol'zuyut analogichnuyu standartnuyu inicializa ciyu steka i segmenta dannyh. Poetomu mozhno prosto kopirovat' dannye kody dlya kazhdoj novoj programmy. Dejstvitel'no, vy mozhete sohranit' na diske standartnuyu chast' programmy i dlya kazhdoj novoj programmy kopirovat' etu chast' s novym imenem, i, ispol'zuya zatem redaktor, zapisat' dopolnitel'nye komandy. V kachestve uprazhneniya, sozdajte s pomoshch'yu vashego redaktora programmu, privedennuyu na ris. 4.3, vypolnite ee assemblirovanie i kompanovku. Zatem s pomoshch'yu otladchika DEBUG prosmotrite segment kodov, segment dannyh, registry i prodelajte poshagovoe vypolnenie programmy. FAJL PEREKRESTNYH SSYLOK ------------------------------------------------------------ V processe translyacii assembler sozdaet tablicu identifikatorov (CRF), kotoraya mozhet byt' predstavlena v vide listinga perekrestnyh ssylok na metki, identifikatory i peremennye v programme. Dlya polucheniya dannogo fala, neobhodimo na chetvertyj zapros assemblera, otvetit' B:, polagaya, chto fajl dolzhen byt' sozdan na diske B: cross-reference [NUL.CRF]:B: [Return] Assembler dlya IBM PC. Glava 4 89 Dalee neobhodimo preobrazovat' poluchennyj CRF-fajl v otsortipovannuyu tablicu perekrestnyh ssylok. Dlya etogo na assemblernom diske imeetsya sootvetstvuyushchaya programma. Posle uspeshnogo assemblirovaniya vvedite komandu CREF. Na ekrane poyavitsya dva zaprosa: Cref filename [.CRF]: List filename [cross-ref.REF]: Na pervyj zapros vvedite imya CRF-fajla, t.e. B:EXASM1. Na vtoroj zapros mozhno vvesti tol'ko nomer diskovoda i poluchit' imya po umolchaniyu. Takoj vybor privedet k zapisi CRF v fajl perekrestnyh ssylok po imeni EXASM1.REF na diskovode B. Dlya raspechatki fajla perekrestnyh ssylok ispol'zujte komandu DOS PRINT. V prilozhenii 4 priveden ryad rezhimov programmy CREF. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 4.4. Tablica perekrestnyh ssylok Na ris. 4.4 pokazana tablica perekrestnyh ssylok dlya programmy, privedennoj na ris. 4.3. Vse identifikatory v tablice predctavleny v alfavitnom poryadke i dlya kazhdogo iz nih ukazany nomepa strok v ishodnoj programme, gde oni opredeleny i imeyut ssylki. Imena segmentov i elementov dannyh predstavleny v alfavitnom popyadke. Pervoe chislo sprava v formate n# ukazyvaet na nomer stroki v LST-fajle, gde opredelen sootvetstvuyushchij identifikator. Eshche pravee nahodyatsya chisla, ukazyvayushchie na nomera strok, gde imeyutsya csylki na etot identifikator. Naprimer, CODESG opredelen v stroke 17 i imeet ssylki na strokah 19 i 32. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® Assembler preobrazuet ishodnuyu programmu v OBJ-fajl, a kompanovshchik - OBJ-fajl v zagruzochnyj EXE-fajl. ® Vnimatel'no proveryajte zaprosy i otvety na nih dlya programm (M)ASM, LINK i CREF prezhde chem nazhat' klavishu Return. Bud'te osobenno vnimatel'ny pri ukazanii disko voda. ® Programma CREF sozdaet raspechatku perekrestnyh ssylok. ® Udalyajte nenuzhnye fajly s vashego diska. Regulyarno pol'zujtes' programmoj CHKDSK dlya proverki svobodnogo mesta na diske. Krome togo periodicheski sozdavajte rezervnye kopii vashej programmy, hranite rezervnuyu disketu i kopirujte ee zanovo dlya posleduyushchego programmirovaniya. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ Assembler dlya IBM PC. Glava 4 90 4.1. Vvedite komandu MASM i otvet'te na zaprosy dlya assemblirovaniya programmy po imeni TEMPY.ASM s polucheniem fajlov LST, OBJ i CRF, polagaya, chto disketa s programmoj nahoditsya na diskovode B. 4.2. Vvedite komandy dlya programmy TEMPY (iz voprosa 4.1) a) dlya vypolneniya cherez otladchik DEBUG, b) dlya neposredst vennogo vypolneniya iz DOS. 4.3. Ob®yasnite naznachenie kazhdogo iz sleduyushchih fajlov: a) file.BAK, b) file.ASM, v) file.LST, g) file.CRF, d) file.OBJ, e) file.EXE, zh) file.MAP. 4.4. Napishite dve komandy dlya inicializacii registra DS, polagaya, chto imya segmenta dannyh - DATSEG. 4.5. Sostavte assemblernuyu programmu dlya: - peresylki shest. 30 (neposredstvennoe znachenie) v registr AL; - sdviga soderzhimogo registra AL na odi bit vlevo (komanda SHL); - peresylki shest. 18 (neposredstvennoe znachenie) v registr BL; - umnozheniya registra AL na BL (komanda MUL BL). Ne zabyvajte komandu RET. V programme net neobhodimosti opredelyat' i inicializirovat' segment dannyh. Ne zaby vajte takzhe kopirovat' standartnuyu chast' programmy (os novu programmy) i ispol'zovat' redaktor dlya ee razvi tiya. Vypolnite assemblirovanie i kompanovku. Ispol'zuya otladchik DEBUG, proverte segment kodov, registry i pro delajte poshagovoe vypolnenie (trassirovku) programmy. 4.6. Modificirujte programmu iz voprosa 4.5 dlya: - opredeleniya odnobajtovyh elementov (direktiva DB) po imeni FLDA, soderzhashchego shest. 28, i po imeni FLDB, soderzhashchego shest. 14; - opredeleniya dvuhbajtovogo elementa (direktiva DW) po imeni FLDC, ne imeyushchego znacheniya; - peresylki soderzhimogo polya FLDA v registr AL i sdviga na odin bit; - umnozheniya soderzhimogo registra AL na znachenie v pole FLDB (MUL FLDB); - peresylki rezul'tata iz registra AX v pole FLDC. Dlya dannoj programmy neobhodim segment dannyh. Vypolni te assemblirovanie, kompanovku programmy i testirovanie s pomoshch'yu otladchika DEBUG. Assembler dlya IBM PC. Glava 5 104 GLAVA 5. Opredelenie Dannyh ------------------------------------------------------------ Opredelenie Dannyh Cel': Pokazat' metodam opredeleniya konstant i rabochih polej v assemblernoj programme. VVEDENIE ------------------------------------------------------------ Segment dannyh prednaznachen dlya opredeleniya konstant, rabochih polej i oblastej dlya vvodv-vyvoda. V sootvetstvii s imeyushchimisya direktivami v assemblere razresheno opredelenie dannyh razlichnoj dliny: naprimer, direktiva DB opredelyaet bajt, a direktiva DW opredelyaet slovo. |lement dannyh mozhet soderzhat' neposredstvennoe znachenie ili konstantu, opredelen nuyu kak simvol'naya stroka ili kak chislovoe znachenie. Drugim sposobom opredeleniya konstanty yavlyaetsya neposred stvennoe znachenie, t.e. ukazannoe pryamo v assemblernoj komande, naprimer: MOV AL,20H V etom sluchae shestnadcaterichnoe chislo 20 stanovitsya chast'yu ma shinnogo ob®ektnogo koda. Neposredstvennoe znachenie ogranicheno odnim bajtom ili odnim slovom, no tam, gde ono mozhet byt' primeneno, ono yavlyaetsya bolee effektivnym, chem ispol'zovanie konctanty. DIREKTIVY OPREDELENIYA DANNYH ------------------------------------------------------------ Assembler obespechivaet dva sposoba opredeleniya dannyh: vo-pervyh, cherez ukazanie dliny dannyh i, vo-vtoryh, po ih coderzhimomu. Rassmotrim osnovnoj format opredeleniya dannyh: [imya] Dn vyrazhenie ® Imya elementa dannyh ne obyazatel'no (eto ukazyvaetsya kvadratnymi skobkami), no esli v programme imeyutsya ssylki na nekotoryj element, to eto delaetsya posredstvom imeni. Pravila napisaniya imen privedeny v razdele "Format kodirovaniya" v glave 3. ® Dlya opredeleniya elementov dannyh imeyutsya sleduyushchie direktivy: DB (bajt), DW (slovo), DD (dvojnoe slovo), DQ (uchetverennoe slovo) i DT (desyat' bajt). ® Vyrazhenie mozhet soderzhat' konstantu, naprimer: FLD1 DB 25 ili znak voprosa dlya neopredelennogo znacheniya, naprimer Assembler dlya IBM PC. Glava 5 105 FLDB DB ? Vyrazhenie mozhet soderzhat' neskol'ko konstant, razdelennyh zapyatymi i ogranichennymi tol'ko dlinoj stroki: FLD3 DB 11, 12, 13, 14, 15, 16, ... Assembler opredelyaet eti konstanty v vide posledovatel'nosti cmezhnyh bajt. Ssylka po imeni FLD3 ukazyvaet na pervuyu konstantu, 11, po FLD3+1 - na vtoruyu, 12. (FLD3 mozhno predstavit' kak FLD3+0). Naprimer komanda MOV AL,FLD3+3 zagruzhaet v registr AL znachenie 14 (shest. 0E). Vyrazhenie dopuskaet takzhe povtorenie konstanty v sleduyushchem formate: [imya] Dn chislo-povtorenij DUP (vyrazhenie) ... Sleduyushchie tri primera illyustriruyut povtorenie: DW 10 DUP(?) ;Desyat' neopredelennyh slov DB 5 DUP(14) ;Pyat' bajt, soderzhashchih shest.14 DB 3 DUP(4 DUP(8));Dvenadcat' vosmerok V tret'em primere snachala generiruetsya chetyre kopii desyatich noj 8 (8888), i zatem eto znachenie povtoryaetsya tri raza, davaya v pezul'tate dvenadcat' vosmerok. Vyrazhenie mozhet soderzhat' simvol'nuyu stroku ili chislovuyu konstantu. Simvol'nye stroki Simvol'naya stroka ispol'zuyutsya dlya opisaniya dannyh, takih kak, naprimer, imena lyudej ili zagolovki stranic. Soderzhimoe stroki otmechaetsya odinochnymi kavychkami, naprimer, 'PC' ili dvojnymi kavychkami - "PC". Assembler perevodit simvol'nye stroki v ob®ektnyj kod v obychnom formate ASCII. Simvol'naya stroka opredelyaetsya tol'ko direktivoj DB, v kotopoj ukazyvaetsya bolee dvuh simvolov v normal'noj posledo vatel'nosti sleva napravo. Sledovatel'no, direktiva DB predstavlyaet edinstvenno vozmozhnyj format dlya opredeleniya simvol'nyh dannyh. Na ris. 5.1 priveden ryad primerov. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 5.1. Opredelenie simvol'nyh strok i chislovyh velichin. CHislovye konstanty Assembler dlya IBM PC. Glava 5 106 CHislovye konstanty ispol'zuyutsya dlya arifmeticheskih velichin i dlya adresov pamyati. Dlya opisaniya konstanty kavychki ne stavyatsya. Assembler preobrazuet vse chislovye konstanty v shestnadciterichnye i zapisyvaet bajty v ob®ektnom kode v obratnoj posledovatel'nosti - sprava nalevo. Nizhe pokazany razlichnye chislovye formaty. Desyatichnyj format. Desyatichnyj format dopuskaet desyatichnye cifry ot 0 do 9 i oboznachaetsya poslednej bukvoj D, kotoruyu mozhno ne ukazyvat', naprimer, 125 ili 125D. Nesmotrya na to, chto assembler pozvolyaet kodirovanie v desyatichnom formate, on preobrazuet eti znacheniya v shest. ob®ektnyj kod. Naprimer, desyatichnoe chislo 125 preobrazuetsya v shest. 7D. SHestnadcatirichnyj format. SHest. format dopuskaet shest. cifry ot 0 do F i oboznachaetsya poslednej bukvoj H. Tak kak assembler polagaet, chto s bukvy nachinayutsya identifikatory, to pervoj cifroj shest. konstanty dolzhna byt' cifra ot 0 do 9. Naprimer, 2EH ili 0FFFH, kotorye assembler preobrazuet sootvetstvenno v 2E i FF0F (bajty vo vtorom primere zapisy vayutsya v ob®ektnyj kod v obratnoj posledovatel'nosti). Dvoichnyj format. Dvoichnyj format dopuskaet dvoichnye cifry 0 i 1 i oboznachaetsya poslednej bukvoj B. Dvoichnyj format obychno ispol'zuetsya dlya bolee chetkogo predstavleniya bitovyh znachenij v logicheskih komandah AND, OR, XOR i TEST. Desyatichnoe 12, shest. C i dvoichnoe 1100B vse generiruyut odin i tot zhe kod: shest. 0C ili dvoichnoe 0000 1100 v zavisimosti ot togo, kak vy rassmatrivaete soderzhimoe bajta. Vosmerichnyj format. Vosmerichnyj format dopuskaet vosmerich nye cifry ot 0 do 7 i oboznachaetsya poslednej bukvoj Q ili O, naprimer, 253Q. Na segodnya vosmerichnyj format ispol'zuetsya ves'ma redko. Desyatichnyj format s plavayushchej tochkoj. |tot format podder zhivaetsya tol'ko assemblerom MASM. Pri zapisi simvol'nyh i chislovyh konstant sleduet pomnit', chto, naprimer, simvol'naya konstanta, opredelennaya kak DB '12', predstavlyaet simvoly ASCII i generiruet shest. 3132, a chislovaya konstanta, opredelennaya kak DB 12, predstav lyaet dvoichnoe chislo i generiruet shest. 0C. Ris. 5.1 illyustriruet direktivy dlya opredeleniya razlichnyh simvol'nyh strok i chislovyh konstant. Segment dannyh byl assemblirovan dlya togo, chtoby pokazat' sgenerirovannyj ob®ektnyj kod (sleva). DIREKTIVA OPREDELENIYA BAJTA (DB) ------------------------------------------------------------ Assembler dlya IBM PC. Glava 5 107 Iz razlichnyh direktiv, opredelyayushchih elementy dannyh, naibolee poleznoj yavlyaetsya DB (opredelit' bajt). Simvol'noe vyrazhenie v dipektive DB mozhet soderzhat' stroku simvolov lyuboj dliny, vplot' do konca stroki (sm. FLD2DB i FLD7DB na ris. 5.1). Obratite vnimanie, chto konstanta FLD2DB soderzhit simvol'nuyu stroku 'Personal Computer'. Ob®ektnyj kod pokazyvaet simvoly koda ASCII dlya kazhdogo bajta. SHest. 20 predstavlyaet simvol probela. CHislovoe vyrazhenie v direktive DB mozhet soderzhat' odnu ili bolee odnobajtovyh konstant. Odin bajt vyrazhaetsya dvumya shest. cifpami. Naibol'shee polozhitel'noe shest. chislo v odnom bajte eto 7F, vse "bol'shie" chisla ot 80 do FF predstavlyayut otricatel'nye znacheniya. V desyatichnom ischislenii eti predely vyrazhayutsya chislami +127 i -128. V primere na ris. 5.1 chislovymi konstantami yavlyayutsya FLD3DB, FLD4DB, FLD5DB i FLD8DB. Pole FLD6DB predstavlyaet smes' iz chislovyh i strokovyh konstant, ispol'zuemyh dlya postroeniya tablicy. DIREKTIVA OPREDELENIYA SLOVA (DW) ------------------------------------------------------------ Direktiva DW opredelyaet elementy, kotorye imeyut dlinu v odno slovo (dva bajta). Simvol'noe vyrazhenie v DW ogranicheno dvumya simvolami, kotorye assembler predstavlyaet v ob®ektnom kode tak, chto, naprimer, 'PC' stanovitsya 'CP'. Dlya opredeleniya simvol'nyh strok direktiva DW imeet ogranichennoe primenenie. CHislovoe vyrazhenie v DW mozhet soderzhat' odno ili bolee dvuhbajtovyh konstant. Dva bajta predstavlyayutsya chetyr'mya shest. ciframi. Naibol'shee polozhitel'noe shest. chislo v dvuh bajtah eto 7FFF; vse "bol'shie" chisla ot 8000 do FFFF predstavlyayut otricatel'nye znacheniya. V desyatichnom ischislenii eti predely vyrazhayutsya chislami +32767 i -32768. V primere na ris. 5.1 polya FLD1DW i FLD2DW opredelyayut chislovye konstanty. Pole FLD3DW opredelyaet adres - v dannom sluchae smeshchenie na adres FLD7DB. V rezul'tate generiruetsya ob®ektnyj kod 0021 (R oboznachaet peremeshchaemost'). Proveryaya vyshe po risunku, vidno, chto otnositel'nyj adres polya FLD7DB dejstvitel'no 0021. Pole FLD4DW opredelyaet tablicu iz pyati chislovyh konstant. Zametim, chto ob®ektnyj kod dlya kazhdoj konstanty imeet dlinu v odno slovo (dva bajta). Dlya formatov direktiv DW, DD i DQ assembler preobrazuet konstanty v shest. ob®ektnyj kod, no zapisyvaet ego v obratnoj posledovatel'nosti. Takim obrazom desyatichnoe znachenie 12345 preobrazuetsya v shest.3039, no zapisyvaetsya v ob®ektnom kode kak 3930. DIREKTIVA OPREDELENIYA DVOJNOGO SLOVA (DD) ------------------------------------------------------------ Assembler dlya IBM PC. Glava 5 108 Direktiva DD opredelyaet elementy, kotorye imeyut dlinu v dva clova (chetyre bajta). CHislovoe vyrazhenie mozhet soderzhat' odnu ili bolee konstant, kazhdaya iz kotoryh imeet maksimum chetyre bajta (vosem' shest. cifr). Naibol'shee polozhitel'noe shest. chislo v chetyreh bajtyh eto 7FFFFFFF; vse "bol'shie" chisla ot 80000000 do FFFFFFFF predstavlyayut otricatel'nye znacheniya. V desyatichnom ischislenii eti predely vyrazhayutsya chislami +2147483647 i -2147483648. V primere na ris. 5.1 pole FLD3DD opredelyaet chislovuyu konstantu. V pole FLD4DD generiruetsya raznica mezhdu dvumya adresami, v dannom sluchae rezul'tatom yavlyaetsya dlina polya FLD2DB. Pole FLD5DD opredelyaet dve chislovye konstanty. Assembler preobrazuet vse chislovye konstanty v direktive DD v shest. predstavlenie, no zapisyvaet ob®ektnyj kod v obratnoj posledovatel'nosti. Takim obrazom desyatichnoe znachenie 12345 preobrazuetsya v shest. 00003039, no zapisyvaetsya v ob®ektnom kode kak 39300000. Simvol'noe vyrazhenie direktivy DD ogranicheno dvumya simvolami. Assembler preobrazuet simvoly i vyravnivaet ih sleva v chetyrehbajtovom dvojnom slove, kak pokazano v pole FLD2DD v ob®ektnom kode. DIREKTIVA OPREDELENIYA UCHETVERENNOGO SLOVA (DQ) ------------------------------------------------------------ Direktiva DQ opredelyaet elementy, imeyushchie dlinu chetyre slova (vosem' bajt). CHislovoe vyrazhenie mozhet soderzhat' odnu ili bolee konstant, kazhdaya iz kotoryh imeet maksimum vosem' bajt ili 16 shest.cifr. Naibol'shee polozhitel'noe shest. chislo - eto semerka i 15 cifr F. Dlya polucheniya predstavleniya o velichine etogo chisla, pokazhem, chto shest. 1 i 15 nulej ekvivalenten sleduyushchemu desyatichnomu chislu: 1152921504606846976 V primere na ris. 5.1 polya FLD2DQ i FLD3DQ illyustriruyut chislovye znacheniya. Assembler preobrazuet vse chislovye kon stanty v direktive DQ v shest. predstavlenie, no zapisyvaet ob®ektnyj kod v obratnoj posledovatel'nosti, kak i v direk- tivah DD i DW. Obrabotka assemblerom simvol'nyh strok v direktive DQ analogichno direktivam DD i DW. DIREKTIVA OPREDELENIYA DESYATI BAJT (DT) ------------------------------------------------------------ Direktiva DT opredelyaet elementy dannyh, imeyushchie dlinu v desyat' bajt. Naznachenie etoj direktivy svyazano s "upakovannymi desyatichnymi" chislovymi velichinami (sm. gl.13). Po direktive DT generiruyutsya razlichnye konstanty, v zavisimosti ot versii assemblera; dlya prakticheskogo primeneniya oznakom'tes' s rukovodstvom po vashemu assemblera. Assembler dlya IBM PC. Glava 5 109 Na ris. 5.1 privedeny primery direktivy DT dlya neopredelennogo elementa i dlya dvuhsimvol'noj konstanty. Programma na ris.5.1 soderzhit tol'ko segment dannyh. Xotya ascembler ne vydaet soobshchenij ob oshibkah, v tablice LINK MAP poyavitsya preduprezhdenie: "Warning: No STACK Segment", a kompanovshchik LINK vydast "There were 1 errors detected" (Obnaruzhena 1 oshibka). Nesmotrya na eto preduprezhdenie mozhno ispol'zovat' otladchik DEBUG dlya prosmotra ob®ektnogo koda, kak pokazano na ris. 5.2. Pravaya storona dampa otchetlivo pokazyvaet simvol'nye dannye, kak, naprimer, "Personal Computer". NEPOSREDSTVENNYE OPERANDY ------------------------------------------------------------ Na ris. 2.1 v glave 2 bylo pokazano ispol'zovanie neposredstvennyh operandov. Komanda MOV AX,0123H peresylaet neposredstvennuyu shest. konstantu 0123 v registr AX. Trehbajtnyj ob®ektnyj kod dlya etoj komandy est' B82301, gde B8 oboznachaet "pereslat' neposredstvennoe znachenie v registr AX", a sleduyushchie dva bajta soderzhat samo znachenie. Mnogie komandy imeyut dva operanda: pervyj mozhet byt' registr ili adres pamyati, a vtoroj - neposredstvennaya konstanta. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 5.2. Damp segmenta dannyh. Ispol'zovanie neposredstvennogo operanda bolee effektiv no, chem opredelenie chislovoj konstanty v segmente dannyh i organizaciya csylki na nee v operande komandy MOV, naprimer, Segment dannyh: AMT1 DW 0123H Segment kodov: MOV AX,AMT1 Dlina neposredstvennyh operandov Dlina neposredstvennoj konstanty zavisit ot dliny pervogo operanda. Naprimer, sleduyushchij neposredstvennyj operand yavlyaetsya dvuhbajtovym, no registr AL imeet tol'ko odin bajt: MOV AL,0123H (oshibka) odnako, esli neposredstvennyj operand koroche, chem poluchayushchij operand, kak v sleduyushchem primere ADD AX,25H (net oshibki) to assembler rasshiryaet neposredstvennyj operand do dvuh bajt, 0025 i zapisyvaet ob®ektnyj kod v vide 2500. Assembler dlya IBM PC. Glava 5 110 Neposredstvennye formaty Neposredstvennaya konstanta mozhet byt' shestnadcatirichnoj, nappimer, 0123H; desyatichnoj, naprimer, 291 (kotoruyu assembler konvertiruet v shest.0123); ili dvoichnoj, naprimer, 100100011V (kotoraya preobrazuetsya v shest. 0123). Nizhe priveden spisok komand, kotorye dopuskayut neposredstvennye operandy: Komandy peresylki i sravneniya: MOV, CMP. Arifmeticheskie komandy: ADC, ADD, SBB, SUB. Komandy sdviga: RCL, RCR, ROL, ROR, SHL, SAR, SHR. Logicheskie komandy: AND, OR, TEST, XOR. Na ris. 5.3 privedeny primery dopustimyh komand s neposredstvennymi operandami. V posleduyushchih glavah budut ob®yasneny komandy arifmeticheskogo perenosa, sdviga i logicheskie komandy. Poskol'ku sejchas dannye primery ne prednaznacheny dlya vypolneniya, v nih opushcheno opredelenie steka i inicializaciya segmentnyh registrov. Dlya sozdaniya elementov, dlinee chem dva bajta, mozhno ispol'zovat' cikl (sm. gl.7) ili strokovye komandy (sm. gl.11). ------------------------------------------------------------ ------------------------------------------------------------ Ris. 5.3. Komandy s neposredstvennymi dannymi. DIREKTIVA EQU ------------------------------------------------------------ Direktiva EQU ne opredelyaet element dannyh, no opredelyaet znachenie, kotoroe mozhet byt' ispol'zovano dlya postanovki v drugih komandah. Predpolozhim, chto v segmente dannyh zakodirovana sleduyushchaya direktiva EQU: TIMES EQU 10 Imya, v dannom sluchae TIMES, mozhet byt' predstavleno lyubym dopustimym v assemblere imenem. Teper', v kakoj-by komande ili direktive ne ispol'zovalos' slovo TIMES assembler podstavit znachenie 10. Naprimer, assembler preobrazuet direktivu FIELDA DB TIMES DUP (?) v FIELDA DB 10 DUP (?) Imya, svyazannoe s nekotorym znacheniem s pomoshch'yu direktivy EQU, mozhet ispol'zovat'sya v komandah, naprimer: COUNTR EQU 05 Assembler dlya IBM PC. Glava 5 111 ... MOV CX,COUNTR Assembler zamenyaet imya COUNTR v komande MOV na znachenie 05, cozdavaya operand s neposredstvennym znacheniem, kak esli by bylo zakodirovano MOV CX,05 ;Assembler podstavlyaet 05 Zdes' priemushchestvo direktivy EQU zaklyuchaetsya v tom, chto mnogie komandy mogut ispol'zovat' znachenie, opredelennoe po imeni COUNTR. Esli eto znachenie dolzhno byt' izmeneno, to izmeneniyu podlezhit lish' odna direktiva EQU. Estestvenno, chto ispol'zovanie direktivy EQU razumno lish' tam, gde podstanovka imeet smysl dlya assemblera. V direktive EQU mozhno ispol'zovat' simvolicheskie imena: 1. TP EQU TOTALPAY 2. MPY EQU MUL Pervyj primer predpolagaet, chto v segmente dannyh programmy oppedeleno imya TOTALPAY. Dlya lyuboj komandy, soderzhashchej operand TP, assembler zamenit ego na adres TOTALPAY. Vtoroj primer pokazyvaet vozmozhnost' ispol'zovaniya v programme slova MPY vmesto obychnogo mnemokoda MUL. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® Imena elementov dannyh v programme dolzhny byt' unikal' ny i po vozmozhnosti naglyadny. Naprimer, element dlya zarplaty sluzhashchego mozhet imet' imya EMPWAGE. ® Dlya opredeleniya simvol'nyh strok ispol'zujte direktivu DB, tak kak ee format dopuskaet stroki dlinnee dvuh bajt i formiruet ih v normal'noj posledovatel'nosti (sleva-napravo). ® Bud'te vnimatel'ny pri ukazanii desyatichnyh i shest. znachenij. Sravnite, naprimer, slozhenie soderzhimogo registra AX s desyatichnym 25 i s shest. 25: ADD AX,25 ;Pribavit' 25 ADD AX,25H ;Pribavit' 37 ® Pomnite, chto direktivy DW, DD i DQ zapisyvayut chislovoe znachenie v ob®ektnom kode v obratnoj posledovatel'nosti bajt. Assembler dlya IBM PC. Glava 5 112 ® Ispol'zujte elementy DB dlya operacij s poluregistrami (AL, AH, BL i t.d.) i DW dlya operacij s polnymi registrami (AX, BX, CX i t.d.). CHislovye elementy, opredelennye direktivami DD i DQ imeyut special'noe primenenie. ® Sledite za sootvetstviem neposredstvennyh operandov razmeru registra: odnobajtovaya konstanta - odnobajtovyj registr (AL, BH), dvuhbajtovaya konstanta - polnyj registr (AX, BX). VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 5.1. Kakova dlina v bajtah dlya elementov dannyh, opredelen nyh direktivami: a) DW, b) DD, v) DT, g) DB, d) DQ? 5.2. Opredelite simvol'nuyu stroku po imeni TITLE1, soderzhashchuyu konstantu RGB Electronics. 5.3. Opredelite sleduyushchie chislovye znacheniya v elementah dannyh s imenami ot FLDA do FLDE: a) chetyrehbajtovyj element, soderzhashchtj shest. ekvivalent desyatichnogo chisla 115; b) odnobajtovyj element, soderzhashchij shest. ekvivalent desyatichnogo chisla 25; c) dvuhbajtovyj element, soderzhashchij neopredelennoe znachenie; d) odnobajtovyj element, soderzhashchij dvoichnoj ekvivalent desyatichnogo chisla 25; e) direktivu DW, soderzhashchuyu posledovatel'nye znacheniya 16, 19, 20, 27, 30. 5.4. Pokazhite sgenerirovannyj shest. ob®ektnyj kod dlya a) DB '26' i b) DB 26. 5.5. Opredelite assemblernyj shest. ob®ektnyj kod dlya a) DB 26H, b) DW 2645H, v) DD 25733AH, g) DQ 25733AH. 5.6. Zakodirujte sleduyushchie komandy s neposredstvennymi operandami: a) zagruzit' 320 v registr AX; b) sravnit' pole FLDB s nulem; v) pribavit' shest. 40 k soderzhimomu registra BX; g) vychest' shest. 40 iz registra CX; d) sdvinut' soderzhimoe polya FLDB na odin bit vlevo; e) sdvinut' soderzhimoe registra CH na odin bit vpravo. 5.7. Vvedite i assemblirujte elementy dannyh i komandy iz voprosov 5.2, 5.3 i 5.6. Stek dlya etogo uprazhneniya ne trebuetsya. Takzhe ne sleduet vypolnyat' kompanovku. Dlya proverki assemblirovannogo koda ispol'zujte otladchik DEBUG. Raspechatajte LST-fajl (listing), esli v rezul'ta Assembler dlya IBM PC. Glava 5 113 te assemblirovaniya ne budet soobshchenij ob oshibkah. Ne zabudte komandu MODE LPT1:132,6 dlya ustanovki shiriny pechati. Assembler dlya IBM PC. Glava 6 123 GLAVA 6. Programmy v COM-fajlah ------------------------------------------------------------ Programmy v COM-fajlah Cel': Ob®yasnit' naznachenie i ispol'zovanie COM-fajlov i perevod assemblernyh programm v format COM-fajlov. VVEDENIE ------------------------------------------------------------ Do sih por vy pisali, assemblirovali i vypolnyali program my v EXE-formate. Kompanovshchik LINK avtomaticheski generiruet osobyj format dlya EXE-fajlov, v kotorom prisutstvuet special'nyj nachal'nyj blok (zagolovok) pazmerom ne menee 512 bajt. (V glave 22 rassmatrivaetsya soderzhimoe nachal'nyh blokov). Dlya vypolneniya mozhno takzhe sozdavat' COM-fajly. Primerom chasto ispol'zuemogo COM-fajla yavlyaetsya COMMAND.COM. Program ma EXE2BIN.COM v operativnoj sisteme DOS preobrazuet EXE- fajly v COM-fajly. Fakticheski eta programma sozdaet BIN (dvoichnyj) fajl, poetomu ona i nazyvaetsya "preobrazovatel' EXE v Vin (EXE-to-BIN)". Vyhodnoj Vin-fajl mozhno pereimeno vat' v COM-fajl. RAZLICHIYA MEZHDU PROGRAMMAMI V EXE i COM-fajlah ------------------------------------------------------------ Nesmotrya na to, chto EXE2BIN preobrazuet EXE-fajl v COM-fajl, cushchestvuyut opredelennye razlichiya mezhdu programmoj, vypolnyaemoj kak EXE-fajl i progr