chno osnovnaya programma ukazyvaetsya pervoj). Takim obrazom, otnositel'nyj adres nachala osnovnoj programmy - shest.00000, a podprogrammy - shest. 00020. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 21.3. Ispol'zovanie direktiv EXTRN i PUBLIC. Pri trassirovke vypolneniya programmy mozhno obnaruzhit', chto komanda CALL SUBMUL imeet ob®ektnyj kod 9A 0000 D413 Mashinnyj kod dlya mezhsegmentnogo CALL - shest.9A. |ta komanda sohranyaet v steke registr IP i zagruzhaet v nego znachenie 0000, sohranyaet v steke znachenie shest.13D2 iz registra CS i zagruzhaet v nego shest.D413. Sleduyushchaya vypolnyaemaya komanda nahoditsya po adresu v registrovoj pare CS:IP t.e. 13D40 plyus 0000. Obratite vnimanie, chto osnovnaya programma nachinaetsya po adresu v registre CS, soderzhashchemu shest.13D2, t.e. adres 13D20. Iz karty kompanovki vidno, chto podprogramma nachinaet sya po otnositel'nomu adresu shest.0020. Skladyvaya eti dva znacheniya, poluchim dejstvitel'nyj adres kodovogo segmenta dlya podprogrammy: Adres v CS 13D20 Smeshchenie v IP 0020 Dejstvitel'nyj adres 13D40 Kompanovshchik opredelyaet eto znachenie tochno takim zhe obrazom, i podstavlyaet ego v operand komandy CALL. PROGRAMMA: ISPOLXZOVANIE DIREKTIVY PUBLIC V KODOVOM SEGMENTE ------------------------------------------------------------ Sleduyushchij primer na ris.21.4 predstavlyaet soboj variant programmy na ris.21.3. Imeetsya odno izmenenie v osnovnoj programme i odno - v podprogramme. V oboih sluchayah v direktive SEGMENT ispol'zuetsya atribut PUBLIC: CODESG SEGMENT PARA PUBLIC 'CODE' ------------------------------------------------------------ ------------------------------------------------------------ Ris.21.4. Kodovyj segment, opredelennyj kak PUBLIC. Assembler dlya IBM PC. Glava 21 6 Rassmotrim rezul'tiruyushchuyu kartu kompanovki i oob®ektnyj kod komandy CALL. Iz tablicy identifikatorov (v konce kazhdogo listinga assemblirovaniya) sleduet: obobshchennyj tip kodovogo segmenta CODESG - PUBLIC (na ris.21.3 bylo NONE). No bolee interesnym yavlyaetsya to, chto karta kompanovki v konce listinga pokazyva et teper' tol'ko odin kodovyj segment! Tot fakt, chto oba segmenta imeyut odni i te zhe imya (CODESG), klass ('CODE') i atribut PUBLIC, zastavil kompanovshchika ob®edinit' dva logiches kih kodovyh segmenta v odin fizicheskij kodovyj segment. Krome togo, pri trassirovke vypolneniya programmy mozhno obnaruzhit', chto teper' komanda vyzova podprogrammy imeet sleduyushchij ob®ektnyj kod: 9A 2000 D213 |ta komanda zanosit shest.2000 v registr IP i shest. D213 v registr CS. Tak kak podprogramma nahoditsya v obshchem s osnovnoj programmoj kodovom segmente, to v registre CS ustanavlivaetsya tot zhe startovyj adres - shest.D213. No teper' smeshchenie ravno shest.0020: Adres v CS: 13D20 Smeshchenie v IP: 0020 Dejstvitel'nyj adres: 13D40 Takim obrazom, kodovyj segment podprogrammy nachinaetsya, ochevidno, po adresu shest.13D40. Pravil'no li eto? Karta kompanovki ne daet otveta na etot vopros, no mozhno opredelit' adres po listingu osnovnoj programmy, kotoraya zakanchivaetsya na smeshchenii shest.0016. Tak kak kodovyj segment dlya podprogrammy opredelen kak SEGMENT, to on dolzhen nachinat'sya na granice paragrafa, t.e. ego adres dolzhen nacelo delit'sya na shest.10 ili pravaya cifra adresa dolzhna byt' ravna 0. Kompanovshchik razmeshchaet podprogrammu na blizhajshej granice paragrafa neposredstvenno posle osnovnoj programmy - etot otnositel'nyj adres raven shest.00020. Poetomu kodovyj segment podprogrammy nachinaetsya po adresu 13D20 plyus 0020 ili 13D40. +----------------------------------------+--------------+ | Osnovnaya programma... (ne ispol'zuemyj | Podprogramma | | uchastok) | | +----------------------------------------+--------------+ | | | 13D20 13D30 13D40 Rassmotrim, kakim obrazom kompanovshchik soglasuet dannye, opredelennye v osnovnoj programme i imeyushchie ssylki iz podprogrammy. PROGRAMMA: OBSHCHIE DANNYE V PODPROGRAMME Assembler dlya IBM PC. Glava 21 7 ------------------------------------------------------------ Nalichie obshchih dannyh predpolagaet vozmozhnost' obrabotki v odnom assemblernom module dannyh, kotorye opredeleny v drugom assemblernom module. Izmenim predydushchij primer tak, chtoby oblasti QTY i PRICE po-prezhnemu opredelyalis' v osnovnoj programme, no zagruzka znachenij iz etih oblastej v registry BX i AX vypolnyalas' v podprogramme. Takaya programma privedena na ris.21.5. V nej sdelany sleduyushchie izmeneniya: ® V osnovnoj programme imena QTY i PRICE opredeleny kak PUBLIC. Segment dannyh takzhe opredelen s atributom PUBLIC. Obratite vnimanie na atribut Global (global' nyj) dlya QTY i PRICE v tablice identifikatorov. ® V podprogramme imena QTY i PRICE opredeleny kak EXTRN i WORD. Takoe opredelenie ukazyvaet assembleru na dlinu etih polej v 2 bajta. Teper' assembler sgeneriruet pravil'nyj kod operacii dlya komand MOV, a kompanovshchik ustanovit znacheniya operandov. Zamet'te, chto imena QTY i PRICE v tablice identifikatorov imeyut atribut External (vneshnij). ------------------------------------------------------------ ------------------------------------------------------------ Ris.21.5. Obshchie dannye v podprogramme. Komandy MOV v listinge podprogrammy imeyut sleduyushchij vid: A1 0000 E MOV AX,PRICE 8B 1E 0000 E MOV BX,QTY V ob®ektnom kode shest.A1 oboznachaet peresylku slova iz pamyati v registr AX, a shest.8B - peresylku slova iz pamyati v registr BX (ob®ektnyj kod dlya operacij s registrom AX chashche trebuet men'shee chislo bajtov, chem s drugimi registrami). Trassirovka vypolneniya programmy pokazyvaet, chto kompanovshchik ustanovil v ob®ektnom kode sleduyushchie operandy: A1 0200 8B 1E 0000 Ob®ektnyj kod teper' identichen kodu sgenerirovannomu v predy dushchem primere, gde komandy MOV nahodilis' v vyzyvayushchej programme. |to logichnyj rezul'tat, tak kak operandy vo vseh treh programmah bazirovalis' po registru DS i imeli odinakovye otnositel'nye adresa. Osnovnaya programma i podprogramma mogut opredelyat' lyubye drugie elementy dannyh, no obshchimi yavlyayutsya lish' imeyushchie atributy PUBLIC i EXTRN. Sleduya osnovnym pravilam, rassmotrennym v dannoj glave, mozhno teper' kompanovat' programmy, sostoyashchie bolee chem iz dvuh assemblernyh modulej i obespechivat' dostup k obshchim Assembler dlya IBM PC. Glava 21 8 dannym iz vseh modulej. Pri etom sleduet predusmatrivat' stek dostatochnyh razmerov - v razumnyh predelah, dlya bol'shih programm opredelenie 64 slov dlya steka byvaet dostatochnym. V glave 23 budet rassmotreny dopolnitel'nye svojstva segmentov, vklyuchaya opredelenie bolee odnogo segmenta dannyh i kodovogo segmenta v odnom assemblernom module i ispol'zova nie direktivy GROUP dlya ob®edineniya segmentov v odin obshchij segment. PEREDACHA PARAMETROV ------------------------------------------------------------ Drugim sposobom obespecheniya dostupa k dannym iz vyzyvae moj podprogrammy yavlyaetsya peredacha parametrov. V etom sluchae vyzyvayushchaya programma fizicheski peredaet dannye cherez stek. Kazhdaya komanda PUSH dolzhna zapisyvat' v stek dannye razmerom v odno slovo iz pamyati ili iz registra. Programma, privedennaya na ris.21.6, prezhde chem vyzvat' podprogrammu SUBMUL zanosit v stek znacheniya iz polej PRICE i QTY. Posle komandy CALL stek vyglyadit sleduyushchim obrazom: ... | 1600 | D213 | 4001 | 0025 | 0000 | C213 | 6 5 4 3 2 1 1. Inicializiruyushchaya komanda PUSH DS zanosit adres segmenta v stek. |tot adres mozhet otlichat'sya v raznyh versiyah DOS. 2. Komanda PUSH AX zanosit v stek nulevoj adres. 3. Komanda PUSH PRICE zanosit v stek slovo (2500). 4. Komanda PUSH QTY zanosit v stek slovo (0140). 5. Komanda CALL zanosit v stek soderzhimoe registra CS (D213) 6. Tak kak komanda CALL predstavlyaet zdes' mezhsegmentnyj vyzov, to v stek zanositsya takzhe soderzhimoe registra IP (1600). Vyzyvaemaya programma ispol'zuet registr BP dlya dostupa k parametram v steke, no prezhde ona zapominaet soderzhimoe registra BP, zapisyvaya ego v stek. V dannom sluchae, predpolozhim, chto registr BP soderzhit nul', togda nulevoe slovo budet zapisano v vershine steka (sleva). Zatem programma pomeshchaet v registr BP soderzhimoe iz registra SP, tak kak v kachestve indeksnogo registra mozhet ispol'zovat'sya registr BP, no ne SP. Komanda zagruzhaet v registr BP znachenie 0072. Pervonachal'no registr SP soderzhal razmer pustogo steka, t.e. shest.80. Zapis' kazhdogo slova v stek umen'shaet soderzhimoe SP na 2: | 0000 | 1600 | D213 | 4001 | 0025 | 0000 |C213 | | | | | | | | SP: 72 74 76 78 7A 7C 7E Assembler dlya IBM PC. Glava 21 9 Tak kak BP teper' takzhe soderzhit 0072, to parametr ceny (PRICE) budet po adresu BP+8, a parametr kolichestva (QTY) - po adresu BP+6. Programma peresylaet eti velichiny iz steka v registry AX i BX sootvetstvenno i vypolnyaet umnozhenie. ------------------------------------------------------------ ------------------------------------------------------------ Ris.21.6. Peredacha parametrov. Pered vozvratom v vyzyvayushchuyu programmu v registre BP vosstanavlivaetsya pervonachal'noe znachenie, a soderzhimoe v registre SP uvelichivaetsya na 2, s 72 do 74. Poslednyaya komanda RET predstavlyaet soboj "dlinnyj" vozvrat v vyzyvayushchuyu programmu. Po etoj komande vypolnyayutsya sleduyushchie dejstviya: ® Iz vershiny steka vosstanavlivaetsya znachenie registra IP (1600). ® Soderzhimoe registra SP uvelichivaetsya na 2, ot 74 do 76. ® Iz novoj vershiny steka vosstanavlivaetsya znachenie registra CS (D213). ® Soderzhimoe registra SP uvelichivaetsya na 2 ot 76 do 78. Takim obrazom osushchestvlyaetsya korrektnyj vozvrat v vyzyvayu shchuyu programmu. Ostalos' odno nebol'shoe poyasnenie. Komanda RET zakodirovana kak RET 4 Parametr 4 predstavlyaet soboj chislo bajt v steke ispol'zo vannyh pri peredache parametrov (dva slova v dannom sluchae). Komanda RET pribavit etot parametr k soderzhimomu registra SP, poluchiv znachenie 7C. Takim obrazom, iz steka isklyuchayutsya nenuzhnye bol'she parametry. Bud'te osobenno vnimatel'ny pri vosstanovlenii registra SP - oshibki mogut privesti k nepred skazuemym rezul'tatam. KOMPANOVKA PROGRAMM NA BASIC-INTERPRETATORE I ASSEMBLERE ------------------------------------------------------------ V rukovodstve po yazyku BASIC dlya IBM PC privodyatsya razlich nye metody svyazi BASIC-interpretatora i programm na assemblere. Dlya etogo imeyutsya dve prichiny: sdelat' vozmozhnym ispol'zovanie BIOS-preryvanij cherez assemblernye moduli i sozdat' bolee effektivnye programmy. Cel' dannogo razdela - dat' obshchij obzor po dannomu voprosu; povtoryat' zdes' tehnicheskie podrobnosti iz rukovodstva po yazyku BASIC net neobhodimosti. Dlya svyazi s BASIC assemblernye programmy kodiruyutsya, transliruyutsya i kompanuyutsya otdel'no. Vydelenie pamyati dlya podprogramm na mashinnom yazyke mozhet byt' libo vnutri, libo vne 64 Kbajtovoj oblasti pamyati, kotoroj ogranichen BASIC. Vybor lezhit na programmiste. Assembler dlya IBM PC. Glava 21 10 Sushchestvuet dva sposoba zagruzki mashinnogo koda v pamyat': ispol'zovanie operatora yazyka BASIC - POKE ili ob®edinenie skompanovannogo modulya s BASIC-programmoj. Ispol'zovanie BASIC-operatora POKE. Hotya eto i samyj prostoj sposob, no on udoben tol'ko dlya ochen' korotkih podprogramm. Sposob zaklyuchaetsya v tom, chto snachala opredelyaetsya ob®ektnyj kod assemblernoj programmy po LST-fajlu ili s pomoshch'yu otladchika DEBUG. Zatem shestnadcati richnye znacheniya kodiruyutsya neposredstvenno v BASIC-programme v operatorah DATA. Posle etogo s pomoshch'yu BASIC-operatora READ schityvaetsya kazhdyj bajt i operatorom POKE zanositsya v pamyat' dlya vypolneniya. Kompanovka assemblernyh modulej. S bol'shimi assemblernymi podprogrammami obychno proshche imet' delo, eli oni ottranslirovany i skompanovanye kak vypolnimye (EXE) moduli. Neobhodimo organizovat' BASIC-programmu i vypolnimyj modul' v rabochuyu programmu. Pri rabote s BASIC-programmoj ne zabyvajte pol'zovat'sya komandoj BSAVE (BASIC save) dlya sohraneniya programmy i BLOAD - dlya zagruzki ee pered vypolneniem. Prezhde chem kodirovat' BASIC- i assemblernuyu programmy, neobhodimo reshit', kakim iz dvuh sposobov oni budut svyazany. V yazyke BASIC vozmozhny dva sposoba: funkciya USR i operator CALL. V oboih sposobah registry DS, ES i SS na vhode soderzhat ukazatel' na adresnoe prostranstvo sredy BASIC. Registr CS soderzhit tekushchee znachenie, opredelennoe poslednim operatorom DEF SEG (esli on imeetsya). Stekovyj ukazatel' SP ukazyvaet na stek, sostoyashchij tol'ko iz vos'mi slov, tak chto mozhet potrebovat'sya ustanovka drugogo steke v podprogramme. V poslednem sluchae neobhodimo na vhode sohranit' znachenie ukazatelya tekushchego steka, a pri vyhode vosstanovit' ego. V oboih sluchayah pri vyhode neobhodimo vosstanovit' znachenie segmentnyh registrov i SP i obespechit' vozvrat v BASIC s pomoshch'yu mezhsegmentnogo vozvrata RET. Skompanujte vash assemblirovannyj ob®ektnyj fajl tak, chto by on nahodilsya v starshih adresah pamyati. Dlya etogo ispol'zuetsya parametr HIGH pri otvete na vtoroj zapros kompa novshchika, naprimer, B:imya/HIGH. Zatem s pomoshch'yu otladchika DEBUG neobhodimo zagruzit' EXE-podprogrammu i po komande R opredelit' znacheniya v registrah CS i IP: oni pokazyvayut na startovyj adres podprogrammy. Nahodyas' v otladchike ukazhite imya (komanda N) BASIC i zagruzite ego komandoj L. Dva sposoba svyazi BASIC-programmy i EXE-podprogrammy - ispol'zovanie operatorov USR ili CALL. Rabotaya v otladchike, neobhodimo opredelit' startovyj adres EXE-podprogrammy i, zatem, ukazat' etot adres ili v operatore USRn ili v CALL. V rukovodstve po yazyku BASIC dlya IBM PC detal'no predstavleno opisanie funkcii USRn i operatora CALL s razlichnymi primerami. Assembler dlya IBM PC. Glava 21 11 Programma: Kompanovka BASIC i assemblera. Rassmotrim teper' prostoj primer kompanovki programmy dlya BASIC-interpretatora i podprogrammy na assemblere. V etom primere BASIC-programma zaprashivaet vvod znachenij vremeni i rascenki i vyvodit na ekran ih proizvedenie - razmer zarplaty. Cikl FOR-NEXT obespechivaet pyatikratnoe vypolnenie vvoda i zatem programma zavershaetsya. Pust' BASIC- programma vyzyvaet assemblernyj modul', kotoryj ochishchaet ekran. Na ris. 21.7 privedena ishodnaya BASIC-programma i assemb lernaya podprogramma. Obratite vnimanie na sleduyushchie osoben nosti BASIC-programmy: operator 10 ochishchaet 32K bajt pamyati; operatory 20, 30, 40 i 50 vremenno soderzhat kommentarii. Pozzhe my vstavim BASIC-operatory dlya svyazi s assemblernym modulem. BASIC-programmu mozhno srazu proverit'. Vvedite komandu BASIC i zatem naberite vse pronumerovannye operatory tak, kak oni pokazany v primere. Dlya vypolneniya programmy nazhmite F2. Ne zabudte sohranit' tekst programmy s pomoshch'yu komandy SAVE "B:BASTEST.BAS" Obratite vnimanie na sleduyushchie osobennosti assemblernoj podprogrammy: - otsutstvuet opredelenie steka, tak kak ego obespechivaet BASIC; programma ne predusmotrena dlya otdel'nogo vypolneniya i ne mozhet byt' vypolnena; - podprogramma sohranyaet v steke soderzhimoe registra BP i zapisyvaet znachenie registra SP v BP; - podprogramma vypolnyaet ochistku ekrana, hotya ona mozhet byt' izmenena dlya vypolneniya drugih operacij, takih kak prokrutka ekrana vverh ili vniz ili ustanovka kursora. ------------------------------------------------------------ ------------------------------------------------------------ Ris.21.7. Osnovnaya programma na yazyke BASIC i podprogramma na assemblere. Vse chto ostalos' - eto svyazat' eti programmy vmeste. Sleduyushchie dejstviya predpolagayut, chto sistemnaya disketa (DOS) nahoditsya na diskovode A, a rabochie programmy - na diskovode B: 1. Naberite assemblernuyu podprogrammu, sohranite ee pod imenem B:LINKBAS.ASM i ottranslirujte ee. 2. Ispol'zuya kompanovshchik LINK, sgenerirujte ob®ektnyj modul', kotoryj budet zagruzhat'sya v starshie adresa pamyati: LINK B:LINKBAS,B:LINKBAS/HIGH,CON; 3. S pomoshch'yu otladchika DEBUG zagruzite BASIC - kompilyator: DEBUG BASIC.COM. Assembler dlya IBM PC. Glava 21 12 4. Po komande otladchika R vyvedite na ekran soderzhimoe registrov. Zapishite znacheniya v registrah SS, CS i IP. 5. Teper' ustanovite imya i zagruzite skompanovannyj assemblernyj modul' sleduyushchimi komandami: N B:LINKBAS.EXE L 6. Po komande R vyvedite na ekran soderzhimoe registrov i zapishite znacheniya v CX, CS i IP. 7. Zamenite soderzhimoe registrov SS, CS i IP znacheniyami iz shaga 4. (Dlya etogo sluzhat komandy R SS, R CS i R IP). 8. Vvedite komandu otladchika G (go) dlya peredachi upravle niya v BASIC. Na ekrane dolzhen poyavit'sya zapros iz BASIC-programmy. 9. Dlya togo, chtoby sohranit' assemblernyj modul', vvedite sleduyushchie komandy (bez nomerov operatorov): DEF SEG = &Hxxxx (znachenie v CS iz shaga 6) BSAVE "B:CLRSCRN.MOD",0,&Hxx (znachenie v CX iz shaga 6) Pervaya komanda obespechivaet adres zagruzki modulya v pamyat' dlya vypolneniya. Vtoraya komanda identificiruet imya modulya, otnositel'nuyu tochku vhoda i razmer modulya. Po vtoroj komande sistema zapishet modul' na diskovod B. 10. Teper' neobhodimo modificirovat' BASIC-programmu dlya kompanovki. Mozhno zagruzit' ee srazu, nahodyas' v otladchike, no vmesto etogo naberite komandu SYSTEM dlya vyhoda iz BASIC i, zatem, vvedite Q dlya vyhoda iz otladchika DEBUG. Na ekrane dolzhno poyavit'sya priglashenie DOS. 11. Vvedite komandu BASIC, zagruzite BASIC-programmu i vyvedite ee na ekran: BASIC LOAD "B:BASTEST.BAS" LIST 12. Izmenite operatory 20, 30, 40 i 50 sleduyushchim obrazom: 20 BLOAD "B:CLRSCRN.MOD" 30 DEF SEG = &Hxxxx (znachenie v CS iz shaga 6) 40 CLRSCRN = 0 (tochka vhoda v podprogrammu) 50 CALL CLRSCRN (vyzov podprogrammy) 13. Prosmotrite, vypolnite i sohranite izmenennuyu BASIC- programmu. Esli BASIC-programma i assemblernye komandy byli vvedeny pravil'no, a takzhe pravil'no ustanovleny shestnadcaterichnye znacheniya iz registrov, to svyazannaya programma dolzhna srazu ochistit' ekran i vydat' zapros na vvod vremeni i rascenki. Assembler dlya IBM PC. Glava 21 13 Na ris.21.8 priveden protokol vseh shagov - no nekotorye znacheniya mogut otlichat'sya v zavisimosti ot versii operacionnoj sistemy i razmera pamyati. Privedennyj primer vybran namerenno prostym tol'ko dlya demonstracii kompanovki. Mozhno ispol'zovat' bolee slozhnuyu tehnologiyu, ispol'zuya peredachu parametrov iz BASIC-programmy v assemblernuyu podprogrammu s pomoshch'yu operatora CALL podprogramma (parametr-1,parametr-2,...) ------------------------------------------------------------ ------------------------------------------------------------ Ris.21.8. |tapy svyazi BASIC i assemblera. Assemblernaya podprogramma mozhet poluchit' dostup k etim parametram, ispol'zuya registr BP v vide [BP], kak eto delalos' ranee na ris.21.3. V etom sluchae neobhodimo opredelit' operand v komande RET, sootvetstvuyushchij dline adresov parametrov v steke. Naprimer, esli operator CALL peredaet tri parametra to vozvrat dolzhen byt' zakodirovan v vide RET 6. KOMPANOVKA PROGRAMM NA YAZYKE PASCAL I ASSEMBLERE ------------------------------------------------------------ V dannom razdele pokazano, kak mozhno ustanovit' svyaz' mezhdu programmami na yazyke PASCAL firm IBM i MicroSoft s programmami na assemblere. Na ris.21.9 priveden primer svyazi prostoj PASCAL-programmy s assemblernoj podprogrammoj. PASCAL-programma skompilirovana dlya polucheniya OBJ-modulya, a assemblernaya programma ottranslirovana takzhe dlya polucheniya OBJ-modulya. Programma LINK zatem kompanuet vmeste eti dva OBJ-modulya v odin vypolnimyj EXE-modul'. V PASCAL-programme opredeleny dve peremennye: temp_row i temp_col, kotorye soderzhat vvedennye s klaviatury znacheniya stroki i kolonki sootvetstvenno. Programma peredaet adresa peremennyh temp_row i temp_col v vide paramterov v assemblernuyu podprogrammu dlya ustanovki kursora po etim koordinatam. PASCAL-programma opredelyaet takzhe imya assemblernoj podprogrammy v operatore procedure kak move_cursor i opredelyaet dva parametra, kak extern (vneshnie). Operator v PASCAL-programme, kotoryj vyzyvaet assemblernuyu programmu po imeni i peredaet parmetry, imeet sleduyushchij vid: move_cursor (temp_row, temp_col); CHerez stek peredayutsya sleduyushchie velichiny: ukazatel' bloka vyzyvayushchej programmy, ukazatel' na segment vozvrata, smeshchenie vozvrata i adresa dvuh peredavaemyh parametrov. Nizhe pokazany smeshcheniya dlya kazhdogo elementa v steke: 00 Ukazatel' bloka vyzyvayushchej programmy 02 Ukazatel' segmenta vozvrata Assembler dlya IBM PC. Glava 21 14 04 Ukazatel' smeshcheniya vozvrata 06 Adres vtorogo parametra 08 Adres pervogo parametra Tak kak assemblernaya podprogramma budet ispol'zovat' registr BP, to ego neobhodimo sohranit' v steke dlya posleduyushchego vosstanovleniya pri vozvrate v vyzyvayushchuyu PASCAL-programmu. Zamet'te, chto etot shag v vyzyvaemoj podprogramme analogichen predydushchemu primeru na ris.21.6. ------------------------------------------------------------ ------------------------------------------------------------ Ris.21.9. Kompanovka PASCAL-assembler. Registr SP obychno adresuet elementy steka. No tak kak etot registr nel'zya ispol'zovat' v kachestve indeksnogo registra, to posle sohraneniya starogo znacheniya registra BP neobhodimo pereslat' adres iz registra SP v BP. |tot shag daet vozmozhnost' ispol'zovat' registr BP v kachestve indeksnogo registra dlya dostupa k elementam v steke. Sleduyushchij shag - poluchit' dostup k adresam dvuh parametrov v steke. Pervyj peredannyj parametr (adres stroki) nahoditsya v steke po smeshcheniyu 08, i mozhet byt' adresovan po BP+08. Vtoroj peredannyj parametr (adres stolbca) nahoditsya v steke po smeshcheniyu 06 i mozhet byt' adresovan po BP+06. Dva adresa iz steka dolzhny byt' peredany v odin iz indeksnyh registrov BX, DI ili SI. V dannom primere adres stroki peresylaetsya iz [BP+08] v registr SI, a zatem soderzhimoe iz [SI] (znachenie stroki) peresylaetsya v registr DH. Znachenie stolbca peresylaetsya analogichnym sposobom v registr DL. Zatem podprogramma ispol'zuet znacheniya stroki i stolbca v registre DX pri vyzove BIOS dlya ustanovki kursora. Pri vyhode podprogramma vosstanavlivaet registr BP. Komanda RET imeet operand, znachenie kotorogo v dva raza bol'she chisla parametrov, v dannom sluchae 2h2, ili 4. Parametry avtoma ticheski vyvodyatsya iz steka i upravlenie perehodit v vyzyvayu shchuyu programmu. Esli v podprogramme predstoit izmenit' segmentnyj registr to neobhodimo sohranit' ego znachenie komandoj PUSH na vhode i vosstanovit' komandoj POP na vyhode. Mozhno takzhe ispol'zo vat' stek dlya peredachi velichin iz podprogrammy v vyzyvayushchuyu programmu. Hotya rassmotrennaya podprogramma ne vozvrashchaet kakih-libo znachenij, v yazyke PASCAL predpolagaetsya, chto podprogramma vozrashchaet odno slovo v registre AX ili dvojnoe slovo v registrovoj pare DX:AX. V rezul'tate kompanovki dvuh programm budet postroena karta kompanovki, v kotoroj pervyj element PASCALL predstavlyaet PASCALL-programmu, vtoroj element CODESEG (imya segmenta koda) predstavlyaet assemblernuyu podprogrammu. Dalee sleduet neskol'ko podprogramm dlya PASCALL-programmy. |ta dovol'no trivial'naya programma zanimaet v rezul'tate Assembler dlya IBM PC. Glava 21 15 shest.5720 bajt pamyati - bolee 20K. Kompiliruyushchie yazyki obychno generiruyut ob®ektnye kody znachitel'no prevyshayushchie po ob®emu razmery kompiliruemoj programmy. KOMPANOVKA PROGRAMM NA YAZYKE C I ASSEMBLERE ------------------------------------------------------------ Trudnost' opisaniya svyazi programm na yazyke C i assemblernyh programm sostoit v tom, chto razlichnye versii yazyka C imeyut raznye soglasheniya o svyazyah i dlya bolee tochnoj informacii sleduet pol'zovat'sya rukovodstvom po imeyushchejsya versii yazyka C. Zdes' privedem lish' nekotorye soobrazheniya, predstavlyayushchie interes: ® Bol'shinstvo versij yazyka C obespechivayut peredachu parametrov cherez stek v obratnoj (po sravneniyu s drugimi yazykami) posledovatel'nosti. Obychno dostup, naprimer, k dvum parametram, peredavaemym cherez stek, osushchestvlyaetsya sleduyushchim obrazom: MOV ES,BP MOV BP,SP MOV DH,[BP+4] MOV DL,[BP+6] ... POP BP RET ® Nekotorye versii yazyka C razlichayut propisnye i strochnye bukvy, poetomu imya assemblernogo modulya dolzhno byt' predstavlenno v tom zhe simvol'nom registre, kakoj ispol'zuyut dlya ssylki C-programmy. ® V nekotoryh versiyah yazyka C trebuetsya, chtoby assemb lernye programmy, izmenyayushchie registry DI i SI, zapisy vali ih soderzhimoe v stek pri vhode i vosstanavlivali eti znacheniya iz steka pri vyhode. ® Assemblernye programmy dolzhny vozvrashchat' znacheniya, esli eto neobhodimo, v registre AX (odno slovo) ili v registrovoj pare DX:AX (dva slova). ® Dlya nekotoryh versij yazyka C, esli assemblernaya programma ustanavlivaet flag DF, to ona dolzhna sbrosit' ego komandoj CLD pered vozvratom. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® V osnovnoj programme, vyzyvayushchej podprogrammu, neobhodimo opredelyat' tochku vhoda kak EXTRN, a v podprogramme - kak PUBLIC. Assembler dlya IBM PC. Glava 21 16 ® Bud'te vnimatel'ny pri ispol'zovanii rekursij, kogda podprogramma 1 vyzyvaet podprogrammu 2, kotoraya v svoyu ochered' vyzyvaet podprogrammu 1. ® Esli kodovye segmenty neobhodimo skompanovat' v odin segment, to neobhodimo opredelit' ih s odinakovymi imenami, odinakovymi klassami i atributom PUBLIC. ® Dlya prostoty programmirovaniya nachinajte vypolnenie s osnovnoj programmy. ® Opredelenie obshchih dannyh v osnovnoj programme obychno proshche (no ne obyazatel'no). Osnovnaya programma opredelya et obshchie dannye kak PUBLIC, a podprogramma (ili podprogrammy) - kak EXTRN. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 21.1. Predpolozhim, chto programma MAINPRO dolzhna vyzvat' pod programmu SUBPRO. a) Kakaya direktiva v programme MAINPRO ukazyvaet assembleru, chto imya SUBPRO opredele no vne ee sobstvennogo koda? b) Kakaya direktiva v podprogramme SUBPRO neobhodima dlya togo, chtoby imya tochki vhoda bylo dostupno v osnovnoj programme MAINPRO? 21.2. Predpolozhim, chto v programme MAINPRO opredeleny peremennye QTY kak DB, VALUE kak DW i PRICE kak DW. Podprogramma SUBPRO dolzhna razdelit' VALUE na QTY i zapisat' chastnoe v PRICE. a) Kakim obrazom programma MAINPRO ukazyvaet assembleru, chto tri peremennye dolzhny byt' dostupnyj izvne osnovnoj programmy? b) Kakim obrazom podprogramma SUBPRO ukazyvaet assembleru, chto tri peremennye opredeleny v drugom module? 21.3. Na osnovanii voprosov 21.2 i 21.3 postrojte rabotayushchuyu programmu i prover'te ee. 21.4. Izmenite programmu iz predydushchego voprosa tak, chtoby programma MAINPRO peredavala vse tri peremennye, kak parametry. Podprogramma SUBPRO dolzhna vozvrashchat' rezul'tat cherez parametr. 21.5. Teper' predlagaem uprazhnenie, na kotoroe potrebuetsya bol'she vremeni. Trebuetsya rasshirit' programmu iz voprosa 21.4 tak, chtoby programma MAINPRO pozvolyala vvodit' kolichestvo (QTY) i obshchuyu stoimost' (VALVE) s klaviatury, podprogramma SUBCONV preobrazovyvala ASCII-velichiny v dvoichnoe predstavlenie; podprogramma Assembler dlya IBM PC. Glava 21 17 SUBCALC vychislyala cenu (PRICE); i podprogramma SUBDISP preobrazovyvala dvoichnuyu cenu v ASCII-predstavlenie i vyvodila rezul'tat na ekran. Assembler dlya IBM PC. Glava 22 33 GLAVA 22. Programmnyj zagruzchik ------------------------------------------------------------ Programmnyj zagruzchik Cel': Raskryt' osobennosti zagruzki vypolnimyh modulej v pamyat' dlya vypolneniya. VVEDENIE ------------------------------------------------------------ V dannoj glave opisana organizaciya bazovoj versii DOS i operacii, kotorye vypolnyaet DOS dlya zagruzki vypolnimyh modulej v pamyat' dlya vypolneniya. DOS sostoit iz chetyreh osnovnyh programm, kotorye obespechivayut konkretnye funkcii: 1. Blok nachal'noj zagruzki nahoditsya na pervom sektore nulevoj dorozhki diskety DOS, a takzhe na lyubom diske, formatirovannom komandoj FORMAT /S. Kogda vy iniciiru ete sistemu (predpolagaetsya, chto DOS raspolozhen na diskovode A ili C) proishodit avtomaticheskaya zagruzka s diska v pamyat' bloka nachal'noj zagruzki. |tot blok predstavlyaet soboj programmu, kotoraya zatem zagruzhaet s diska v pamyat' tri programmy, opisannye nizhe. 2. Programma IBMBIO.COM obespechivaet interfejs nizkogo urovnya s programmami BIOS v ROM; ona zagruzhaetsya v pamyat', nachinaya s adresa shest.00600. Pri inicializacii programma IBMBIO.COM opredelyaet sostoyanie vseh ustrojstv i oborudovaniya, a zatem zagruzhaet programmu COMMAND.COM. Programma IBMBIO.COM upravlyaet operaciyami vvoda-vyvoda mezhdu pamyat'yu i vneshnimi ustrojstvami, takimi kak videomonitor i disk. 3. Programma IBMDOS.COM obespechivaet interfejs vysokogo urovnya s programmami i zagruzhaetsya v pamyat', nachinaya s adresa shest.00B00. |ta programma upravlyaet oglavleniyami i fajlami na diske, blokirovaniem i deblokirovaniem diskovyh zapisej, funkciyami INT 21H, a takzhe soderzhit ryad drugih servisnyh funkcij. 4. Programma COMMAND.COM vypolnyaet razlichnye komandy DOS, takie kak DIR ili CHKDSK, a takzhe vypolnyaet COM, EXE i BAT-programmy. Ona sostoit iz treh chastej: nebol'shaya rezidentnaya chast', chast' inicializacii i tranzitnaya chast'. Programma COMMAND.COM, podrobno rasmotrennaya v sleduyushchem razdele, otvechaet za zagruzku vypolnyaemyh programm s diska v pamyat'. Na ris.22.1 pokazana karta raspredeleniya pamyati. Nekoto rye elementy mogut otlichat'sya v zavisimosti ot modeli komp'yutera. Assembler dlya IBM PC. Glava 22 34 ------------------------------------------------------------ Nachal'nyj Programma adres 00000 Vektornaya tablica preryvanij (sm.gl.23) 00400 Oblast' svyazi s ROM (PZU) 00500 Oblast' svyazi s DOS 00600 IBMBIO.COM XXXX0 IBMDOS.COM Bufer kataloga Diskovyj bufer Tablica parametrov diskovoda ili tablica raspredeleniya fajlov (FAT, po odnoj dlya kazhdogo diskovoda) XXXX0 Rezidentnaya chast' COMMAND.COM XXXX0 Vneshnie komandy ili utility (COM ili EXE-fajly) XXXX0 Pol'zovatel'skij stek dlya COM-fajlov (256 bajtov) XXXX0 Tranzitnaya chast' COMMAND.COM, zapisyvaetsya v samye starshie adresa pamyati. ------------------------------------------------------------ Ris.22.1. Karta raspredeleniya DOS v pamyati. KOMANDNYJ PROCESSOR COMMAND.COM ------------------------------------------------------------ Sistema zagruzhaet tri chasti programmy COMMAND.COM v pamyat' vo vremya seansa raboty postoyanno ili vremenno. Nizhe opisano naznachenie kazhdoj iz treh chatej COMMAND.COM: 1. Rezidentnaya chast' neposredstvenno sleduet za programmoj IBMDOS.COM (i ee oblasti dannyh), gde ona nahoditsya na protyazhenii vsego seansa raboty. Rezidentnaya chast' obrabatyvaet vse oshibki diskovyh operacij vvoda-vyvoda i upravlyaet sleduyushchimi preryvaniyami: INT 22H Adres programmy obrabotki zaversheniya zadachi. INT 23H Adres programmy reakcii na Ctrl/Break. INT 24H Adres programmy reakcii na oshiboki diskovyh operacij chteniya/zapisi ili sbojnyj uchastok pamyati v tablice raspredeleniya fajlov (FAT). INT 27H Zavershenie raboty, posle kotorogo programma ostaetsya rezidentnoj. 2. CHast' inicializacii neposredstvenno sleduet za rezident noj chat'yu i soderzhit sredstva podderzhki AUTOEXEC- fajlov. V nachale raboty sistemy dannaya chast' pervoj poluchaet upravlenie. Ona vydaet zapros na vvod daty i opredelyaet segmentnyj adres, kuda sistema dolzhna zagruzhat' programmy dlya vypolneniya. Ni odna iz etih programm inicializacii ne potrebuyutsya bol'she vo vremya seansa raboty. Poetomu pervaya zhe komanda vvodimaya s klaviatury i vyzyvayushchaya zagruzku nekotoroj programmy s diska perekryvayut chast' inicializacii v pamyati. Assembler dlya IBM PC. Glava 22 35 3. Tranzitnaya chast' zagruzhaetsya v samye starshie adresa pamyati. "Tranzit" oboznachaet, chto DOS mozhet perekryt' dannuyu oblast' drugimi programmami, esli potrebuetsya. Tranzitnaya chast' programmy COMMAND.COM vyvodit na ekran priglashenie DOS A> ili C>, vvodit i vypolnyaet zaprosy. Ona soderzhit nastraivayushchij zagruzchik i prednaznachena dlya zagruzki COM- ili EXE-fajlov s diska v pamyat' dlya vypolneniya. Esli postupil zapros na vypolnenie kakoj-libo programmy, to tranzitnaya chast' stroit prefiks programmnogo segmenta (PSP) neposredstvenno vsled za rezidentnoj chast'yu COMMAND.COM. Zatem ona zagruzhaet zaproshennuyu programmu s diska v pamyat' po smeshcheniyu shest.100 ot nachala programmnogo segmenta, ustanavlivaet adresa vyhoda i peredaet upravlenie v zagruzhennuyu programmu. Nizhe privedena dannaya posledovatel'nost': IBMBIO.COM IBMDOS.COM COMMAND.COM (rezident) Prefiks programmnogo segmenta Vypolnyaemaya programma ... COMMAND.COM (tranzitnaya chast', mozhet byt' perekryta). Vypolnenie komandy RET ili INT 20H v konce programmy privodit k vozvratu v rezidentnuyu chast' COMMAND.COM. Esli tranzitnaya chast' byla perekryta, to rezidentnaya chast' perezagruzhaet tranzitnuyu chast' s diska v pamyat'. PREFIKS PROGRAMMNOGO SEGMENTA ------------------------------------------------------------ Prefiks programmnogo segmenta (PSP) zanimaet 256 (shest. 100) bajt i vsegda predshestvuet v pamyati kazhdoj COM- ili EXE-programme, kotoraya dolzhna byt' vypolnena. PSP soderzhit sleduyushchie polya: 00 Komanda INT 20H (shest.CD20). 02 Obshchij razmer dostupnoj pamyati v formate hhhh0. Napri mer, 512K ukazyvaetsya kak shest.8000 vmesto shest.80000. 04 Zarezervirovano. 05 Dlinnyj vyzov dispetchera funkcij DOS. OA Adres podprogrammy zaversheniya. OE Adres podprogrammy reakcii na Ctrl/Break. 12 Adres podprogrammy reakcii na fatal'nuyu oshibku. 16 Zarezervirovano. 2C Segmentnyj adres sredy dlya hraneniya ASCIIZ strok. 50 Vyzov funkcij DOS (INT 21H i RETF). 5C Parametricheskaya oblast' 1, formatirovannaya kak standart nyj neotkrytyj blok upravleniya fajlov (FCB|1). Assembler dlya IBM PC. Glava 22 36 6C Parametricheskaya oblast' 2, formatirovannaya kak standart nyj neotkrytyj blok upravleniya fajlom (FCB|2); perekry vaetsya, esli blok FCB|1 otkryt. 80-FF Bufer peredachi dannyh (DTA). Bufer peredachi dannyh DTA Dannaya chast' PSP nachinaetsya po adresu shest.80 i predstavlyaet soboj bufernuyu oblast' vvoda-vyvoda dlya tekushchego diskovoda. Ona soderzhit v pervom bajte chislo, ukazyvayushchee skol'ko raz byli nazhaty klavishi na klaviature neposredstvenno posle vvoda imeni programmy. Nachinaya so vtorogo bajta, nahodyatsya vvedennye simvoly (esli takovye imeyutsya). Dalee sleduet vsevozmozhnyj "musor", ostavshijsya v pamyati posle raboty predydushchej programmy. Sleduyushchie primery demonstriruyut naznachenie bufera DTA: Primer 1. Komanda bez operandov. Predpolozhim, chto vy vyz vali programmu CALCIT.EXE dlya vypolneniya s pomoshch'yu komandy CALCIT [return]. Posle togo, kak DOS postroit PSP dlya etoj programmy, on ustanovit v bufere po adresu shest.80 znachenie shest.000D. Pervyj bajt soderzhit chislo simvolov, vvedennyh s klaviatury posle imeni CALCIT, isklyuchaya simvol "vozvrat karetki". Tak kak krome klavishi Return ne bylo nazhato ni odnoj, to chislo simvolov ravno nulyu. Vtoroj bajt soderzhit simvol vozvrata karetki, shest.0D. Takim obrazom, po adresam shest.80 i 81 na hodyatsya 000D. Primer 2. Komanda s tekstovym operandom. Predpolozhim, chto posle komandy byl ukazan tekst (no ne imya fajla), naprimer, COLOR BY, oboznachayushchij vyzov programmy COLOR i peredachu etoj programme parametra "BY" dlya ustanovki golubogo cveta na zheltom fone. V etom sluchae, nachinaya s adresa shest.80, DOS ustanovit sleduyushchie znacheniya bajt: 80: 03 20 42 59 0D |ti bajty oboznachayut dlinu 3, probel, "BY" i vozvrat karetki. Primer 3. Komanda s imenem fajla v operande. Programmy tipa DEL (udalenie fajla) predpolagayut posle imeni programmy vvod imeni fajla v kachestve parametra. Esli budet vvedeno, naprimer, DEL B:CALCIT.OBJ [return], to PSP, nachinaya s adresov shest.5C i shest.80, budet soderzhat': 5C: 02 43 41 4C 43 49 54 20 20 4F 42 4A C A L C I T O B J 80: 0D 20 42 3A 43 41 4C 43 49 54 2E 4F 42 4A 0D B : C A L C I T . 0 B J Assembler dlya IBM PC. Glava 22 37 Nachinaya s adresa shest.5C, nahoditsya neotkrytyj blok FCB, soderzhashchij imya fajla, kotoryj byl ukazan v parametre, CALCIT.OBJ, no ne imya vypolnyaemoj programmy. Pervyj simvol ukazyvaet nomer diskovoda (02=B v dannom sluchae). Sledom za CALCIT nahodyatsya dva probela, kotorye dopolnyayut imya fajla do vos'mi simvolov, i tip fajla, OBJ. Esli vvesti dva parametra, naprimer: progname A:FILEA,B:FILEB togda DOS postroit FCB dlya FILEA po smeshcheniyu shest.5C i FCB dlya FILEB po smeshcheniyu shest.6C. Nachinaya s adresa shest.80 v etom sluchae soderzhitsya chislo vvedennyh simvolov (dlina parametrov) - 16, probel (shest.20) A:FILEA,B:FILEB i simvol vozvrat karetki (OD). Tak kak PSP neposredstvenno predshestvuet vashej programme, to vozmozhen dostup k oblasti PSP dlya obrabotki ukazannyh fajlov ili dlya predprinyatiya opredelennyh dejstvij. Dlya lokalizacii bufera DTA COM-programma mozhet prosto pomestit' shest.80 v registr SI i poluchit' dostup sleduyushchim obrazom: MOV SI,80H ;Adres DTA CMP BYTE PTR [SI],0 ;V bufere nul'? JE EXIT Dlya EXE-programmy nel'zya s uverennost'yu utverzhdat', chto kodovyj segment neposredstvenno raspolagaetsya posle PSP. Odnako, zdes' pri inicializacii registry DS i ES soderzhat adres PSP, tak chto mozhno sohranit' soderzhimoe registra ES posle zagruzki registra DS: MOV AX,DSEG MOV DS,AX MOV SAVEPSP,ES Pozzhe mozhno ispol'zovat' sohranennyj adres dlya dostupa k buferu PSP: MOV SI,SAVEPSP CMP BYTE PTR [SI+ 80H],0 ;V bufere nul'? JE EX