achal'nyj adres sleduyushchim obrazom: A 100 [Return] Otladchik vydast znachenie adresa segmenta kodov i smeshcheniya v vvide hhhh:0100. Teper' mozhno vvodit' kazhduyu komandu, zaver shaya klavishej Return. Kogda vsya programma budet vvedena, nazhmite snova klavishu Return dlya vyhoda iz rezhima assemble ra. Vvedite sleduyushchuyu programmu: Assembler dlya IBM PC. Glava 2 41 MOV AL,25 [Return] MOV BL,32 [Return] ADD AL,BL [Return] RET [Return] po zaversheniyu na ekrane budet sleduyushchaya informaciya: hhhh:0100 MOV AL,25 hhhh:0102 MOV BL,32 hhhh:0104 ADD AL,BL hhhh:0106 RET V etot moment otladchik gotov k priemu sleduyushchej komandy. Pri nazhatii Return operaciya budet prekrashchena. Mozhno videt', chto otladchik opredelil startovye adresa kazhdoj komandy. Prezhde chem vypolnit' programmu, proverim sgenerirovannye mashinnye kody. Komanda U Komanda otladchika U (Unassemble) pokazyvaet mashinnye kody dlya komand assemblera. Neobhodimo soobshchit' otladchiku adresa pervoj i poslednej komandy, kotorye neobhodimo prosmotret' (v dannom cluchae 100 i 106). Vvedite: U 100,106 [i Return] i na ekrane poyavitsya hhhh:0100 B025 MOV AL,25 hhhh:0102 B332 MOV BL,32 hhhh:0104 00D8 ADD AL,BL hhhh:0106 C3 RET Teper' provedem trassirovku vypolneniya programmy, nachinaya s komandy R dlya vyvoda soderzhimogo registrov i pervoj komandy programmy. S pomoshch'yu komand T vypolnim posledovatel'no vse komandy programmy. Teper' vy znaete, kak vvodit' programmu v mashinnom kode ili na yazyke assemblera. Obychno ispol'zuetsya vvod na yazyke assemblera, kogda mashinnyj kod neizvesten, a vvod v mashinnom kode - dlya izmeneniya programmy vo vremya vypolneniya. Odnako v dejstvitel'nosti programma DEBUG prednaznachena dlya otladki programm i v sleduyushchih glavah osnovnoe vnimanie budet udeleno ispol'zovaniyu yazyka assemblera. Sohranenie programmy iz otladchika Mozhno ispol'zovat' DEBUG dlya sohraneniya programm na diske v sleduyushchih sluchayah: Assembler dlya IBM PC. Glava 2 42 1. Posle zagruzki programmy v pamyat' mashiny i ee modifika cii neobhodimo sohranit' izmenennyj variant. Dlya etogo sleduet: ® zagruzit' programmu po ee imeni: DEBUG n:imyafajla[Return] ® prosmotret' programmu s pomoshch'yu komandy D i vvesti izmeneniya po komande E, ® zapisat' izmenennuyu programmu: W [Return] 2. Neobhodimo s pomoshch'yu DEBUG napisat' nebol'shuyu po ob®emu programmu i sohranit' ee na diske. Dlya etogo sleduet: ® vyzvat' otladchik DEBUG, ® s pomoshch'yu komand A (assemble) i E (enter) napisat' programmu, ® prisvoit' programme imya: N imyafajla.COM [Return]. Tip programmy dolzhen byt' COM (sm. glavu 6 dlya poyasnenij po COM-fajlam). ® Tak kak tol'ko programmist znaet, gde dejstvitel'no konchaetsya ego programma, ukazat' otladchiku dlinu programmy v bajtah. V poslednem primere koncom programmy yavlyaetsya komanda hhhh:0106 C3 RET |ta komanda odnobajtovaya i poetomu razmer programmy budet raven 106 (konec) minus 100 (nachalo), t.e. 6. ® zaprosit' registr CX komandoj: R CX [Return] ® otladchik vydast na etot zapros CX 0000 (nulevoe znachenie) ® ukazat' dlinu programmy - 6, ® zapisat' izmenennuyu programmu: W [Return] V oboih sluchayah DEBUG vydaet soobshchenie "Writing nnnn bytes." (Zapis' nnnn bajtov). Esli nnnn ravno 0, to proizoshla oshibka pri vvode dliny programmy, i neobhodimo povtorit' zapis' cnova. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ Otladchik DOS DEBUG eto dostatochnoe moshchnoe sredstvo, poleznoe dlya otladki assemblernyh programm. Odnako sleduet byt' ostorozhnym s ee ispol'zovaniem, osobenno dlya komandy E (vvod). Vvod dannyh v nepravil'nye adresa pamyati ili vvod nekorrektnyh dannyh mogut privesti k nepredskazuemym rezul'tatam. Na ekrane v etom sluchae mogut poyavit'sya "strannye" simvoly, klaviatura zablokirovana ili dazhe DOS prervet DEBUG i perezagruzit sebya s diska. Kakie libo ser'eznye povrezhdeniya vryad li proizojdut, no vozmozhny nekotorye neozhidannosti, a takzhe poterya dannyh, kotorye vvodilis' pri rabote s otladchikom. Assembler dlya IBM PC. Glava 2 43 Esli dannye, vvedennye v segment dannyh ili segment kodov, okazalis' nekorrektnymi, sleduet, vnov' ispol'zuya komandu E, ispravit' ih. Odnako, mozhno ne zametit' oshibki i nachat' trassipovku programmy. No i zdes' vozmozhno eshche ispol'zovat' komandu E dlya izmenenij. Esli neobhodimo nachat' vypolnenie s pervoj komandy, to sleduet ustanovit' v registre komandnogo ukazatelya (IP) znachenie 0100. Vvedite komandu R (register) i trebuemyj registr v sleduyushchem vide: R IP [Return] Otladchik vydast na ekran soderzhimoe registra IP i perej det v ozhidanie vvoda. Zdes' sleduet vvesti znachenie 0100 i nazhat' dlya proverki rezul'tata komandu R (bez IP). 0tladchik vydast soderzhimoe registrov, flagov i pervuyu vypolnyaemuyu komandu. Teper' mozhno, ispol'zuya komandu T, vnov' vypolnit' trassirovku programmy. Esli vasha programma vypolnyaet kakie-libo podschety, to vozmozhno potrebuetsya ochistka nekotoryh oblostej pamyati i registrov. No ybedites' v sohranenii soderzhimogo registrov CS, DS, SP i SS, kotorye imeyut specificheskoe naznachenie. Prochitajte v rukovodstve po DOS glavu o programme DEBUG. V nastoyashchij moment rekomenduetsya: vvodnyj material i sleduyushchie komandy otladchika: damp (D), vvod (E), shestnadcatirichnyj (H), imya (N), vyhod (Q), registry (R), trassirovka (T) i zapis' (W). Mozhno oznakomit'sya takzhe i s drugimi komandami i proverit' kak oni rabotayut. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 2.1. Napishite mashinnye komandy dlya a) peresylki shest. znacheniya 4629 v registr AX; b) slozheniya shest. 036A s soderzhimym registra AX. 2.2. Predpolozhim, chto byla vvedena sleduyushchaya e komanda: E CS:100 B8 45 01 05 25 00 Vmesto shest.znacheniya 45 predpolagalos' 54. Napisshite komandu E dlya korrektirovki tol'ko odnogo nepravil'no vvedennogo bajta, t.e. neposredstvenno zamenite 45 na 54. 2.3. Predpolozhim, chto vvedena sleduyushchaya e komanda: E CS:100 B8 04 30 05 00 30 CB a) CHto predstavlyayut soboj eti komandy? (Sravnite s pervoj programmoj v etoj glave). b) Posle vypolneniya etoj programmy v registre AX dolzhno byt' znachenie 0460, no v dejstvitel'nosti okazalos' 6004. V chem oshibka i kak ee ispravit'? Assembler dlya IBM PC. Glava 2 44 v) Posle ispravleniya komand neobhodimo snova vypolnit' programmu s pervoj komandy. Kakie dve komandy otladchika potrebuyutsya? 2.4. Imeetsya sleduyushchaya programma v mashinnyh kodah: B0 25 D0 E0 B3 15 F6 E3 CB Programma vypolnyaet sleduyushchee: - peresylaet shest.znachenie 25 v registr AL; - sdvigaet soderzhimoe registra AL na odin bit vlevo (v rezul'tate v AL budet 4A); - peresylaet shest.znachenie 15 v registr BL; - umnozhaet soderzhimoe registra AL na soderzhimoe registra BL. Ispol'zujte otladchik dlya vvoda (E) etoj programmy po adresu CS:100. Ne zabyvajte, chto vse znacheniya predstav leny v shestnadcatirichnom vide. Posle vvoda programmy naberite D CS:100 dlya prosmotra segmenta koda. Zatem vvedite komandu R i neobhodimoe chislo komand T dlya poshagovogo vypolneniya programmy do komandy RET. Kakoe znachenie budet v registre AX v rezul'tate vypolneniya programmy? 2.5. Ispol'zujte otladchik dlya vvoda (E) sleduyushchej programmy v mashinnyh kodah: Dannye: 25 15 00 00 Mashinnyj kod: A0 00 00 D0 E0 F6 26 01 00 A3 02 00 CB Programma vypolnyaet sleduyushchee: - peresylaet soderzhimoe odnogo bajta po adresu DS:00 (25) v registr AL; - sdvigaet soderzhimoe registra AL vlevo na odin bit (poluchaya v rezul'tate 4A); - umnozhaet AL na soderzhimoe odnogo bajta po adresu DS:01 (15); - peresylaet rezul'tat iz AX v slovo, nachinayushcheesya po adresu DS:02. Posle vvoda programmy ispol'zujte komandy D dlya prosmot ra segmenta dannyh i segmenta koda. Zatem vvedite koman du R i neobhodimoe chislo komand T dlya dostizheniya konca programmy (RET). V etot moment registr AX dolzhen soder zhat' rezul'tat 0612. Eshche raz ispol'zujte komandu D DS:00 i zamet'te, chto po adresu DS:02 znachenie zapisano kak 1206. 2.6. Dlya predydushchego zadaniya (2.5) postrojte komandy dlya zapisi programmy na disk pod imenem TRIAL.COM. Assembler dlya IBM PC. Glava 2 45 2.7. Ispol'zuya komandu A otladchika, vvedite sleduyushchuyu pro grammu: MOV BX,25 ADD BX,30 SHL BX,01 SUB BX,22 NOP RET sdelajte assemblirovanie i trassirovku vypolneniya etoj programmy do komandy NOP. Assembler dlya IBM PC. Glava 3 60 GLAVA 3. Trebovaniya yazyka assembler ------------------------------------------------------------ Trebovaniya yazyka assembler Cel': pokazat' osnovnye trebovaniya k programmam na yazyke assemblera i etapy assemblirovaniya, kompanovki i vypolneniya programmy. VVEDENIE ------------------------------------------------------------ V glave 2 bylo pokazano kak vvesti i vypolnit' programmu na mashinnom yazyke. Nesomnenno pri etom oshchutima trudnost' rasshifrovki mashinnogo koda dazhe dlya ochen' nebol'shoj programmy. Somnitel'no, chtoby kto-libo ser'ezno kodiroval programmy na mashinnom yazyke, za isklyucheniem raznyh "zaplat" (korrektirovok) v programme na yazykah vysokogo urovnya i prikladnye programmy. Bolee vysokim urovnem kodirovaniya yavlyaetsya uroven' assemblera, na kotorom programmist pol'zuetsya simvolicheskimi mnemokodami vmesto mashinnyh komand i opisatel'nymi imenami dlya polej dannyh i adresov pamyati. Programma napisannaya simvolicheskimi mnemokodami, kotorye ispol'zuyutsya v yazyke assemblera, predstavlyaet soboj ishodnyj modul'. Dlya formirovaniya ishodnogo modulya primenyayut programmu DOS EDLIN ili lyuboj drugoj podhodyashchij ekrannyj redaktor. Zatem s pomoshch'yu programmy assemblernogo translyato ra ishodnyj tekst transliruetsya v mashinnyj kod, izvestnyj kak ob®ektnaya programma. I nakonec, programma DOS LINK opredelyaet vse adresnye ssylki dlya ob®ektnoj programmy, generiruya zagruzochnyj modul'. V dannoj glave ob®yasnyayutsya trebovaniya dlya prostoj program my na assemblere i pokazany etapy assemblirovaniya, kompanov ki i vypolneniya. KOMMENTARII V PROGRAMMAH NA ASSEMBLERE ------------------------------------------------------------ Ispol'zovanie kommentariev v programme uluchshaet ee yasnost', osobenno tam, gde naznachenie nabora komand neponyatno. Kommentapij vsegda nachinayutsya na lyuboj stroke ishodnogo modulya s simvola tochka s zapyatoj (;) i assembler polagaet v etom sluchae, chto vse simvoly, nahodyashchiesya sprava ot ; yavlyayutsya kommentariem. Kommentarij mozhet soderzhat' lyubye pechatnye simvoly, vklyuchaya probel. Kommentarij mozhet zanimat' vsyu stroku ili sledovat' za komandoj na toj zhe stroke, kak eto pokazano v dvuh sleduyushchih primerah: 1. ;|ta stroka polnost'yu yavlyaetsya kommentariem 2. ADD AX,BX ;Kommentarij na odnoj stroke s komandoj Assembler dlya IBM PC. Glava 3 61 Kommentarii poyavlyayutsya tol'ko v listingah assembliro- vaniya ishodnogo modulya i ne privodyat k generacii mashinnyh kodov, poetomu mozhno vklyuchat' lyuboe kolichestvo kommentariev, ne okazyvaya vliyaniya na effektivnost' vypolneniya programmy. V dannoj knige komandy assemblera predstavleny zaglavnymi bukvami, a kommentarii - strochnymi (tol'ko dlya udobochitae mosti). FORMAT KODIROVANIYA ------------------------------------------------------------ Osnovnoj format kodirovaniya komand assemblera imeet sleduyushchij vid: [metka] komanda [operand(y)] Metka (esli imeetsya), komanda i operand (esli imeetsya) pazdelyayutsya po krajnej mere odnim probelom ili simvolom tabulyacii. Maksimal'naya dlina stroki - 132 simvola, odnako, bol'shinstvo predpochitayut rabotat' so strokami v 80 simvolov (sootvetstvenno shirine ekrana). Primery kodirovaniya: Metka Komanda Operand COUNT DB 1 ;Imya, komanda, odin operand MOV AX,0 ;Komanda, dva operanda Metki Metka v yazyke assemblera mozhet soderzhat' sleduyushchie simvo ly: Bukvy: ot A do Z i ot a do z Cifry: ot 0 do 9 Specsimvoly: znak voprosa (?) tochka (.) (tol'ko pervyj simvol) znak "kommercheskoe et" (@) podcherkivanie (-) dollar ($) Pervym simvolom v metke dolzhna byt' bukva ili specsimvol. Assembler ne delaet razlichiya mezhdu zaglavnymi i strochnymi bukvami. Maksimal'naya dlina metki - 31 simvol. Primery metok: COUNT, PAGE25, $E10. Rekomenduetsya ispol'zovat' opisatel'nye i smyslovye metki. Imena registrov, naprimer, AX, DI ili AL yavlyayutsya zarezervirovannymi i ispol'zuyutsya tol'ko dlya ukazaniya sootvetstvuyushchih registrov. Naprimer, v komande ADD AX,BX assembler "znaet", chto AX i BX otnositsya k registram. Odnako, v komande MOV REGSAVE,AX Assembler dlya IBM PC. Glava 3 62 assembler vosprimet imya REGSAVE tol'ko v tom sluchae, esli ono budet opredeleno v segmente dannyh. V prilozhenii 3 priveden cpisok vseh zarezervirovannyh slov assemblera. Komanda Mnemonicheskaya komanda ukazyvaet assembleru kakoe dejstvie dolzhen vypolnit' dannyj operator. V segmente dannyh komanda (ili direktiva) opredelyaet pole, rabochuyu oblast' ili konstantu. V segmente koda komanda opredelyaet dejstvie, naprimer, peresylka (MOV) ili slozhenie (ADD). Operand Esli komanda specifiruet vypolnyaemoe dejstvie, to operand opredelyaet a) nachal'noe znachenie dannyh ili b) elementy, nad kotorymi vypolnyaetsya dejstvie po komande. V sleduyushchem primere bajt COUNTER opredelen v segmente dannyh i imeet nulevoe znachenie: Metka Komanda Operand COUNTER DB 0 ;Opredelit' bajt (DB) ; s nulevym znacheniem Komanda mozhet imet' odin ili dva operanda, ili voobshche byt' bez operandov. Rassmotrim sleduyushchie tri primera: Komanda Operand Kommentarij Net operandov RET ;Vernut'sya Odin operand INC CX ;Uvelichit' CX Dva operanda ADD AX,12 ;Pribavit' 12 k AX Metka, komanda i operand ne obyazatel'no dolzhny nachinat'sya s kakoj-libo opredelennoj pozicii v stroke. Odnako, rekomen duetsya zapisyvat' ih v kolonku dlya bol'shej ydobochitaemosti programmy. Dlya etogo, naprimer, redaktor DOS EDLIN obespechi vaet tabulyaciyu chepez kazhdye vosem' pozicij. DIREKTIVY ------------------------------------------------------------ Assembler imeet ryad operatorov, kotorye pozvolyayut uppav lyat' processom assemblirovaniya i formirovaniya listinga. |ti operatory nazyvayutsya psevdokomandami ili direktivami. Oni dejstvuyut tol'ko v processe assemblirovaniya programmy i ne generiruyut mashinnyh kodov. Bol'shinstvo direktiv pokazany v sleduyushchih razdelah. V glave 24 podrobno opisany vse direktivy assemblera i privedeno bolee chem dostatochno sootvetstvuyushchej informacii. Glavu 24 mozhno ispol'zovat' v kachestve spravochnika. Direktivy upravleniya listingom: PAGE i TITLE Assembler dlya IBM PC. Glava 3 63 Assembler soderzhit ryad direktiv, upravlyayushchih formatom pechati (ili listinga). Obe direktivy PAGE i TITLE mozhno ispol'zovat' v lyuboj programme. Direktiva PAGE. V nachale programmy mozhno ukazat' kolichest vo strok, raspechatyvaemyh na odnoj stranice, i maksimal'noe kolichestvo simvolov na odnoj stroke. Dlya etoj celi cluzhit direktiva PAGE. Sleduyushchej direktivoj ustanavlivaetsya 60 strok na stranicu i 132 simvola v stroke: PAGE 60,132 Kolichestvo strok na stranice mezhet byt' v predelah ot 10 do 255, a simvolov v stroke - ot 60 do 132. Po umolchaniyu v assemblere ustanovleno PAGE 66,80. Predpolozhim, chto schetchik strok ustanovlen na 60. V etom sluchae assembler, raspechatav 60 strok, vypolnyaet progon lista na nachalo sleduyushchej stranicy i uvelichivaet nomer stranicy na edinicu. Krome togo mozhno zastavit' assembler sdelat' progon lista na konkretnoj stroke, naprimer, v konce segmenta. Dlya etogo neobhodimo zapisat' direktivu PAGE bez operandov. Assembler avtomaticheski delaet progon lista pri obrabotke dipektivy PAGE. Direktiva TITLE. Dlya togo, chtoby vverhu kazhdoj stranicy listinga pechatalsya zagolovok (titul) programmy, ispol'zuetsya dipektiva TITLE v sleduyushchem formate: TITLE tekst Rekomenduetsya v kachestve teksta ispol'zovat' imya program my, pod kotorym ona nahoditsya v kataloge na diske. Naprimer, esli programma nazyvaetsya ASMSORT, to mozhno ispol'zovat' eto imya i opisatel'nyj kommentarij obshchej dlinoj do 60 simvolov: TITLE ASMSORT - Assemblernaya programma sortirovki imen V assemblere takzhe imeetsya direktiva podzagolovka SUBTTL, kotoraya mozhet okazat'sya poleznoj dlya ochen' bol'shih programm, soderzhashchih mnogo podprogramm. Direktiva SEGMENT Lyubye assemblernye programmy soderzhat po krajnej mere odin segment - segment koda. V nekotoryh programmah ispol'zuetsya segment dlya stekovoj pamyati i segment dannyh dlya opredeleniya dannyh. Ascemblernaya direktiva dlya opisaniya segmenta SEGMENT imeet sleduyushchij format: Imya Direktiva Operand imya SEGMENT [parametry] . . Assembler dlya IBM PC. Glava 3 64 . imya ENDS Imya segmenta dolzhno obyazatel'no prisutstvovat', byt' unikal'nym i sootvetstvovat' soglasheniyam dlya imen v assemblere. Direktiva ENDS oboznachaet konec segmenta. Obe direktivy SEGMENT i ENDS dolzhny imet' odinakovye imena. Direktiva SEGMENT mozhet soderzhat' tri tipa parametrov, opredelyayushchih vyravnivanie, ob®edinenie i klass. 1. Vyravnivanie. Dannyj parametr opredelyaet granicu nachala segmenta. Obychnym znacheniem yavlyaetsya PARA, po kotormu segment ustanavlivaetsya na granicu paragrafa. V etom sluchae nachal'nyj adres delitsya na 16 bez ostatka, t.e. imeet shest. adres nnn0. V sluchae otsutstviya etogo operanda assembler prinimaet po umolchaniyu PARA. 2. Ob®edinenie. |tot element opredelyaet ob®edinyaetsya li dannyj segment s drugimi segmentami v processe kompanovki posle assemblirovaniya (poyasneniya sm. v sleduyushchem razdele "Kompanovka programmy"). Vozmozhny sleduyushchie tipy ob®edinenij: STACK, COMMON, PUBLIC, AT vyrazhenie i MEMORY. Segment steka opredelyaetsya sleduyushchim obrazom: imya SEGMENT PARA STACK Kogda otdel'no assemblirovannye programmy dolzhny ob®edi nyat'sya kompanovshchikom, to mozhno ispol'zovat' tipy: PUBLIC, COMMON i MEMORY. V sluchae, esli programma ne dolzhna ob'edinyat'sya s drugimi programmami, to dannaya opciya mozhet byt' opushchena. 3. Klass. Dannyj element, zaklyuchennyj v apostrofy, ispol' zuetsya dlya gruppirovaniya otnositel'nyh segmentov pri kompanovke: imya SEGMENT PARA STACK 'Stack' Fragment programmy na ris. 3.1. v sleduyushchem razdele illyustriruet direktivu SEGMENT i ee razlichnye opcii. Direktiva PROC Segment koda soderzhit vypolnyaemye komandy programmy. Krome togo etot segment takzhe vklyuchaet v sebya odnu ili neskol'ko procedur, opredelennyh direktivoj PROC. Segment, soderzhashchij tol'ko odnu proceduru imeet sleduyushchij vid: imya-segmenta SEGMENT PARA imya-procedury PROC FAR Segment . koda . s . odnoj RET proceduroj Assembler dlya IBM PC. Glava 3 65 imya-procedury ENDP imya-segmenta ENDS Imya procedury dolzhno obyazatel'no prisutstvovat', byt' unikal'nym i udovletvoryat' soglasheniyam po imenam v assemble re. Operand FAR ukazyvaet zagruzchiku DOS, chto nachalo dannoj procedury yavlyaetsya tochkoj vhoda dlya vypolneniya programmy. Direktiva ENDP opredelyaet konec procedury i imeet imya, analogichnoe imeni v direktive PROC. Komanda RET zavershaet vypolnenie programmy i v dannom sluchae vozvrashchaet upravlenie v DOS. Segment mozhet soderzhat' neskol'ko procedur (sm. gl.7). Direktiva ASSUME Processor ispol'zuet registr SS dlya adresacii steka, rkgistr DS dlya adresacii segmenta dannyh i registr CS dlya adresacii cegmenta koda. Assembleru neobhodimo soobshchit' naznachenie kazhdogo segmenta. Dlya etoj celi sluzhit direktiva ASSUME, kodiruemaya v segmente koda sleduyushchim obrazom: Direktiva Operand ASSUME SS:imya_steka,DS:imya_s_dannyh,CS:imya_s_koda Naprimer, SS:imya_steka ukazyvaet, chto assembler dolzhen associirovat' imya segmenta steka s registrom SS. Operandy mogut zapisyvat'sya v lyuboj posledovatel'nosti. Registr ES takzhe mozhet prisutstvovat' v chisle operandov. Esli programma ne ispol'zuet registr ES, to ego mozhno opustit' ili ukazat' ES:NOTHING. Direktiva END Kak uzhe pokazano, direktiva ENDS zavershaet segment, a direktiva ENDP zavershaet proceduru. Direktiva END v svoyu ochered' polnost'yu zavershaet vsyu programmu: Direktiva Operand END [imya_procedury] Operand mozhet byt' opushchen, esli programma ne prednaznache na dlya vypolneniya, naprimer, esli assembliruyutsya tol'ko opre deleniya dannyh, ili eta programma dolzhna byt' skompanovana s drugim (glavnym) modulem. Dlya obychnoj programmy s odnim modulem operand soderzhit imya, ukazannoe v direktive PROC, kotoroe bylo oboznacheno kak FAR. PAMYATX I REGISTRY ------------------------------------------------------------ Rassmotrim osobennosti ispol'zovaniya v komandah imen, imen v kvadratnyh skobkah i chisel. V sleduyushchih primerah polozhim, chto WORDA opredelyaet slovo v pamyati: Assembler dlya IBM PC. Glava 3 66 MOV AX,BX ;Pereslat' soderzhimoe BX v registr AX MOV AX,WORDA ;Pereslat' soderzhimoe WORDA v registr AX MOV AX,[BX] ;Pereslat' soderzhimoe pamyati po adresu ; v registre BX v registr AX MOV AX,25 ;Pereslat' znachenie 25 v registr AX MOV AX,[25] ;Pereslat' soderzhimoe po smeshcheniyu 25 Novym zdes' yavlyaetsya ispol'zovanie kvadratnyh skobok, chto potrebuetsya v sleduyushchih glavah. INICIALIZACIYA PROGRAMMY ------------------------------------------------------------ Sushchestvuet dva osnovnyh tipa zagruzochnyh programm: EXE i COM. Rassmotrim trebovaniya k EXE-programmam, a COM-programmy budut predstavleny v glave 6. DOS imeet chetyre trebovaniya dlya inicializacii assemblernoj EXE-programmy: 1) ukazat' assembleru, kakie cegmentnye registry dolzhny sootvetstvovat' segmentam, 2) sohranit' v steke adres, nahodyashchijsya v regist re DS, kogda programma nachnet vypolnenie, 3) zapisat' v stek nelevoj adres i 4) zagruzit' v registr DS adres segmenta dannyh. Vyhod iz programmy i vozvrat v DOS svoditsya k ispol'zova niyu komandy RET. Ris.3.1 illyustriruet trebovaniya k iniciali zacii i vyhodu iz programmy: 1. ASSUME - eto assemblernaya direktiva, kotoraya ustanavli vaet dlya assemblera sootvetstvie mezhdu konkretnymi segmentami i segmentnymi registrami; v dannom sluchae, CODESG - CS, DATASG - DS i STACKSG - SS. DATASG i STACKSG ne opredeleny v etom primere, no oni budut predstavleny sleduyushchim obrazom: STACKSG SEGMENT PARA STACK Stack 'Stack' DATASG SEGMENT PARA 'Data' Associiruya segmenty s segmentnymi registrami, assembler smozhet opredelit' smeshcheniya k otdel'nym oblastyam v kazhdom segmente. Naprimer, kazhdaya komanda v segmente kodov imeet opredelennuyu dlinu: pervaya komanda imeet smeshchenie 0, i esli eto dvuhbajtovaya komanda, to vtoraya komanda budet imet' smeshchenie 2 i t.d. 2. Zagruzochnomu modulyu v pamyati neposredstvenno predshestvu et 256-bajtovaya (shest.100) oblast', nazyvaemaya prefik som programmnogo segmenta PSP. Programma zagruzchika ispol'zuet registr DS dlya ustanovki adresa nachal'noj tochki PSP. Pol'zovatel'skaya programma dolzhna sohranit' etot adres, pomestiv ego v stek. Pozzhe, komanda RET ispol'zuet etot adres dlya vozvrata v DOS. Assembler dlya IBM PC. Glava 3 67 3. V sisteme trebuetsya, chtoby sleduyushchee znachenie v steke yavlyalos' nulevym adresom (tochnee, smeshcheniem). Dlya etogo komanda SUB ochishchaet registr AX, vychitaya ego iz etogo zhe registra AX, a komanda PUSH zanosit eto znachenie v stek. 4. Zagruzchik DOS ustanavlivaet pravil'nye adresa steka v registre SS i segmenta kodov v registre CS. Poskol'ku programma zagruzchika ispol'zuet registr DS dlya drugih celej, neobhodimo inicializirovat' registr DS dvumya komandami MOV, kak pokazano na ris.3.1. V sleduyushchem razdele etoj glavy "Ishodnaya programma. Primer II" detal'no poyasnyaetsya inicializaciya registra DS. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 3.1. Inicializaciya EXE-programmy. 5. Komanda RET obespechivaet vyhod iz pol'zovatel'skoj programmy i vozvrat v DOS, ispol'zuya dlya etogo adres, zapisannyj v stek v nachale programmy komandoj PUSH DS. Drugim obychno ispol'zuemym vyhodom yavlyaetsya komanda INT 20H. Teper', dazhe esli privedennaya inicializaciya programmy do konca ne ponyatna - ne otchaivajtes'. Kazhdaya programma fakticheski imeet analogichnye shagi inicializacii, tak chto ih mozhno dublirovat' vsyakij raz pri kodirovanii programm. PRIMER ISHODNOJ PROGRAMMY ------------------------------------------------------------ Ris. 3.2. obobshchaet predydushchie svedeniya v prostoj ishodnoj programme na assemblere. Programma soderzhit segment steka - STACKSG i segment koda - CODESG. STACKSG soderzhit odin element DB (opredelit' bajt), kotoryj opredelyaet 12 kopij slova 'STACKSEG'. V posleduyushchih programmah stek ne oppedelyaetsya takim sposobom, no pri ispol'zovanii otladchika dlya prosmotra assemblirovannoj programmy na ekrane, dannoe opredelenie pomogaet lokalizo vat' stek. CODESG soderzhit vypolnyaemye komandy programmy, hotya pervaya direktiva ASSUME ne generiruet koda. Direktiva ASSUME naznachaet registr SS dlya STACKSG i registr CS dlya CODESG. V dejstvitel'nosti, eta direktiva soobshchaet assembleru, chto dlya adresacii v STACKSG neobhodimo ispol'zovat' adres v registre SS i dlya adresacii v CODESG - adres v registre CS. Sistemnyj zagruzchik pri zagruzke programmy s diska v pamyat' dlya vypolneniya ustanavlivaet dejstvitel'nye adresa v registrah SS i CS. Programma ne imeet segmenta dannyh, tak kak v nej net opredeleniya dannyh i, sootvetstvenno, v ASSUME net neobhodimosti assignovat' pegistr DS. Assembler dlya IBM PC. Glava 3 68 Komandy, sleduyushchie za ASSUME - PUSH, SUB i PUSH vypolnyayut standartnye dejstviya dlya inicializacii steka tekushchim adresom v registre DS i nulevym adresom. Poskol'ku, obychno, programma vypolnyaetsya iz DOS, to eti komandy obespechivayut vozvrat v DOS posle zaversheniya programmy. (Mozhno takzhe vypolnit' programmu iz otladchika, hotya eto osobyj sluchaj). Posleduyushchie komandy vypolnyayut te zhe dejstviya, chto pokazany na pis.2.1 v predydushchej glave, kogda rassmatrivalsya otladchik. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® Ne zabyvajte stavit' simvol "tochka s zapyatoj" pered kommentariyami. ® Zavershajte kazhdyj segment direktivoj ENDS, kazhduyu proceduru - direktivoj ENDP, a programmu - direktivoj END. ® V direktive ASSUME ustanavlivajte sootvetstviya mezhdu segmentnymi registrami i imenami segmentov. ® Dlya EXE-programm (no ne dlya COM-programm, sm. gl.6) obespechivajte ne menee 32 slov dlya steka, soblyudajte soglasheniya po inicializacii steka komandami PUSH, SUB i PUSH i zanosite v registr DS adres segmenta dannyh. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 3.1. Kakie komandy zastavlyayut assembler pechatat' zagolovok v nachale kazhdoj stranicy listinga i delat' progon lista? 3.2. Kakie iz sleduyushchih imen nepravil'ny: a) PC_AT, b) $50, v) @$_Z, g) 34B7, d) AX? 3.3. Kakoe naznachenie kazhdogo iz treh segmentov, opisannyh v etoj glave? 3.4. CHto konkretno podrazumevaet direktiva END, esli ona zavershaet a) programmu, b) proceduru, v) segment? 3.5. Ukazhite razlichiya mezhdu direktivoj i komandoj. 3.6. Ukazhite razlichiya v naznachenii RET i END. 3.7. Dlya segmentov koda, dannyh i steka dany imena CDSEG, DATSEG i STKSEG sootvetstvenno. Sformirujte direktivu ASSUME. 3.8. Napishite tri komandy dlya inicializacii steka adresom v DS i nulevym adresom. Assembler dlya IBM PC. Glava 4 79 GLAVA 4. Assemblirovanie i vypolnenie programm ------------------------------------------------------------ Assemblirovanie i vypolnenie programm Cel': pokazat' processy assemblirovaniya, kompanovki i vypolneniya programm. VVEDENIE ------------------------------------------------------------ V dannoj glave ob®yasnyaetsya, kak vvesti v komp'yuter ishodnyj assemblernyj tekst programmy, kak osushchestvit' assemblirovanie, kompanovku i vypolnenie programmy. Krome togo, pokazana generaciya tablicy perekrestnyh ssylok dlya celej otladki. VVOD PROGRAMMY ------------------------------------------------------------ Na ris.3.2. byl pokazan tol'ko ishodnyj tekst programmy, prednaznachennyj dlya vvoda s pomoshch'yu tekstovogo redaktora. Teper' mozhno ispol'zovat' DOS EDLIN ili drugoj tekstovyj redaktor dlya vvoda etoj programmy. Esli vy nikogda ne pol'zovalis' programmoj EDLIN, to imenno sejchas neobhodimo vypolnit' ryad uprazhnenij iz rukovodstva po DOS. Dlya zapuska programmy EDLIN vstavte disketu DOS v diskovod A i formatizovannuyu disketu v diskovod B. CHtoby ubedit'sya v nalichii na diskete svobodnogo mesta dlya ishodnogo teksta, vvedite CHKDSK B:. Dlya vinchestera vo vseh sleduyushchih primerah sleduet ispol'zovat' C: vmesto B:. Dlya vvoda ishodnoj programmy EXASM1, naberite komandu EDLIN V:EXASM1.ASM [Return] V rezul'tate DOS zagruzit EDLIN v pamyati i poyavitsya soobshchenie "New file" i priglashenie "*-". Vvedite komandu I dlya vvoda strok, i zatem naberite kazhduyu assemblernuyu komandu tak, kak oni izobpazheny na ris. 3.2. Hotya chislo probelov v tekste dlya assemblera ne sushchestvenno, starajtes' zapisyvat' metki, komandy, operandy i kommentarii, vyrovnen nymi v kolonki, programma budet bolee ydobochitaemaya. Dlya etogo v EDLIN ispol'zuetsya tabulyaciya cherez kazhdye vosem' pozicij. Posle vvoda programmy ubedites' v ee pravil'nosti. Zatem naberite E (i Return) dlya zaversheniya EDLIN. Mozhno proverit' nalichie programmy v kataloge na diske, vvedite DIR B: (dlya vseh fajlov) ili DIR B:EXASM1.ASM (dlya odnogo fajla) Assembler dlya IBM PC. Glava 4 80 Esli predpolagaetsya vvod ishodnogo teksta bol'shego ob®ema, to luchshim primeneniem budet polnoekrannyj redaktor. Dlya polucheniya raspechatki programmy vklyuchite printer i ustanovite v nego bumagu. Vyzovite programmu PRINT (dlya DOS 2.0 i starshe). DOS zagruzit programmu v pamyat' i raspechataet tekst na printere: PRINT B:EXASM1.ASM [Return] Programma EXASM.ASM eshche ne mozhet byt' vypolnena - prezhde neobhodimo provesti ee assemblirovanie i kompanovku. V sleduyushchem pazdele pokazana eta zhe programma posle assemblirovaniya i poyasneny etapy assemblirovaniya i polucheniya listinga. PODGOTOVKA PROGRAMMY DLYA VYPOLNENIYA ------------------------------------------------------------ Posle vvoda na disk ishodnoj programmy pod imenem EXASM1.ASM neobhodimo prodelat' dva osnovnyh shaga, prezhde chem programmu mozhno budet vypolnit'. Snachala neobhodimo assemblipovat' programmu, a zatem vypolnit' kompanovku. Programmisty na yazyke bejsik mogut vypolnit' programmu srazu posle vvoda ishodnogo teksta, v to vremya kak dlya assemblera i kompillyarnyh yazykov nuzhny shagi translyacii i kompanovki. SHag assemblirovaniya vklyuchaet v sebya translyaciyu ishodnogo koda v mashinnyj ob®ektnyj kod i generaciyu OBJ-modulya. Vy uzhe vstrechali primery mashinnogo koda v glave 2 i primery isxodno go teksta v etoj glave. OBJ-modul' uzhe bolee priblizhen k ispolnitel'noj forme, no eshche ne gotov k vypolneniyu. SHag kompanovki vklyuchaet preobrazo vanie OBJ-modulya v EXE (ispolnimyj) modul', soderzhashchij mashinnyj kod. Progrpmma LINK, nahodyashchayasya na diske DOS, vypolnyaet sleduyushchee: 1. Zavershaet formirovanie v OBJ-module adresov, kotorye ostalis' neopredelennymi posle assemblirovaniya. Vo mno gih sleduyushchih programmah takie adresa assembler otmecha et kak ----R. 2. Kompanuet, esli neobhodimo, bolee odnogo otdel'no assem blirovannogo modulya v odnu zagruzochnuyu (vypolnimuyu) pro grammu; vozmozhno dve ili bolee assemblernyh programm ili assemblernuyu programmu s programmami, napisannymi na yazykah vysokogo urovnya, takih kak Paskal' ili Bejsik. 3. Inicializiruet EXE-modul' komandami zagruzki dlya vypolneniya. Posle kompanovki OBJ-modulya (odnogo ili bolee) v EXE-modul', mozhno vypolnit' EXE-modul' lyuboe chislo raz. No, esli neobhodimo vnesti nekotorye izmeneniya v EXE-modul', sleduet skorrektirovat' ishodnuyu programmu, assemblirovat' ee v drugoj OBJ-modul' i vypolnit' kompanovku OBJ-modulya v Assembler dlya IBM PC. Glava 4 81 novyj EXE-modul'. Dazhe, esli eti shagi poka ostayutsya nepo nyatnymi, vy obnaruzhite, chto, poluchiv nemnogo navyka, ves' process podgotovki EXE-modulya budet doveden do avtomatizma. Zamet'te: opredelennye tipy EXE-programm mozhno preobrazovat' v ochen' effektivnye COM-programmy. Predydushchie primery, odnako, ne covsem podhodyat dlya etoj celi. Dannyj vopros rassmatrivaetsya v glave 6. ASSEMBLIROVANIE PROGRAMMY ------------------------------------------------------------ Dlya togo, chtoby vypolnit' ishodnuyu assemblernuyu program mu, neobhodimo prezhde provesti ee assemblirovanie i zatem kompanovku. Na diskete s assemblernym paketom imeyutsya dve versii assemblera. ASM.EXE - sokrashchennaya versiya s otsutstvi em nekotoryh neznachitel'nyh vozmozhnostej i MASM.EXE - polnaya versiya. Esli razmery pamyati pozvolyayut, to ispol'zujte versiyu MASM (podrobnosti sm. v sootvetstvuyushchem rukovodstve po assembleru). Dlya assemblirovaniya, vstavte assemblernuyu disketu v diskovod A, a disketu s ishodnoj programmoj v diskovod B. Kto imeet vinchester mogut ispol'zovat' v sleduyushchih primepah C vmesto A i B. Prostejshij variant vyzova programmy eto vvod komandy MASM (ili ASM), chto privedet k zagruzke programmy assemblera s diska v pamyat'. Na ekrane poyavitsya: source filename [.ASM]: object filename [filename.OBJ]: source listing [NUL.LST]: cross-reference [NUL.CRF]: Kursor pri etom raspolozhitsya v konce pervoj stroki, gde neobhodimo ukazat' imya fajla. Vvedite nomer diskovoda (esli on ne opredelen umolchaniem) i imya fajla v sleduyushchem vide: B:EXASM1. Ne sleduet nabirat' tip fajla ASM, tak kak assem bler podrazumevaet eto. Vo-vtorom zaprose predpolagaetsya analogichnoe imya fajla (no mozhno ego zamenit'). Esli neobhodimo, vvedite nomer diskovoda B:. Tretij zapros predpolagaet, chto listing assemblirovaniya programmy ne trebuetsya. Dlya polucheniya listinga na diskovode B naberite B: i nazhmite Return. Poslednij zapros predpolagaet, chto listing perekrestnyh csylok ne trebuetsya. Dlya polucheniya listinga na diskovode B, naberite B: i nazhmite Return. Esli vy hotite ostavit' znacheniya po umolchaniyu, to v treh poslednih zaprosah prosto nazhmite Return. Nizhe priveden primer zaprosov i otvetov, v rezul'tate kotoryh assembler dolzhen cozdat' OBJ, LST i CRF-fajly. Vvedite otvety tak, kak pokazano, za isklyucheniem togo, chto nomer diskovoda mozhet byt' inoj. source filename [.ASM]:B:EXASM1 [Return] Assembler dlya IBM PC. Glava 4 82 object filename [filename.OBJ]:B: [Return] source listing [NUL.LST]:B: [Return] cross-reference [NUL.CRF]:B: [Return] Vsegda neobhodimo vvodit' imya ishodnogo fajla i, obychno, zaprashivat' OBJ-fajl - eto trebuetsya dlya kompanovki programmy v zagruzochnyj fajl. Vozmozhno potrebuetsya ukazanie LST-fajla, osobenno, esli neobhodimo proverit' sgenerirovan nyj mashinnyj kod. CRF-fajl polezen dlya ochen' bol'shih programm, gde neobhodimo videt', kakie komandy ssylayutsya na kakie polya dannyh. Krome togo, assembler generiruet v LST-fajle nomera strok, kotorye ispol'zuyutsya v CRF-fajle. V prilozhenii 4 "Rezhimy assemblirovaniya i redaktirovaniya" perechisleny rezhimy (opcii) dlya assemblera versij 1.0 i 2.0. Assembler preobrazuet ishodnye komandy v mashinnyj kod i vydaet na ekran soobshcheniya o vozmozhnyh oshibkah. Tipichnymi oshibkami yavlyayutsya narusheniya assemblernyh soglashenij po imenam, nepravil'noe napisanie komand (naprimer, MOVE vmesto MOV), a takzhe nalichie v opepandah neopredelennyh imen. Programma ASM vadaet tol'ko kody oshibok, kotorye ob®yasneny v rukovodstve po assembleru, v to vremya kak programma MASM vydaet i kody oshibok, i poyasneniya k nim. Vsego imeetsya okolo 100 soobshchenij ob oshibkah. Assembler delaet popytki skorrektirovat' nekotorye oshibki, no v lyubom sluchae sleduet perezagruzit' tekstovyj redaktor, ispravit' ishodnuyu programmu (EXASM1.ASM) i povtorit' assemblirovanie. Na ris. 4.1. pokazan listing, poluchennyj v rezul'tate ascemblirovaniya programmy i zapisannyj na disk pod imenem EXASM1.LST. V nachale listinga obratite vnimanie na reakciyu assemblera na direktivy PAGE i TITLE. Nikakie direktivy, vklyuchaya SEGMENT, PROC, ASSUME i END ne generiruyut mashinnyh kodov. Listing soderzhit ne tol'ko ishodnyj tekst, no takzhe sleva translirovannyj mashinnyj kod v shestnadcatirichnom formate. V samoj levoj kolonke nahoditsya shest.adresa komand i dannyh. Segment steka nachinaetsya s otnositel'nogo adresa 0000. V dejstvitel'nosti on zagruzhaetsya v pamyat' v sootvetstvii s adpesom v registre SS i nulevym smeshcheniem otnositel'no etogo adpesa. Direktiva SEGMENT ustanavlivaet 16-kratnyj adres i ukazyvaet assembleru, chto eto est' nachalo steka. Sama direktiva ne generiruet mashinnyj kod. Komanda DB, takzhe nahoditsya po adresu 0000, soderzhit 12 kopij slova 'STACKSEG'; mashinnyj kod predstavlen shest.0C (desyatichnoe 12) i shest. predstavleniem ASCII simvolov. (V dal'nejshem mozhno ispol'zovat' otladchik dlya prosmotra rezul'tatov v pamyati). Segment steka zakanchivaetsya po adresu shest. 0060, kotoryj ekvivalenten desyatichnomu znacheniyu 96 (12h8). ------------------------------------------------------------ ------------------------------------------------------------ Ris. 4.1. Listing assemblirovaniya programmy Assembler dlya IBM PC. Glava 4 83 Segment koda takzhe nachinaetsya s otnositel'nogo adresa 0000. On zagruzhaetsya v pamyat' v sootvetstvii s adresom v pegistre CS i nulevym smeshcheniem otnositel'no etogo adresa. Poskol'ku ASSUME yavlyaetsya direktivoj assembleru, to pervaya komanda, kotoraya generiruet dejstvitel'nyj mashinnyj kod est' PUSH DS - odnobajtovaya komanda (1E), nahodyashchayasya na nu