eniya - direktiva MEND. Zatem v lyubom meste programmy, gde neobhodimo vypolnenie opredelennyh v makroko mande komand, dostatochno zakodirovat' imya makrosa. V rezul' tate assembler sgeneriruet neobhodimye komandy. Ispol'zovanie makrokomand pozvolyaet: - uprostit' i sokratit' ishodnyj tekst programmy; - sdelat' programmu bolee ponyatnoj; - umen'shit' chislo vozmozhnyh oshibok kodirovaniya. Primerami makrokomand mogut byt' operacii vvoda-vyvoda, svyazannye s inicializaciej registrov i vypolneniya preryvanij preobrazovaniya ASCII i dvoichnogo formatov dannyh, arifmeti cheskie operacii nad dlinnymi polyami, obrabotka strokovyh dannyh, delenie s pomoshch'yu vychitaniya. V dannoj glave rassmotreny osobennosti makrosredstv, vklyuchaya te, kotorye ne dostatochno yasno dany v rukovodstve po assembleru. Tem ne menee poyasneniya dlya nekotoryh maloispol' zuemyh operacij sleduet iskat' v rukovodstve po assebleru. PROSTOE MAKROOPREDELENIE ------------------------------------------------------------ Makroopredelenie dolzhno nahodit'sya do opredeleniya segmenta. Rassmotrim primer prostogo makroopredeleniya po imeni INIT1, kotoroe inicializiruet segmentnye registry dlya EXE-programmy: INIT1 MACRO ;Nachalo ASSUME CS:CSEG,DS:DSEG,SS:STACK;ES:DSEG ; \ PUSH DS ; \ Assembler dlya IBM PC. Glava 20 19 SUB AX,AX ; \ PUSH AX ;Telo \ MOV AX,DSEG ;makro/ MOV DS,AX ; / MOV ES,AX ; / ENDM ;Konec Direktiva MACRO ukazyvaet assembleru, chto sleduyushchie komandy do direktivy ENDM yavlyayutsya chast'yu makroopredeleniya. Imya makkrokomandy - INIT1, hotya zdes' vozmozhny drugie pravil'nye unikal'nye assemblernye imena. Direktiva ENDM zavershaet makroopredelenie. Sem' komand mezhdu direktivami MACRO i ENDM sostavlyayut telo makroopredeleniya. Imena, na kotorye imeyutsya ssylki v makroopredelenii, CSEG, DSEG i STACK dolzhny byt' opredeleny gde-nibud' v drugom meste programmy. Makrokomanda INIT1 mozhet ispol'zo vat'sya v kodovom segmente tam, gde neobhodimo inicializiro vat' registry. Kogda assembler analiziruet komandu INIT1, on snachala prosmatrivaet tablicu mnemokodov i, ne obnaruzhiv tam sootvetstvuyushchego elementa, proveryaet makrokomandy. Tak kak programma soderzhit opredelenie makrokomandy INIT1 assem bler podstavlyaet telo makroopredeleniya, generiruya neobhodi mye komandy - makrorasshirenie. Programma ispol'zuet rassmatrivaemuyu makrokomandu tol'ko odin raz, hotya imeyutsya drugie makrokomandy, prednaznachennye na lyuboe chislo primenenij i dlya takih makrokomand assembler generiruet odinakovye makrorasshireniya. Na ris.20.1 pokazana assemblirovannaya programma. V listin ge makrorasshireniya kazhdaya komanda, pomechennaya sleva znakom plyus (+), yavlyaetsya rezul'tatom generacii makrokomandy. Krome togo, v makrorasshirenii otsutstvuet direktiva ASSUME, tak kak ona ne generiruet ob®ektnyj kod. V posleduyushchem razdele "Vklyuchenie iz biblioteki makro opredelenij pokazana vozmozhnost' katalogizacii makrokomand v biblioteke i avtomaticheskoe vklyuchenie ih v lyubye programmy. ------------------------------------------------------------ ------------------------------------------------------------ Ris.20.1. Primer assemblirovaniya makrokomandy. ISPOLXZOVANIE PARAMETROV V MAKROKOMANDAH ------------------------------------------------------------ V predydushchem makroopredelenii trebovalis' fiksirovannye imena segmentov: CSEG, DSEG i STACK. Dlya togo, chtoby makro komanda byla bolee gibkoj i mogla prinimat' lyubye imena segmentov, opredelim eti imena, kak formal'nye parametry: INIT2 MACRO CSNAME,DSNAME,SSNAME ;Formal'nye parametry ASSUME CS:CSNAME,DS:DSNAME,SC:SSNAME,ES:DSNAME PUSH DS SUB AX,AX PUSH AX Assembler dlya IBM PC. Glava 20 20 MOV AX,DSNAME MOV DS,AX MOV ES,AX ENDM ;Konec makroopredeleniya Formal'nye parametry v makroopredelenii ukazyvayut assembleru na sootvetstvie ih imen lyubym analogichnym imenam v tele makroopredeleniya. Vse tri formal'nyh parametra CSNAME, DSNAME i SSNAME vstrechayutsya v direktive ASSUME, a parametr DSNAME eshche i v posleduyushchej komande MOV. Formal'nye parametry mogut imet' lyubye pravil'nye assemblernye imena, ne obyazatel'no sovpadayushchimi imenami v segmente dannyh. Teper' pri ispol'zovanii makrokomandy INIT2 neobhodimo ukazat' v kachestve parametrov dejstvitel'nye imena treh segmentov v sootvetstvuyushchej posledovatel'nosti. Naprimer, sleduyushchaya makrokomanda soderzhit tri parametra, kotorye sootvetstvuyut formal'nym parametram v ishodnom makrooprede lenii: Makroopredelenie: INIT2 MACRO CSNAME,DSNAME,SSNAME (formal'nye parametry) Makrokomanda: | | | INIT2 CSEG,DSEG,STACK (parametry) Tak kak assembler uzhe opredelil sootvetstvie mezhdu formal'ny mi parametrami i operatorami v makroopredelenii, to teper' emu ostaetsya podstavit' parametry makrokomandy v makrorasshi renii: - Parametr 1: CSEG stavitsya v sootvetstvie s CSNAME v makroopredelenii. Assembler podstavlyaet CSEG vmesto CSNAME v direktive ASSUME. - Parametr 2: DSEG stavitsya v sootvetstvie s DSNAME v makroopredelenii. Assembler podstavlyaet DSEG vmesto dvuh DSNAME: v direktive ASSUME i v komande MOV. - Parametr 3: STACK stavitsya v sootvetstvie s SSNAME v makroopredelenii. Assembler podstavlyaet STACK vmesto SSNAME v direktive ASSUME. Makroopredelenie s formal'nymi parametrami i sootvetstvuyu shchee makrorasshirenie privedeny na ris.20.2. ------------------------------------------------------------ ------------------------------------------------------------ Ris.20.2. Ispol'zovanie parametrov v makrokomandah. Formal'nyj parametr mozhet imet' lyuboe pravil'noe assemblernoe imya (vklyuchaya imya registra, naprimer, CX), kotoroe v processe assemblirovaniya budet zameneno na parametr makrokomandy. Otsyuda sleduet, chto assembler ne raspoznaet registrovye imena i imena, opredelennye v oblasti Assembler dlya IBM PC. Glava 20 21 dannyh, kak takovye. V odnoj makrokomande mozhet byt' opredeleno lyuboe chislo formal'nyh paramterov, razdelennyh zapyatymi, vplot' do 120 kolonki v stroke. KOMMENTARII ------------------------------------------------------------ Dlya poyasnenij naznacheniya makroopredeleniya v nem mogut nahodit'sya kommentarii. Direktiva COMMENT ili simvol tochka s zapyatoj ukazyvayut na stroku kommentariya, kak eto pokazano v sleduyushchem makroopredelenii PROMPT: PROMPT MACRO MESSGE ; |ta makrokomanda vyvodit soobshcheniya na ekran MOV AH,09H LEA DX,MESSGE INT 21H ENDM Tak kak po umolchaniyu v listing popadayut tol'ko komandy generiruyushchie ob®ektnyj kod, to assembler ne budet avtomati cheski vydavat' i kommentarii, imeyushchiesya v makroopredelenii. Esli neobhodimo, chtoby v rasshirenii poyavlyalis' kommentarii, sleduet ispol'zovat' pered makrokomandoj direktivu .LALL ("list all" - vyvodit' vse), kotoraya kodiruetsya vmeste s lidiruyushchej tochkoj: .LALL PROMPT MESSAG1 Makroopredelenie mozhet soderzhat' neskol'ko kommentariev, prichem nekotorye iz nih mogut vydavat'sya v listinge, a drugie - net. V pervom sluchae neobhodimo ispol'zovat' direktivu .LALL. Vo vtorom - kodirovat' pered kommentariem dva simvola tochka s zapyatoj (;;) - priznak podavleniya vyvoda kommentariya v listing. Po umolchaniyu v assemblere dejstvuet direktiva .XALL, kotoraya vyvodit v listing tol'ko komandy, generiruyushchie ob®ektnyj kod. I, nakonec, mozhno zapretit' poyavlenie v listinge assemblernogo koda v makrorasshireniyah, osobenno pri ispol'zovanii makrokomandy v odnoj programme neskol'ko raz. Dlya etogo sluzhit direktiva .SALL ("suppress all" - podavit' ves' vyvod), kotoraya umen'shaet razmer vyvodimogo listinga, no ne okazyvaet nikakogo vliyaniya na razmer ob®ektnogo modulya. Direktivy upravleniya listinkom .LALL, .XALL, .SALL sohranyayut svoe dejstvie po vsemu tekstu programmy, poka drugaya direktiva listinga ne izmenit ego. |ti direktivy mozhno razmeshchat' v programme tak, chtoby v odnih makrokomandah raspechatyvalis' kommentarii, v drugih - makrorasshireniya, a v tret'ih podavlyalsya vyvod v listing. Programma na ris.20.3 demonstriruet opisannoe vyshe svojstvo direktiv listinga. V programme opredleleno dva makroopredeleniya INIT2 i PROMPT, rasmotrennye ranee. Kodovyj segment soderzhit direktivu .SALL dlya podavleniya raspechatki Assembler dlya IBM PC. Glava 20 22 INIT2 i pervogo rasshireniya PROMPT. Dlya vtorogo rasshireniya PROMPT direktiva .LALL ukazyvaet assembleru na vyvod v listing kommentariya i makrorasshireniya. Zametim, odnako, chto kommentarij, otmechennyj dvumya simvolami tochka s zapyatoj (;;) v makroopredelenii PROMPT, ne raspechatyvaetsya v makrorasshire niyah nezavisimo ot dejstviya direktiv upravleniya listingom. ------------------------------------------------------------ ------------------------------------------------------------ Ris.20.3. Raspechatka i podavlenie makrorasshirenij v listinge. ISPOLXZOVANIE MAKROKOMAND V MAKROOPREDELENIYAH ------------------------------------------------------------ Makroopredelenie mozhet soderzhat' ssylku na drugoe makroopredelenie. Rassmotrim prostoe makroopredelenie DOS21, kotoroe zanosit v registr AH nomer funkcii DOS i vypolnyaet INT 21H: DOS21 MACRO DOSFUNC MOV AH,DOSFUNC INT 21H ENDM Dlya ispol'zovaniya dannoj makrokomandy pri vvode s klaviatury neobhodimo zakodirovat': LEA DX,NAMEPAR DOS21 0AH Predpolozhim, chto imeetsya drugoe makroopredelenie, ispol'zuyu shchee funkciyu 02 v registre AH dlya vyvoda simvola: DISP MACRO CHAR MOV AH,02 MOV DL,CHAR INT 21H ENDM Dlya vyvoda na ekran, naprimer, zvezdochki dostatochno zakodiro vat' makrokomandu DISP '*'. Mozhno izmenit' makroopredelenie DISP, vospol'zovshis' makrokomandoj DOC21: DISP MACRO CHAR MOV DL,CHAR DOS21 02 ENDM Teper', esli zakodirovat' makrokomandu DISP v vide DISP '*', to assembler sgeneriruet sleduyushchie komandy: MOV DL,'*' Assembler dlya IBM PC. Glava 20 23 MOV AH,02 INT 21H DIREKTIVA LOCAL ------------------------------------------------------------ V nekotoryh makrokomandah trebuetsya opredelyat' elementy dannyh ili metki komand. Pri ispol'zovanii takoj makrokomandy v programme bolee odnogo raza proishodit takzhe neodnokratnoe opredelenie odinakovyh polej dannyh ili metok. V rezul'tate assembler vydast soobshcheniya ob oshibke iz-za dublirovaniya imen. Dlya obespecheniya unikal'nosti generiruemyh v kazhdom makrorasshirenii imen ispol'zuetsya direktiva LOCAL, kotoraya kodiruetsya neposredstvenno posle direktivy MACRO, dazhe pered kommentariyami. Obshchij format imeet sleduyushchij vid: LOCAL dummy-1,dummy-2,... ;Formal'nye parametry Ris.20.4. illyustriruet ispol'zovanie direktivy LOCAL. V privedennoj na etom risunke programme vypolnyaetsya delenie vychitaniem; delitel' vychitaetsya iz delimogo i chastnoe uvelichivaetsya na 1 do teh por, poka delimoe bol'she delitelya. Dlya dannogo algoritma neobhodimy dve metki: COMP - adres cikla, OUT - adres vyhoda iz cikla po zaversheniyu. Obe metki COMP i OUT opredeleny kak LOCAL i mogut imet' lyubye pravil'nye assemblernye imena. V makrorasshirenii dlya COMP generiruetsya metka ??0000, a dlya OUT - ??0001. Esli makrokomanda DIVIDE budet ispol'zova na v etoj programme eshche odin raz, to v sleduyushchem makrorasshi renii budut sgenerirovany metki ??0002 i ??0003 sootvetstven no. Takim obrazom, s pomoshch'yu direktivy LOCAL obespechivaetsya unikal'nost' metok v makrorasshireniyah v odnoj programme. ------------------------------------------------------------ ------------------------------------------------------------ Ris.20.4. Ispol'zovanie direktivy LOCAL. ISPOLXZOVANIE BIBLIOTEK MAKROOPREDELENIJ ------------------------------------------------------------ Opredelenie takih makrokomand, kak INIT1 i INIT2 i odnorazovoe ih ispol'zovanie v programme kazhetsya bessmyslennym. Luchshim podhodom zdes' yavlyaetsya katalogizaciya sobstvennyh makrokomand v biblioteke na magnitnom diske, ispol'zuya lyuboe opisatel'noe imya, naprimer, MACRO.LIB: INIT MACRO CSNAME,DSNAME,SSNAME . . ENDM PROMPT MACRO MESSGE . . Assembler dlya IBM PC. Glava 20 24 ENDM Teper' dlya ispol'zovaniya lyuboj iz katalogizirovannyh makrokomand vmesto MACRO opredeleniya v nachale programmy sleduet primenyat' direktivu INCLUDE: INCLUDE C:MACRO.LIB . . INIT CSEG,DATA,STACK V etom sluchae assembler obrashchaetsya k fajlu MACRO.LIB (v nashem primere) na diskovode C i vklyuchaet v programmu oba makroopredeleniya INIT i PROMPT. Hotya v nashem primere trebuetsya tol'ko INIT. Assemblernyj listing budet soderzhat' kopiyu makroopredeleniya, otmechennogo simvolom C v 30 kolonke LST-fajla. Sledom za makrokomandoj idet ee rasshirenie s ob®ektnym kodom i s simvolom plyus (+) v 31 kolonke. Tak kak translyator s assemblera yavlyaetsya dvuhprohodovym, to dlya obespecheniya obrabotki direktivy INCLUDE tol'ko v pervom prohode (a ne v oboih) mozhno ispol'zovat' sleduyushchuyu konstrukciyu: IF1 INCLUDE C:MACRO.LIB ENDIF IF1 i ENDIF yavlyayutsya uslovnymi direktivami. Direktiva IF1 ukazyvaet assembleru na neobhodimost' dostupa k biblioteke tol'ko v pervom prohode translyacii. Direktiva ENDIF zaversha et IF-logiku. Takim obrazom, kopiya makroopredelenij ne poyavitsya v listinge - budet sekonomleno i vremya i pamyat'. Programma na ris.20.5 soderzhit rassmotrennye vyshe direkti vy IF1, INCLUDE i ENDIF, hotya v LST-fajl assembler vyvodit tol'ko direktivu ENDIF. Obe makrokomandy v kodovom segmente INIT i PROMPT zakatalogizirovany v fajle MACRO.LIB, t.e. prosto zapisany drug za drugom na diskovyj fajl po imeni MACRO.LIB s pomoshch'yu tekstovogo redaktora. Raspolozhenie direktivy INCLUDE ne kritichno, no ona dolzhna poyavit'sya ranee lyuboj makrokomandy iz vklyuchaemoj biblioteki. ------------------------------------------------------------ ------------------------------------------------------------ Ris.20.5. Ispol'zovanie biblioteki makroopredelenij. Direktiva ochistki Direktiva INCLUDE ukazyvaet assembleru na vklyuchenie vseh makroopredelenij iz specificirovannoj biblioteki. Naprimer, biblioteka soderzhit makrosy INIT, PROMPT i DIVIDE, hotya Assembler dlya IBM PC. Glava 20 25 programme trebuetsya tol'ko INIT. Direktiva PURGE pozvolyaet "udalit'" nezhelatel'nye makrosy PROMPT i DIVIDE v tekushchem assemblirovanii: IF1 INCLUDE MACRO.LIB ;Vklyuchit' vsyu biblioteku ENDIF PURGE PROMRT,DIYIDE ;Udalit' nenuzhnye makrosy ... INIT CSEG,DATA,STACK ;Ispol'zovanie ostavshejsya ; makrokomandy Direktiva PURGE dejstvuet tol'ko v processe assemblirova niya i ne okazyvaet nikakogo vliyaniya na makrokomandy, nahodyashchiesya v biblioteke. KONKATENACIYA (&) ------------------------------------------------------------ Simvol ampersand (&) ukazyvaet assembleru na sceplenie (konkatenaciyu) teksta ili simvolov. Sleduyushchaya makrokomanda MOVE generiruet komandu MOVSB ili MOVSW: MOVE MACRO TAG REP MOVS&TAG ENDM Teper' mozhno kodirovat' makrokomandu v vide MOVE B ili MOVE W. V rezul'tate makrorasshireniya assembler scepit parametr s komandoj MOVS i poluchit REP MOVSB ili REP MOVSW. Dannyj primer ves'ma trivialen i sluzhit lish' dlya illyustracii. DIREKTIVY POVTORENIYA: REPT, IRP, IRPC ------------------------------------------------------------ Direktivy povtoreniya zastavlyayut assembler povtorit' blok operatorov, zavershaemyh direktivoj ENDM. |ti direktivy ne obyazatel'no dolzhny nahoditsya v makroopredelenii, no esli oni tam nahodyatsya, to odna direktiva ENDM trebuetsya dlya zaversheniya povtoryayushchegosya bloka, a vtoraya ENDM - dlya zaversheniya makroopredeleniya. REPT: Povtorenie Operaciya REPT privodit k povtoreniyu bloka operatorov do direktivy ENDM v sootvetstvii s chislom povtorenij, ukazannym v vyrazhenii: REPT vyrazhenie V sleduyushchem primere proishodit nachal'naya inicializaciya znacheniya N=0 i zatem povtoryaetsya generaciya DB N pyat' raz: N = 0 Assembler dlya IBM PC. Glava 20 26 REPT 5 N = N + 1 DB N ENDM V rezul'tate budut sgenerirovany pyat' operatorov DB ot DB 1 do DB 5. Direktiva REPT mozhet ispol'zovat'sya takim obrazom dlya opredeleniya tablicy ili chasti tablicy. Drugim primerom mozhet sluzhit' generaciya pyati komand MOVSB, chto ekvivalentno REP MOVSB pri soderzhimom CX ravnom 05: REPT 5 MOVSB ENDM IRP: Neopredelennoe povtorenie Operaciya IRP privodit k povtoreniyu bloka komand do direktivy ENDM. Osnovnoj format: IRP dummy,<arguments> Argumenty, soderzhashchiesya v uglovyh skobkah, predstavlyayut soboj lyuboe chislo pravil'nyh simvolov, strok, chislovyh ili arifmeticheskih konstant. Assembler generiruet blok koda dlya kazhdogo argumenta. V sleduyushchem primere assembler generiruet DB 3, DB 9, DB 17, DB 25 i DB 28: IRP N,<3, 9, 17, 25, 28> DB N ENDM IRPC: Neopredelennoe povtorenie simvola Operaciya IRPC privodit k povtoreniyu bloka operatorov do direktivy ENDM. Osnovnoj format: IRPC dummy,string Assembler generiruet blok koda dlya kazhdogo simvola v stroke "string". V sleduyushchem primere assembler generiruet DW 3, DW 4 ... DW 8: IRPC N,345678 DW N ENDM USLOVNYE DIREKTIVY ------------------------------------------------------------ Assembler podderzhivaet ryad uslovnyh direktiv. Ranee nam uzhe prihodilos' ispol'zovat' direktivu IF1 dlya vklyucheniya biblioteki tol'ko v pervom prohode assemblirovaniya. Uslovnye Assembler dlya IBM PC. Glava 20 27 direktivy naibolee polezny vnutri makroopredelenij, no ne ogranicheny tol'ko etim primeneniem. Kazhdaya direktiva IF dolzhna imet' sparennuyu s nej direktivu ENDIF dlya zaversheniya IF-logiki i vozmozhnuyu direktivu ELSE dlya al'ternativnogo dejstviya: IFxx (uslovie) . } . } Uslovnyj ELSE (ne obyazatel'noe dejstvie) } . } blok . } ENDIF (konec IF-logiki) Otsutstvie direktivy ENDIF vyzyvaet soobshchenie oboshibke: "Undeterminated conditional" (nezavershennyj uslovnyj blok). Esli proveryaemoe uslovie istino, to assembler vypolnyaet uslovnyj blok do direktivy ELSE ili pri otsutstvii ELSE - do direktivy ENDIF. Esli uslovie lozhno, to assembler vypolnyaet uslovnyj blok posle direktivy ELSE, a pri otsutstvii ELSE voobshche obhodit uslovnyj blok. Nizhe perechisleny razlichnye uslovnye direktivy: IF vyrazhenie Esli vyrazhenie ne ravno nulyu, assembler obrabatyvaet operatory v uslovnom bloke. IFE vyrazhenie Esli vyrazhenie ravno nulyu, assembler obrabatyvaet operatory v uslovnom bloke. IF1 (net vyrazheniya) Esli osushchestvlyaetsya pervyj prohod assemblirovaniya, to obrabatyvayutsya operatory v uslovnom bloke. IF2 (net vyrazheniya) Esli osushchestvlyaetsya vtoroj prohod assemblirovaniya, to obrabatyvayutsya operatory v uslovnom bloke. IFDEF identifikator Esli identifikator opredelen v programme ili ob®yavlen kak EXTRN, to assembler obrabatyvaet operatory v uslovnom bloke. IFNDEF identifikator Esli identifikator ne opredelen v programme ili ne ob®yavlen kak EXTRN, to assembler obrabatyvaet operatory v uslovnom bloke. IFB <argument> Esli argumentom yavlyaetsya probel, assembler obrabatyvaet operatory v uslovnom bloke. Argument dolzhen byt' v uglovyh skobkah. IFNB <argument> Esli argumentom yavlyaetsya ne probel, to assembler obrabatyvaet operatory v uslovnom bloke. Argument dolzhen byt' v uglovyh skobkah. Assembler dlya IBM PC. Glava 20 28 IFIDN <arg-1>,<arg-2> Esli stroka pervogo argumenta identichna stroke vtorogo argumenta, to assembler obrabatyvaet operatory v uslovnom bloke. Argumenty dolzhny byt' v uglovyh skobkah. IFDIF<arg-1>,<arg-2> Esli stroka pervogo argumenta otlichaetsya ot stroki vtorogo argumenta, to assembler obrabatyvaet operatory v uslovnom bloke. Argumenty dolzhny byt' v uglovyh skobkah. Nizhe priveden prostoj primer direktivy IFNB (esli ne probel). Dlya DOS INT 21H vse zaprosy trebuyut zaneseniya nomera funkcii v registr AH, v to vremya kak lish' nekotorye iz nih ispol'zuyut znachenie v registre DX. Sleduyushchee makroopredelenie uchityvaet etu osobennost': DOS21 MACRO DOSFUNC,DXADDRES MOV AN,DOSFUNC IFNB <DXADDRES> MOV DX,OFFSET DXADDRES ENDIF INT 21H ENDM Ispol'zovanie DOS21 dlya prostogo vvoda s klaviatury trebuet ustanovki znacheniya 01 v registr AH: DOS21 01 Assembler generiruet v rezul'tate komandy MOV AH,01 i INT 21H. Dlya vvoda simvol'noj stroki trebuetsya zanesti v registr AH znachenie 0AH, a v registr DX - adres oblasti vvoda: DOS21 0AH,IPFIELD Assembler generiruet v rezul'tate obe komandy MOV i INT 21H. DIREKTIVA VYHODA IZ MAKROSA EXITM. ------------------------------------------------------------ Makroopredelenie mozhet soderzhat' uslovnye derektivy, kotorye proveryayut vazhnye usloviya. Esli uslovie istinno, to assembler dolzhen prekratit' dal'nejshee makrorasshirenie. Dlya etoj celi sluzhit direktiva EXITM: IFxx [uslovie] . . (nepravil'noe uslovie) . EXITM . . Assembler dlya IBM PC. Glava 20 29 ENDIF Kak tol'ko assembler popadaet v processe generacii makro rasshireniya na direktivu EXITM, dal'nejshoe rasshirenie prekrashchaetsya i obrabotka prodolzhaetsya posle direktivy ENDM. Mozhno ispol'zovat' EXITM dlya prekrashcheniya povtorenij po direktivam REPT, IRP i IRPC dazhe esli oni nahodyatsya vnutri makroopredeleniya. MAKROKOMANDY, ISPOLXZUYUSHCHIE IF I IFNDEF USLOVIYA ------------------------------------------------------------ Programma na ris.20.6 soderzhit makroopredelenie DIVIDE, kotoraya generiruet podprogrammu dlya vypolneniya deleniya vychitaniem. Makrokomanda dolzhna kodirovat'sya s parametrami v sleduyushchej posledovatel'nosti: delimoe, delitel', chastnoe. Makrokomanda soderzhit direktivu IFNDEF dlya proverki nalichiya parametrov. Dlya lyubogo neopredelennogo elementa makrokomanda uvelichivaet schetchik CNTR. |tot schetchik mozhet imet' lyuboe korrektnoe imya i prednaznachen dlya vremennogo ispol'zovaniya v makroopredelenii. Posle proverki vseh treh parametrov, makrokomanda proveryaet CNTR: IF CNTR ; Makrorasshirenie prekrashcheno EXITM Esli schetchik CNTR soderzhit nenulevoe znachenie, to assembler generiruet kommentarij i prekrashchaet po direktive EXITM dal'nejshee makrorasshirenie. Zametim, chto nachal'naya komanda ustanavlivaet v schetchike CNTR nulevoe znachenie i, krome togo, bloki IFNDEF mogut ustanavlivat' v CNTR edinichnoe znachenie, a ne uvelichivat' ego na 1. Esli assembler uspeshno prohodit vse proverki, to on generiruet makrorasshirenie. V kodovom segmente pervaya makrokomanda DIVIDE soderzhit pravil'nye delimoe i chastnoe i, poetomu generiruet tol'ko kommentarii. Odin iz sposobov uluchsheniya rassmatrivaemoj makrokomandy - obespechit' proverku na nenulevoj delitel' i na odinakovyj znak delimogo i delitelya; dlya etih celej luchshe ispol'zovat' kody assemblera, chem uslovnye direktivy. ------------------------------------------------------------ ------------------------------------------------------------ Ris.20.6. Ispol'zovanie direktiv IF i IFNDEF. MAKROS, ISPOLXZUYUSHCHIJ IFIDN-USLOVIE ------------------------------------------------------------ Assembler dlya IBM PC. Glava 20 30 Programma na ris.20.7 soderzhit makroopredelenie po imeni MOVIF, kotoraya generiruet komandy MOVSB ili MOVSW v zavisimosti ot ukazannogo parametra. Makrokomandu mozhno kodirovat' s parametrom B (dlya bajta) ili W (dlya slova) dlya generacii komand MOVSB ili MOVSW iz MOVS. Obratite vnimanie na pervye dva operatora v makroopredele nii: MOVIF MACRO TAG IFIDN <&TAG>,<B> Uslovnaya direktiva IFIDN sravnivaet zadannyj parametr (predpolozhitel'no B ili W) so strokoj B. Esli znacheniya identichny, to assembler generiruet REP MOVSB. Obychnoe ispol'zovanie ampersanda (&) - dlya konkatenacii, no v dannom primere operand <TAG> bez ampersanda ne budet rabotat'. Esli v makrokomande ne budet ukazan parametr B ili W, to assembler sgeneriruet preduprezhdayushchij kommentarij i komandu MOVSB (po umolchaniyu). Primery v kodovom segmente trizhdy proveryayut makrokomandu MOVIF: dlya parametra B, dlya parametra W i dlya nepravil'nogo parametra. Ne sleduet delat' popytok vypolneniya dannoj programmy v tom vide, kak ona privedena na risunke, tak kak registry CX i DX ne obespecheny pravil'nymi znacheniyami. Predpolagaetsya, chto rassmatrivaemaya makrokomanda ne yavlyaetsya ochen' poleznoj i ee naznachenie zdes' - proillyustri rovat' uslovnye direktivy v prostoj forme. K dannomu momentu, odnako, vy imeete dostatochno informacii dlya sostavleniya bol'shih poleznyh makroopredelenij. ------------------------------------------------------------ ------------------------------------------------------------ Ris.20.7. Ispol'zovanie direktivy IFIDN OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® Makrosredstva vozmozhny tol'ko dlya polnoj versii assemblera (MASM). ® Ispol'zovanie makrokomand v programmah na assemblere daet v rezul'tate bolee udobochitaemye programmy i bolee proiz voditel'nyj kod. ® Makroopredelenie sostoit iz direktivy MACRO, bloka iz odnogo ili neskol'kih operatorov, kotorye generiruyutsya pri makrorasshireniyah i direktivy ENDM dlya zaversheniya opredeleniya. ® Kod, kotoryj generiruetsya v programme po makrokomande, predstavlyaet soboj makrorasshirenie. ® Direktivy .SALL,.LALL i .XALL pozvolyayut upravlyat' raspechatkoj kommentariev i generiruemogo ob®ektnogo koda v makrorasshirenii. ® Direktiva LOCAL pozvolyaet ispol'zovat' imena vnutri makroopredelenij. Direktiva LOCAL kodiruetsya neposredstvenno posle direktivy MACRO. Assembler dlya IBM PC. Glava 20 31 ® Ispol'zovanie formal'nyh parametrov v makroopredelenii pozvolyaet kodirovat' parametry, obespechivayushchie bol'shuyu gibkost' makrosredstv. ® Biblioteka makroopredelenij daet vozmozhnost' ispol'zo vat' makrokomandy dlya razlichnyh assemblernyh programm. ® Uslovnye direktivy pozvolyayut kontrolirovat' parametry makrokomand. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 20.1. Napishite neobhodimye direktivy: a) dlya podavleniya vseh komand, kotorye generiruet makrokomanda i b) dlya raspechatki tol'ko komand, generiruyushchih ob®ektnyj kod. 20.2. Zakodirujte dva makroopredeleniya dlya umnozheniya: a) MULTBY dolzhna generirovat' kod dlya umnozheniya bajta na bajt; b) MULTWD dolzhna generirovat' kod dlya umnozheniya slova na slovo. Dlya mnozhitelya i mnozhimogo ispol'zujte v makro opredelenii formal'nye parametry. Prover'te vypolnenie makrokomand na nebol'shoj programme, v kotoroj takzhe opredeleny neobhodimye oblasti dannyh. 20.3. Zapishite makroopredeleniya iz voprosa 20.2 v "makro biblioteku". Isprav'te programmu dlya vklyucheniya elementov biblioteki po direktive INCLUDE v pervom prohode assemblirovaniya. 20.4. Napishite makroopredelenie BIPRINT, ispol'zuyushchej BIOS INT 17H dlya pechati. Makroopredelenie dolzhno vklyuchat' proverku sostoyaniya printera i obespechivat' pechat' lyubyh strok lyuboj dliny. 20.5. Izmenite makroopredelenie na ris.20.6 dlya proverki delitelya na nol' (dlya obhoda deleniya). Assembler dlya IBM PC. Glava 21 1 GLAVA 21. Kompanovka programm ------------------------------------------------------------ Kompanovka programm Cel': Raskryt' tehnologiyu programmirovaniya, vklyuchayushchuyu kompa novku i vypolnenie assemblernyh programm. VVEDENIE ------------------------------------------------------------ Primery programm v predydushchih glavah sostoyali iz odnogo shaga assemblirovaniya. Vozmozhno, odnako, vypolnenie program mnogo modulya, sostoyashchego iz neskol'kih assemblirovannyh programm. V etom sluchae programmu mozhno rassmatrivat', kak sostoyashchuyu iz osnovnoj programmy i odnoj ili bolee podprogramm. Prichiny takoj organizacii programm sostoyat v sleduyushchem: ® byvaet neobhodimo skompanovat' programmy, napisannye na raznyh yazykah, naprimer, dlya ob®edineniya moshchnosti yazyka vysokogo urovnya i effektivnosti assemblera; ® programma, napisannaya v vide odnogo modulya, mozhet okazat'sya slishkom bol'shoj dlya assemblirovaniya; ® otdel'nye chasti programmy mogut byt' napisany raznymi gruppami programmistov, assembliruyushchih svoi moduli razdel'no; ® vvidu vozmozhno bol'shogo razmera vypolnyaemogo modulya, mozhet poyavit'sya neobhodimost' perekrytiya chastej programmy v processe vypolneniya. Kazhdaya programma assembliruetsya otdel'no i generiruet sobstvennyj unikal'nyj ob®ektnyj (OBJ) modul'. Programma kompanovshchik (LINK) zatem kompanuet ob®ektnye moduli v odin ob®edinennyj vypolnyaemyj (EXE) modul'. Obychno vypolnenie nachinaetsya s osnovnoj programmy, kotoraya vyzyvaet odnu ili bolee podprogramm. Podprogrammy, v svoyu ochered', mogut vyzyvat' drugie podprogrammy. Na ris.21.1 pokazany dva primera ierarhicheskoj struktury osnovnoj podprogrammy i treh podprogramm. Na ris. 21.1 (a) osnovnaya programmy vyzyvaet podprogrammy 1, 2 i 3. Na ris. 21.1 (b) osnovnaya programma vyzyvaet podprogrammy 1 i 2, a podprogramma 1 vyzyvaet podprogrammu 3. ------------------------------------------------------------ ------------------------------------------------------------ Ris.21.1. Ierarhiya programm. Sushchestvuet mnogo raznovidnostej organizacii podprogramm, no lyubaya organizaciya dolzhna byt' "ponyatna" i assembleru, i kompanovshchiku, i etapu vypolneniya. Sleduet byt' vnimatel'nym k situaciyam, kogda, naprimer, pod programma 1 vyzyvaet Assembler dlya IBM PC. Glava 21 2 podprogrammu 2, kotoraya vyzyvaet podprogrammu 3 i, kotoraya v svoyu ochered' vyzyvaet podprogrammu 1. Takoj process, izvestnyj kak rekursiya, mozhet ispol'zovat'sya na praktike, no pri neakkuratnom obrashchenii mozhet vyzvat' lyubopytnye oshibki pri vypolnenii. MEZHSEGMENTNYE VYZOVY ------------------------------------------------------------ Komandy CALL v predydushchih glavah ispol'zovalis' dlya vnutrisegmentnyh vyzovov, t.e. dlya vyzovov vnutri odnogo segmenta. Vnutrisegmentnyj CALL mozhet byt' korotkij (v predelah ot +127 do -128 bajt) ili dlinnyj ( prevyshayushchij ukazannye granicy). V rezul'tate takoj operacii "staroe" znachenie v registre IP zapominaetsya v steke, a "novyj" adres perehoda zagruzhaetsya v etot registr. Naprimer, vnutrisegmentnyj CALL mozhet imet' sleduyushchij ob®ektnyj kod: E82000. SHest.E8 predstavlyaet soboj kod operacii, kotoraya zanosit 2000 v vide otnositel'nogo adresa 0020 v registr IP. Zatem processor ob®edinyaet tekushchij adres v registre CS i otnositel'nyj adres v registre IP dlya polucheniya adresa sleduyushchej vypolnyaemoj komandy. Pri vozvrate iz procedury komanda RET vosstanavlivaet iz steka staroe znachenie v registre IP i peredaet upravlenie takim obrazom na sleduyushchuyu posle CALL komandu. Vyzov v drugoj kodovyj segment predstavlyaet soboj mezhseg mentnyj (dlinnyj) vyzov. Dannaya operaciya snachala zapisyvaet v stek soderzhimoe registra CS i zanosit v etot registr adres drugogo segmenta, zatem zapisyvaet v stek znachenie registra IP i zanosit novyj otnositel'nyj adres v etot registr. Takim obrazom v steke zapominayutsya i adres kodovogo seg menta i smeshchenie dlya posleduyushchego vozvrata iz podprogrammy. Naprimer, mezhsegmentnyj CALL mozhet sostoyat' iz sleduyushchego ob®ektnogo koda: 9A 0002 AF04 SHest.9A predstavlyaet soboj kod komandy mezhsegmentnogo vyzova kotoraya zapisyvaet znachenie 0002 v vide 0200 v registr IP, a znachenie AF04 v vide 04AF v registr CS. Kombinaciya etih adresov ukazyvaet na pervuyu vypolnyaemuyu komandu v vyzyvaemoj podprogramme: Kodovyj segment 04AF0 Smeshchenie v IP 0200 Dejstvitel'nyj adres 04CF0 Pri vyhode iz vyzvannoj procedury mezhsegmentnaya komanda vozvrata REP vosstanavlivaet oba adresa v registrah CS i IP i takim obrazom peredaet upravlenie na sleduyushchuyu posle CALL komandu. ATRIBUTY EXTRN i PUBLIC Assembler dlya IBM PC. Glava 21 3 ------------------------------------------------------------ Rassmotrim osnovnuyu programmu (MAINPROG), kotoraya vyzyvaet podprogrammu (SUBPROG) s pomoshch'yu mezhsegmentnogo CALL, kak pokazano na ris.21.2. Komanda CALL v MAINPROG dolzhna "znat'", chto SUBPROG sushchestvuet vne dannogo segmenta (inache assembler vydast soobshchenie o tom, chto identifikator SUBPROG ne opredelen). S pomoshch'yu direktivy EXTRN mozhno ukazat' assembleru, chto ssylka na SUBPROG imeet atribut FAR, t.e.opredelena v drugom assemblernom module. Tak kak sam assembler ne imeet vozmozhnosti tochno opredelit' takie ssylki, on generiruet "pustoj" ob®ektnyj kod dlya posleduyushchego zapolneniya ego pri kompanovke: 9A 0000 ---- E Podprogramma SUBPROG soderzhit direktivu PUBLIC, kotoraya ukazyvaet assembleru i kompanovshchiku, chto drugoj modul' dolzhen "znat'" adres SUBPROG. V poslednem shage, kogda oba modulya MAINPROG i SUBPROG budut uspeshno assemblirovany v ob®ektnye moduli, oni mogut byt' skompanovany sleduyushchim obrazom: Zapros kompanovshchika LINK: Otvet: Object Modules [.OBJ]: B:MAINPROG+B:SUBPROG Run File [filespec.EXE]: B:COMBPROG (ili drugoe imya) List File [NUL.MAP]: CON Libraries [.LIB]: [return] ------------------------------------------------------------ ------------------------------------------------------------ Ris.21.2. Mezhsegmentnyj vyzov. Kompanovshchik ustanavlivaet sootvetstviya mezhdu adresami EXTRN v odnom ob®ektnom module s adresami PUBLIC v drugom i zanosit neobhodimye otnositel'nye adresa. Zatem on ob®edinya et dva ob®ektnyh modulya v odin vypolnyaemyj. Pri nevozmozhnos ti razreshit' ssylki kompanovshchik vydaet soobshcheniya ob oshibkah. Sledite za etimi soobshcheniyami prezhde chem pytat'sya vypolnit' programmu. Direktiva EXTRN Direktiva EXTRN imeet sleduyushchij format: EXTRN imya:tip [, ... ] Mozhno opredelit' bolee odnogo imeni (do konca stroki) ili zakodirovat' dopolnitel'nye direktivy EXTRN. V drugom assemblernom module sootvetstvuyushchee imya dolzhno byt' opredeleno i identificirovano kak PUBLIC. Tip elementa mozhet Assembler dlya IBM PC. Glava 21 4 byt' ABS, BYTE, DWORD, FAR, NEAR, WORD. Imya mozhet byt' opredeleno cherez EQU i dolzhno udovletvoryat' real'nomu opredeleniyu imeni. Direktiva PUBLIC Direktiva PUBLIC ukazyvaet assembleru i kompanovshchiku, chto adres ukazannogo iddentifikatora dostupen iz drugih programm Direktiva imeet sleduyushchij format: PUBLIC identifikator [, ... ] Mozhno opredelit' bolee odnogo identifikatora (do konca stroki) ili zakodirovat' dopolnitel'nye direktivy PUBLIC. Identifikatory mogut byt' metkami (vklyuchaya PROC-metki), peremennymi ili chislami. Nepravil'nymi identifikatorami yavlyayutsya imena registrov i EQU-identifikatory, opredelyayushchie znacheniya bolee dvuh bajt. Rassmotrim tri razlichnyh sposoba kompanovki programm. PROGRAMMA: ISPOLXZOVANIE DIREKTIV EXTRN i PUBLIC DLYA METOK ------------------------------------------------------------ Programma na ris.21.3 sostoit iz osnovnoj programmy CALLMUL1 i podprogrammy SUBMUL1. V osnovnoj programme opredeleny segmenty dlya steka, dannyh i koda. V segmente dannyh opredeleny polya QTY i PRICE. V kodovom segmente registr AX zagruzhaetsya znacheniem PRICE, a registr BX - znacheniem QTY, posle chego proishodit vyzov podprogrammy. Direktiva EXTRN v osnovnoj programme opredelyaet SUBMUL kak tochku vhoda v podprogrammu. Podprogramma soderzhit direktivu PUBLIC (posle ASSUME), kotoraya ukazyvaet kompanovshchiku, chto tochkoj vhoda dlya vypolne niya yavlyaetsya metka SUBMUL. Podprogramma vypolnyaet umnozhenie soderzhimogo registra AX (cena) na soderzhimoe registra BX (kolichestvo). Rezul'tat umnozheniya vyrabatyvaetsya v registro voj pare DX:AX v vide shest. 002E 4000. Tak kak podprogramma ne opredelyaet kakih-libo dannyh, to ej ne trebuetsya segment dannyh. Esli by podprogramma imela segment dannyh, to tol'ko ona odna ispol'zovala by svoi dannye. Takzhe v podprogramme ne opredelen stekovyj segment, tak kak ona ispol'zuet te zhe stekovye adresa, chto i osnovnaya programma. Takim obrazom, stek opredelennyj v osnovnoj programme yavlyaetsya dostupnym i v podprogrpmme. Dlya kompanov shchika neobhodimo obnaruzhit' po krajnej mere odin stek i opredelenie steka v osnovnoj programme yavlyaetsya dostatochnym. Rassmotrim teper' tablicy idntifikatorov, vyrabatyvaemye posle kazhdogo assemblirovaniya. Obratite vnimanie, chto SUBMUL v tablice identifikatorov dlya osnovnoj programmy imeet atributy FAR i External (vneshnij), a dlya podprogrammy - F Assembler dlya IBM PC. Glava 21 5 (dlya FAR) i Global (global'nyj). |tot poslednij atribut ukazyvaet, chto dannoe imya dostupno iz vne podprogrammy, t.e. global'no. Karta kompanovki (v konce listinga) otrazhaet organizaciyu programmy v pamyati. Zamet'te, chto zdes' imeyutsya dva kodovyh segmenta (dlya kazhdogo assemblirovaniya) s raznymi startovymi adresami. Posledovatel'nost' raspolozheniya kodovyh segmentov sootvetstvuet posledovatel'nosti ukazannyh dlya kompa novki ob®ektnyh modulej (oby