, poskol'ku programma mozhet zanimat'sya manipulyaciyami s ekranom, ne zabotyas' o postoyannoj proverke statusa knopok. Odnako eto sushchestvenno zamedlyaet skorost' vypolneniya programmy, poskol'ku proverka statusa knopok osushchestvlyaetsya posle vypolneniya kazhdogo operatora. Po etoj prichine, STRIG rabotaet tol'ko kogda on prednamerenno vklyuchen, a on mozhet vklyuchat'sya i vyklyuchat'sya po hodu programmy. STRIG rabotaet dvumya sposobami. Vo-pervyh, on mozhet rabotat' kak funkciya, kotoraya neposredstvenno chitaet tekushchie znacheniya knopok, v forme X = STRIG(n). Zdes' n - kodovyj nomer: 0 Knopka A1 nazhata so vremeni poslednego vyzova 1 Knopka A1 v dannyj moment otpushchena 2 Knopka B1 nazhata so vremeni poslednego vyzova 3 Knopka B1 v dannyj moment otpushchena 4 Knopka A2 nazhata so vremeni poslednego vyzova 5 Knopka A2 v dannyj moment otpushchena 6 Knopka B2 nazhata so vremeni poslednego vyzova 7 Knopka B2 v dannyj moment otpushchena Vo vseh sluchayah funkciya vozvrashchaet -1, esli opisanie primenimo i 0 - esli net. Vtoroj sposob ispol'zovaniya STRIG eto forma, v kotoroj on avtomaticheski pereklyuchaet na proceduru pri nazhatii knopki. Nado napisat' ON STRIG(n) GOSUB nomerstroki. Nomer stroki daet nachal'- nyj nomer stroki procedury. CHislo n otnositsya k knopke, gde 0 = A1, 2 = B1, 4 = A2 i 6 = B2. Kazhdaya knopka mozhet obrabatyvat'sya svoej proceduroj ili mozhet byt' odna procedura dlya vseh knopok. Dlya aktivizacii funkcii STRIG vklyuchite v programmu operator STRIG(n) ON. V kachestve znacheniya n ispol'zuyutsya chetyre perechis- lennyh koda. CHtoby otmenit' ego (uskoryaya rabotu programmy) napi- shite STRIG(n) OFF. Imeetsya takzhe tret'ya vozmozhnost'. STRING(n) STOP privodit k tomu, chto nazhatie knopki zapominaetsya, no nikakih dejstvij ne predprinimaetsya do ocherednogo operatora STRING(n) ON. |to svojstvo predohranyaet ot nezhelatel'nyh pereryvov iz-za opera- tora ON STRING GOSUB. Tem ne menee, pri vypolnenii usloviya STRIG(n) STOP programma zamedlyaetsya. Sleduyushchij primer pokazyvaet dejstvie ON STRIG GOSUB. Primer punkta [7.3.3] soderzhit stroki, pokazyvayushchie formu X = STRIG. 100 ON STRIG(0) GOSUB 5000 'perehod na 5000 pri nazhatii . 'knopki A1 200 STRIG(0) ON 'vklyuchaem proverku nazhatiya knopki . 300 STRIG(0) STOP 'otmenyaem uhod na proceduru . 400 STRIG(0) ON 'vozobnovlyaem uhod na proceduru . 500 STRIG(0) OFF 'otmenyaem proverku nazhatiya knopki . 5000 '''zdes' nahoditsya procedura obrabotki nazhatiya knopki A1 . 5500 RETURN 'vozvrat k tomu mestu, otkuda popali syuda Srednij uroven'. Tol'ko AT predostavlyaet podderzhku dzhojstika na urovne opera- cionnoj sistemy. Funkciya 84H preryvaniya 15H vozvrashchaet ustanovku knopok v bitah 4-7 registra AL, kak pokazano nizhe. Pri vhode DX dolzhen soderzhat' 0; kogda DX soderzhit 1, to vmesto etogo vozvra- shchayutsya koordinaty dzhojstika [7.3.3]. Pri vozvrate registr pereno- sa ustanavlivaetsya, kogda mashina ne imeet igrovogo porta. ;---proveryaem knopku #2 dzhojstika B (bit 7) MOV AH,84H ;nomer funkcii MOV DX,0 ;zapros sostoyaniya knopok INT 15H ;vyzov funkcii JC NO_JOYSTICK ;esli net dzhojstika, to na vyhod TEST AL,10000000B ;proveryaem bit 7 JNZ BUTTON_DOWN ;perehod esli knopka nazhata Nizkij uroven'. Bity 7-4 porta s adresom 201H soderzhat status knopok, svyazan- nyh s igrovym portom. Znachenie bitov menyaetsya v zavisimosti ot togo, prisoedineny li dzhojstiki ili vesla: Bit Dzhojstik Veslo 7 Knopka #2 dzhojstika B Knopka vesla D 6 Knopka #1 dzhojstika B Knopka vesla C 5 Knopka #2 dzhojstika A Knopka vesla B 4 Knopka #1 dzhojstika A Knopka vesla A Programme nuzhno prosto prochitat' znachenie iz porta i proverit' ustanovku sootvetstvuyushchih bitov: MOV DX,201H ;adres porta igrovogo adaptera IN AL,DX ;poluchaem znachenie iz nego TEST AL,0010B ;proveryaem bit 1 (knopka A2 nazhata?) JNZ BUTTON_A2 ;esli da, to na proceduru obrabotki Programma imeet obychno bolee vazhnye dela, chem postoyanno proveryat' igrovoj port, odnako nastol'ko zhe byssmyslenno vremya ot vremeni proveryat' port, rassovyvaya proceduru po raznym chastyam programmy. CHtoby poluchit' effekt otlova nazhatiya knopok, analogichnyj opisan- nomu v Bejsike, Vam pridetsya sozdat' dopolnenie k preryvaniyu vremeni sutok, kak opisano v [2.1.7]. Preryvanie obychno vypol- nyaetsya 18.2 raza v sekundu i kazhdyj raz Vy mozhete proveryat' igro- voj port i predprinimat' nuzhnye dejstviya pri neobhodimosti. Prilozheniya. Prilozhenie A. Dvoichnye i shestnadcatirichnye chisla i adresaciya pamyati. Osnovnoj edinicej hraneniya dannyh v komp'yutere yavlyaetsya bit. V bol'shinstve mikrokomp'yuterov vosem' bitov ob®edineny v bajt, pri etom kazhdyj bit bajta mozhet byt' ustanovlen ili "vklyuchen" (= 1) ili sbroshen ili "vyklyuchen" (= 0), dopuskaya 256 raznyh variantov. Takim obrazom, v odnom bajte mozhno predstavit' 256 raznyh simvo- lov (rasshirennyj nabor kodov ASCII) ili celoe chislo v diapazone ot 0 do 255. Hotya my privykli zapisyvat' eti chisla v desyatichnoj forme, oni mogut zapisyvat'sya takzhe v dvoichnoj ili shestnadcati- richnoj forme - ih znacheniya pri etom ne izmenyayutsya, a programmy mogut s odinakovoj legkost'yu chitat' eti znacheniya kak v toj, tak i v drugoj forme. Vmesto togo, chtoby govorit', chto v odnom bajte mogut hranit'sya chisla ot 0 do 255, mozhno skazat', chto mogut hra- nit'sya dvoichnye chisla ot 00000000 do 11111111 ili shestnadcatirich- nye chisla ot 00 do FF. Poskol'ku mozhno pereputat' raznye formy, to dvoichnye i shestnadcatirichnye chisla otmechayutsya special'nym obrazom. V yazyke assemblera za dvoichnymi chislami sleduet bukva B, a za shestnadcatirichnymi chislami - bukva H, naprimer, 11111111B ili FFH. Bejsik firmy Microsoft predvaryaet shestnadcatirichnye chisla simvolami &H, naprimer &FFH; k sozhaleniyu, on ne raspoznaet chisla v dvoichnoj forme. Dvoichnye chisla: Kogda soderzhimoe bajta predstavlyaetsya v dvoichnoj forme, to trebuetsya 8 cifr. Kazhdaya cifra sootvetstvuet odnomu bitu, kotorye numeruyutsya ot 0 do 7. Kak i v desyatichnyh chislah cifry raspola- gayutsya sprava nalevo, ot mladshih k starshim razryadam. V otlichii ot desyatichnyh chisel, v kotoryh kazhdaya posleduyushchaya cifra vesit v 10 raz bol'she svoej sosedki sprava, dvoichnye cifry imeyut tol'ko vdvoe bol'shij ves. Takim obrazom, samaya pravaya cifra schitaet edinicy, vtoraya - dvojki, tret'ya - chetverki i t.d., do znacheniya 128 dlya vos'moj cifry bajta. |to oznachaet, chto esli pervaya cifra ravna 1, to pribavlenie k nej 1 privodit k tomu, chto ona stanet 0, a 1 budet perenesena vo vtoruyu cifru, kak dlya desyatichnyh chisel 9 + 1 = 0 i perenos edinicy v sleduyushchij razryad. Vot kak chisla pervogo desyatka predstavlyayutsya v dvoichnoj forme: 00000000 0 00000001 1 00000010 2 00000011 3 00000100 4 00000101 5 00000110 6 00000111 7 00001000 8 00001001 9 00001010 10 V etoj posledovatel'nosti bol'shinstvo nulej sleva neobyazatel'- ny, t.e. etu posledovatel'nost' mozhno zapisat' i v vide 0, 1, 10, 11, 100, 101 i t.d. Nuli vklyucheny tol'ko dlya togo, chtoby napom- nit' Vam, chto bajt sostavlyaetsya vosem'yu ciframi, sootvetstvuyushchimi bitam. V to vremya kak nabor nulej i edinic mozhet byt' neskol'ko utomitel'nym, Vy mozhete legche rabotat' s dvoichnymi chislami, esli budete predstavlyat' ih sebe sleduyushchim obrazom: bit 7 6 5 4 3 2 1 0 znachenie 128 64 32 16 8 4 2 1 Kogda Vy vstrechaete dvoichnoe chislo 10000001, to ustanovleny bity 7 i 0. Bit 7 sootvetstvuet 128, a bit 0 - 1, poetomu desyatichnoe znachenie bajta ravno 129. Esli etot bajt predstavlyaet simvol, to on sootvetstvuet kodu ASCII 129, kotoryj predstavlyaet bukvu u s umlyautom (v al'ternativnoj kodirovke GOSTa - bukvu B). Naoborot, chtoby opredelit' cepochku bitov dlya bukvy A, kotoraya ravna ASCII Prilozhenie B. Bitovye operacii v Bejsike. V Bejsike nel'zya ispol'zovat' chisla v dvoichnoj forme. On rass- matrivaet cepochku bitov 11000000 kak 11 millionov, a ne kak 192. Odnako manipulyacii s cepochkami bitov chasto neobhodimy pri prog- rammirovanii, poskol'ku trebuetsya chitat' i izmenyat' soderzhimoe statusnyh bajtov i statusnyh registrov. V bol'shinstve sluchaev k cepochkam bitov primenyayutsya dve logi- cheskie operacii. |to operacii ILI (OR) i I (AND) i obe oni dos- tupny v Bejdiapazone ot 0 do 255. Hotya my privykli zapisyvat' eti chisla v desyatichnoj forme, oni mogut zapisyvat'sya takzhe v dvoichnoj ili shestnadcati- richnoj forme - ih znacheniya pri etom ne izmenyayutsya, a programmy mogut s odinakovoj legkost'yu chitat' eti znacheniya kak v toj, tak i v drugoj forme. Vmesto togo, chtoby govorit', chto v odnom bajte mogut hranit'sya chisla ot 0 do 255, mozhno skazat', chto mogut hra- nit'sya dvoichnye chisla ot 00000000 do 11111111 ili shestnadcatirich- nye chisla ot 00 do FF. Poskol'ku mozhno pereputat' raznye formy, to dvoichnye i shestnadcatirichnye chisla otmechayutsya special'nym obrazom. V yazyke assemblera za dvoichnymi chislami sleduet bukva B, a za shestnadcatirichnymi chislami - bukva H, naprimer, 11111111B ili FFH. Bejsik firmy Microsoft predvaryaet shestnadcatirichnye chisla simvolami &H, naprimer &FFH; k sozhaleniyu, on ne raspoznaet chisla v dvoichnoj forme. Dvoichnye chisla: Kogda soderzhimoe bajta predstavlyaetsya v dvoichnoj forme, to trebuetsya 8 cifr. Kazhdaya cifra sootvetstvuet odnomu bitu, kotorye numeruyutsya ot 0 do 7. Kak i v desyatichnyh chislah cifry raspola- gayutsya sprava nalevo, ot mladshih k starshim razryadam. V otlichii ot desyatichnyh chisel, v kotoryh kazhdaya posleduyushchaya cifra vesit v 10 raz bol'she svoej sosedki sprava, dvoichnye cifry imeyut tol'ko vdvoe bol'shij ves. Takim obrazom, samaya pravaya cifra schitaet edinicy, vtoraya - dvojki, tret'ya - chetverki i t.d., do znacheniya 128 dlya vos'moj cifry bajta. |to oznachaet, chto esli pervaya cifra ravna 1, to pribavlenie k nej 1 privodit k tomu, chto ona stanet 0, a 1 budet perenesena vo vtoruyu cifru, kak dlya desyatichnyh chisel 9 + 1 = 0 i perenos edinicy v sleduyushchij razryad. Vot kak chisla pervogo desyatka predstavlyayutsya v dvoichnoj forme: 00000000 0 00000001 1 00000010 2 00000011 3 00000100 4 00000101 5 00000110 6 00000111 7 00001000 8 00001001 9 00001010 10 V etoj posledovatel'nosti bol'shinstvo nulej sleva neobyazatel'- ny, t.e. etu posledovatel'nost' mozhno zapisat' i v vide 0, 1, 10, 11, 100, 101 i t.d. Nuli vklyucheny tol'ko dlya togo, chtoby napom- nit' Vam, chto bajt sostavlyaetsya vosem'yu ciframi, sootvetstvuyushchimi bitam. V to vremya kak nabor nulej i edinic mozhet byt' neskol'ko utomitel'nym, Vy mozhete legche rabotat' s dvoichnymi chislami, esli budete predstavlyat' ih sebe sleduyushchim obrazom: bit 7 6 5 4 3 2 1 0 znachenie 128 64 32 16 8 4 2 1 Kogda Vy vstrechaete dvoichnoe chislo 10000001, to ustanovleny bity 7 i 0. Bit 7 sootvetstvuet 128, a bit 0 - 1, poetomu desyatichnoe znachenie bajta ravno 129. Esli etot bajt predstavlyaet simvol, to on sootvetstvuet kodu ASCII 129, kotoryj predstavlyaet bukvu u s umlyautom (v al'ternativnoj kodirovke GOSTa - bukvu B). Naoborot, chtoby opredelit' cepochku bitov dlya bukvy A, kotoraya ravna ASCII bloki. Naboru blokov predshestvuet "lider", kotoryj sostoit iz 256 bajtov ASCII 1. Lider zavershaetsya nulevym bitom sinhronizacii. Zatem sleduet bajt sinhronizacii so znacheniem 16H, a zatem 256 bajtov dannyh. Posle etogo idut 2 bajta kontrolya oshibok, a zatem novyj blok dannyh, soprovozhdayushchijsya paroj bajt proverki oshibok i t.d. Vsya posledovatel'nost' zavershaetsya chetyrehbajtnym "hvostom", soderzhashchim kody ASCII 1. Dlya chteniya dannyh s kassety na do ispol'zovat' funkciyu 2 pre- ryvaniya 15H. Net neobhodimosti otkryvat' fajl, kak eto delaetsya pri diskovyh operaciyah. ES:BX ukazyvayut na bufer v pamyati, kuda budut posylat'sya dannye, a CX - chislo bajtov, kotorye nado schi- tat'. Pri vozvrate DX soobshchit skol'ko bajtov prochitano na samom dele, a ES:BX budut ukazyvat' na poslednij schitannyj bajt plyus 1. Flag perenosa budet raven 0, esli chtenie proshlo uspeshno, a v protivnom sluchae AH budet soderzhat' 1, esli problema s kontrolem oshibki, 2 - pri oshibke chteniya dannyh i 3 - pri otsutstvii dannyh na lente. Funkciya 3 preryvaniya 15H zapisyvaet dannye na kassetu. ES:BX ukazyvayut na pervyj bajt dannyh, a CX soderzhit chislo bajtov, kotoroe nado zapisat'. Pri vozvrate ES:BX ukazyvayut na bajt, sleduyushchij za poslednim zapisannym. Motor upravlyaetsya funkciyami 0 (vklyuchenie) i 1 (vyklyuchenie) preryvaniya 15H. Dlya etih funkcij net vyhodnyh registrov. 7.3.2 CHtenie pozicii svetovogo pera. Hotya ochen' nemnogie komp'yutery osnashcheny svetovym perom, tem ne menee eto odno iz nemnogih vspomogatel'nyh ustrojstv, kotoroe podderzhivaetsya kak oborudovaniem, tak i operacionnoj sistemoj. Svetovoe pero rabotaet s pomoshch'yu nebol'shogo opticheskogo detektora na konchike pera. Po hodu skanirovaniya ekrana elektronnym luchom iniciiruetsya impul's opticheskogo detektora, kogda puchok dostigaet tochki ekrana, nad kotoroj nahoditsya pero. Vremya vozniknoveniya etogo impul'sa, otnositel'no signalov gorizontal'noj i vertikal'- noj sinhronizacii, pozvolyaet opredelit' poziciyu svetovogo pera. Vysokij uroven'. Bejsik mozhet opredelyat' poziciyu svetovogo pera dvumya sposoba- mi. Pri pervom programma nepreryvno opredelyaet status pera. Pri vtorom, kogda pero ispol'zuetsya, to upravlenie vremenno peredaet- sya procedure, obespechivaemoj Vashej programmoj. Dlya nepreryvnogo kontrolya za perom nado ispol'zovat' operator PEN kak funkciyu v forme X = PEN(n), gde n - kodovyj nomer, opredelyayushchij kakuyu in- formaciyu Vy hotite poluchit' o pere i ego pozicii. Vozmozhnye zna- cheniya n takie: 0 vozvrashchaet -1, esli pero bylo vyklyucheno so vremeni posled- nego zaprosa, 0 - esli net 1 vozvrashchaet poslednyuyu koordinatu x (0-319 ili 0-639), v ko- toroj pero bylo vklyucheno (ono moglo byt' vposledstvii peredvinuto, esli ostavalos' vklyuchennym) 2 vozvrashchaet poslednyuyu koordinatu y (0-199), v kotoroj pero bylo vklyucheno. 3 vozvrashchaet -1, esli pero vklyucheno i 0 - esli net 4 vozvrashchaet tekushchuyu x koordinatu (0-319 ili 0-639) pera 5 vozvrashchaet tekushchuyu y koordinatu (0-199) pera 6 vozvrashchaet poziciyu - nomer stroki (1-24), v kotoroj pero bylo poslednij raz aktivizirovano 7 vozvrashchaet poziciyu - nomer stolbca (1-40 ili 1-80), v ko- toroj pero bylo poslednij raz aktivizirovano 8 vozvrashchaet tekushchuyu poziciyu - nomer stroki (1-24) 9 vozvrashchaet tekushchuyu poziciyu - nomer stolbca (1-40 ili 1-80) V dannom primere opredelyaetsya vklyucheno li pero, i esli eto tak, to beretsya tekushchee ego polozhenie: 100 IF NOT PEN(3) THEN 130 'proveryaem vklyucheno li pero 110 X = PEN(4) 'poluchaem koordinatu tochki po osi x 120 Y = PEN(5) 'poluchaem koordinatu tochki po osi y 130 ... 'prodolzhaem programmu Bolee gibkie vozmozhnosti ispol'zovaniya svetovogo pera predos- tavlyayutsya operatorom ON PEN GOSUB. |tot operator ukazyvaet nomer stroki, v kotoroj nachinaetsya procedura, aktiviziruemaya pri vklyu- chenii pera. Bejsik dostigaet etogo proverkoj sostoyaniya pera posle vypolneniya kazhdoj ego instrukcii. Procedura mozhet poluchit' pozi- ciyu pera i predprinyat' trebuemye dejstviya. Kogda procedura zakan- chivaetsya, to programma prodolzhaetsya s togo mesta, gde ona byla pri vklyuchenii pera. ON PEN GOSUB ne rabotaet do teh por, poka ona ne aktivizirova- na operatorom PEN ON. PEN OFF otmenyaet ee rabotu. Smysl etogo sostoit v tom, chto postoyannaya proverka statusa pera zamedlyaet rabotu programmy, poetomu ee nado osushchestvlyat' tol'ko kogda eto neobhodimo. Esli programma nachinaet vypolnyat' kritichekuyu chast' koda, kogda nel'zya ispol'zovat' proceduru ON PEN GOSUB, napishite PEN STOP. V etom sluchae budet prodolzhat'sya proverka statusa pera, i esli pero budet vklyucheno, to etot fakt budet zapomnen. Odnako poka ne budet vstrechen operator PEN ON, upravlenie ne budet pere- davat'sya procedure ON PEN GOSUB. Dannyj primer vyzyvaet ostanovku programmy, kogda nazhata knop- ka na svetovom pere. Tochka v pozicii svetovogo pera vklyuchaetsya proceduroj, obrabatyvayushchej vklyuchenie ERROR ;na obrabotku oshibki INC BX ;uvelichivaem ukazatel' LOOP NEXT_CHAR ;vyvodim sleduyushchij simvol Standartnoe preryvanie MS DOS dlya vyvoda na printer eto funk- ciya 5 preryvaniya 21H. Prosto pomestite simvol v DL i vypolnite preryvanie. |ta funkciya vsegda vyvodit na LPT1 i u nee net vozv- rashchaemyh registrov. ;---vyvod dannyh na LPT1 MOV AH,5 ;nomer funkcii MOV DL,CHAR ;gotovim pechataemyj simvol INT 21H ;posylaem ego na pr ;N,1)*2^(N-1) 2040 NEXT 2050 RETURN Prilozhenie V. Osnovnye svedeniya ob yazyke assemblera. CHitatel' etoj knigi, ne znakomyj s yazykom assemblera, skoro pojmet, chto mnogie programmistskie tryuki ne mogut byt' dostignuty drugimi sredstvami. Hotya izuchenie yazyka assemblera trebuet ot- del'noj knigi, v etom prilozhenii privodyatsya osnovnye ponyatiya, kotorye pomogut novichkam razobrat'sya v primerah na etom yazyke. Vnimatel'nyj prosmotr razdelov, posvyashchennyh srednemu i nizkomu urovnyam, dast Vam vozmozhnost' poluchit' predstavlenie o tom, kak rabotaet assembler, posle chego namnogo legche izuchit' raznye chast- nye voprosy. Zdes' obsuzhdayutsya ne vse assemblernye instrukcii, vstrechayushchiesya v programmah, no Vy obnaruzhite, chto okolo 95 % instrukcij, vstrechennyh Vami v programmah, opisany zdes', a zna- chenie ostal'nyh mozhet byt' ponyato blagodarya kommentariyam k prog- rammam. Mikroprocessor 8088 imeet 13 16-razryadnyh registrov, kazhdyj iz kotoryh imeet svoi funkcii. V to vremya kak v yazykah vysokogo urovnya Vy mozhete pomestit' dva chisla v peremennye, a zatem slo- zhit' eti peremennye, to v yazyke assemblera eti chisla pomeshchayutsya v registry mikroprocessora, a zatem skladyvayutsya znacheniya, soderzha- shchiesya v registrah. Vse operacii v yazyke assemblera sostoyat v obmene dannyh s registrami, a zatem vypolnenii operacij na re- gistrah, takih kak izmenenie otdel'nyh bitov, vypolnenie arifme- ticheskih operacij i t.d. Odnoj iz prichin vysokoj effektivnosti yazyka assemblera yavlyaetsya hranenie dannyh v registrah mikropro- cessora; kompilyatory imeyut tendenciyu vozvrashchat' vse znacheniya v pamyat' posle vypolneniya operacii, a dostup k pamyati trebuet bol'- shogo vremeni. Na ris. V-1 pokazany 13 registrov mikroprocessorov 8088 i 80286 (poslednij imeet dopolnitel'nye sredstva dlya mnogo- zadachnoj raboty, kotorye my ne budem rassmatrivat' zdes'). Registry AX, BX, CX i DX yavlyayutsya registrami obshchego naznache- niya. Ih osobennost' sostoit v tom, chto operacii mogut proizvo- dit'sya ne tol'ko nad soderzhimym vsego registra, no takzhe i nad polovinoj. Kazhdyj iz chetyreh registrov delitsya na starshuyu i mlad- shuyu chasti, naprimer, AH oboznachaet starshuyu polovinu registra AX, a AL - mladshuyu. Tochno tak zhe assemblernaya programma mozhet imet' dostup k BH, BL, CH, CL, DH i DL. |to svojstvo ochen' polezno, poskol'ku chasto programme prihoditsya rabotat' s bajtnymi velichi- nami. Registry BP, SI i DI takzhe dostatochno udobny, hotya oni mogut prinimat' tol'ko 16-bitnye znacheniya. Kazhdyj bit registra flagov soobshchaet o sootvetstvuyushchem statuse processora, naprimer, o tom, chto pri vypolnenii arifmeticheskoj operacii byl perenos za razryadnuyu setku. V obshchem sluchae znacheniya pomeshchayutsya v registry s pomoshch'yu inst- rukcii MOV. MOV AX,BX peresylaet soderzhimoe registra BX v AX, zatiraya ranee soderzhashcheesya v AX znachenie. MOV AH,BL privodit k peresylke bajta iz registra v registr, no MOV AX,BL - nedopusti- maya instrukciya, tak kak znacheniya dolzhny imet' odinakovyj razmer. Instrukciya MOV mozhet' takzhe peredavat' znacheniya iz pamyati, napri- mer, MOV AX,ACCT_NUMBER. Zdes' ACCT_NUMBER - imya peremennoj, kotoruyu sozdal programmist, sovsem kak v yazyke vysokogo urovnya. Peremennaya sozdaetsya operatorom vida ACCT_NUMBER DW 0. |tot ope- rator ostavlyaet mesto dlya slova (dvuh bajtov), prisvaivaya im znachenie 0. Drugie dopustimye simvoly v etom operatore eto DD - dlya dvojnogo slova i DB - dlya bajta ili strok. Assembler sledit za adresami peremennyh, poetomu pri assemblirovanii operatora MOV AX,ACCT_NUMBER imya peremennoj zamenyaetsya na ee adres. Rabota s imenami peremennyh - samyj prostoj sposob identifika- cii dannyh v programmah na yazyke assemblera. No imeyutsya razlichnye sposoby hitroj adresacii, kotorye pozvolyayut programme hranit' massivy ili ispol'zovat' ukazateli. Naprimer, MOV AX,[BX][SI] posylaet v AX znachenie, kotoroe soderzhitsya po smeshcheniyu, ravnomu summe znachenij registrov BX i SI. No ot chego otschityvat' smeshche- nie? Otvet zaklyuchaetsya v tom, chto vse dannye sobrany v odnu chast' programmy, a ves' ispolnyaemyj kod - v druguyu. CHast', otvedennaya pod dannye, nazyvaetsya segmentom dannyh, a pod programmu - kodo- vym segmentom. Vse peremennye, otvedennye dlya hraneniya dannyh, adresuyutsya cherez smeshchenie otnositel'no nachala segmenta dannyh. Poziciya v pamyati, s kotoroj nachinaetsya segment dannyh, hranit- sya v registre DS, odnom iz chetyreh segmentnyh registrov. Kak i vse ostal'nye registry mikroprocessora on 16-razryadnyj, poetomu on ne mozhet soderzhat' chisla, bol'shie chem 65535. Kakim zhe obrazom segment danyh mozhet ukazyvat' na yachejki pamyati, raspolozhennye v verhnej chasti megabajtnogo adresnogo prostranstva? Otvet sostoit v tom, chto segmentnye registry avtomaticheski umnozhayutsya na 16, a rezul'tat ukazyvaet na mesto v pamyati, s kotorogo nachinaetsya segment. Takim obrazom, segmenty vsegda vyravneny na 16-bajtnuyu granicu. Posle togo kak segment ustanovlen, vse ostal'nye regist- ry mogut soderzhat' smeshcheniya, ukazyvayushchie na lyuboj iz sleduyushchih 65535 bajtov. Registr dopolnitel'nogo segmenta (ES) takzhe ispol'- zuetsya dlya ukazaniya na dannye, hranyashchiesya v pamyati. Sredi assemblernyh instrukcij, kotorye Vy chasto budete vstre- chat' v etoj knige, est' instrukcii zagruzki segmentnyh i otnosi- tel'nyh adresov peremennyh. MOV AX,SEG ACCT_NUMBER pomeshchaet zna- chenie segmentnogo registra, v kotorom raspolozhen ACCT_NUMBER v AX, a vposledstvii eto znachenie budet pereslano v DS. MOV BX,OFF- SET ACCT_NUMBER pomeshchaet v BX smeshchenie peremennoj ACCT_NUMBER v segmente dannyh. Posle vypolneniya etih operacij DS:BX budut uka- zyvat' na ACCT_NUMBER. Esli ACCT_NUMBER yavlyaetsya odnomernym mas- sivom, to dlya ukazaniya na opredelennyj element massiva mozhet ispol'zovat'sya dobavochnoe smeshchenie. Vy chasto budete vstrechat' takzhe instrukciyu LEA, predostavlyayushchuyu drugoj sposob zagruzki smeshcheniya. Kodovyj segment soderzhit posledovatel'nost' mashinnyh instruk- cij, sostavlyayushchih programmu. Naprimer, instrukciya MOV sushchestvuet v vide neskol'kih bajtov mashinnogo koda, znachenie bajtov kotorogo opredelyaet v kakoj registr idet peresylka i otkuda. Registr IP (schetchik komand) soderzhit velichinu smeshcheniya, kotoraya ukazyvaet na tu instrukciyu v kodovom segmente, kotoraya sejchas dolzhna vypol- nyat'sya. Posle vypolneniya instrukcii IP uvelichivaetsya takim obra- zom, chtoby on ukazyval na sleduyushchuyu instrukciyu. V prostejshej programme schetchik komand budet peredvigat'sya ot pervogo bajta kodovogo segmenta k poslednemu, gde programma i zavershitsya. No, kak i drugie programmy, programma na yazyke assemblera mozhet byt' razbita na procedury (podprogrammy), poetomu schetchik komand mozhet prygat' iz odnogo mesta kodovogo segmenta v drugoe. Kogda schetchik komand prygaet v drugoe mesto kodovogo segmenta, to ego staroe znachenie dolzhno byt' zapomneno, s tem chtoby mozhno bylo vernut'sya v nuzhnoe mesto, tak kak eto delaet operator RETURN v Bejsike, vozvrashchaya upravlenie v to mesto, otkuda byla vyzvana procedura. V yazyke assemblera procedure prisvaivaetsya imya, napr- imer, COMBINE_DATA, i operator CALL COMBINE_DATA peredaet uprav- lenie v proceduru. Procedura zavershaetsya instrukciej RET (vozv- rat). Pri vyzove procedury processor zapominaet tekushchee znachenie schetchika komand, zatalkivaya ego na stek. Stek eto oblast', ispol'zuemaya dlya vremennogo hraneniya dannyh. Posle zaversheniya procedury staroe znachenie schetchika komand beret- sya iz steka i vypolnenie programmy prodolzhaetsya. Stek takzhe so- derzhitsya v otdel'nom segmente, kotoryj, sovershenno estestvenno, nazyvaetsya segmentom steka. Emu sootvetstvuet segmentnyj registr SS. V registre SP hranitsya ukazatel' steka, kotoryj vsegda ukazy- vaet na vershinu steka i izmenyaetsya pri zasylke na stek i vyborke iz steka. Na pervyj vzglyad stek kazhetsya dostatochno neuklyuzhim sposobom hraneniya informacii, no u nego est' dva preimushchestva. Vo-pervyh, dostup k ego soderzhimomu namnogo bystree, chem k peremennym, hra- nyashchimsya v pamyati, a, vo-vtoryh, stek mozhet ispol'zovat'sya dlya mnogih celej. On mozhet hranit' adresa vozvrata iz procedury, vlozhennoj v druguyu proceduru. Vposledstvii, to zhe samoe prost- ranstvo mozhet ispol'zovat'sya programmistom dlya hraneniya dannyh, kotorye dolzhny sejchas obrabatyvat'sya, no dlya kotoryh ne hvataet mesta v registrah mikroprocessora. Programma vytalkivaet soderzhi- moe registra na stek komandoj PUSH, a pozdnee zabiraet ego ottuda komandoj POP. V assemblernyh programmah, privedennyh v etoj kni- ge, Vy ne raz vstretites' s instrukciyami tipa PUSH BX i POP DX. Nepravil'nyj poryadok obmena dannymi so stekom - luchshij sposob privesti assemblernuyu programmu k krahu. Posle togo kak programmist na assemblere ustanovil tri seg- mentnyh registra (CS, DS i SS) i zagruzil dannye v registry mik- roprocessora on imeet shirokij nabor vstroennyh sredstv, kotorymi processor mozhet pomoch' programmistu na assemblere. Vot naibolee rasprostranennye iz nih: ADD AX,BX Pribavlyaet BX k AX. Sushchestvuet takzhe instrukciya vychi- taniya (SUB), a takzhe varianty obeih etih instrukcij. MUL BL Umnozhaet BL na AX. Imeetsya takzhe instrukciya deleniya (DIV), a takzhe varianty obeih etih instrukcij. INC BL Uvelichivaet BL na 1. Imeetsya takzhe instrukciya umen'- sheniya (DEC). LOOP XXX Vozvrashchaet programmu nazad k stroke pomechennoj XXX, povtoryaya process stol'ko raz, kakoe chislo soderzhitsya v CX (analogichno instrukcii FOR .. TO .. NEXT v Bej- sike). OR AL,BL Vypolnyaet operaciyu logicheskogo ILI nad soderzhimym registrov AL i BL, prichem rezul'tat pomeshchaetsya v AL. Imeyutsya takzhe instrukcii AND, XOR i NOT. SHL AX,1 Sdvigaet vse bity, soderzhashchiesya v AX, na odnu poziciyu vlevo. |to ekvivalentno umnozheniyu soderzhimogo AX na 2. Drugie instrukcii sdvigayut bity vpravo ili osu- shchestvlyayut ciklicheskij sdvig. Vse eti instrukcii ochen' polezny dlya bitovyh operacij, takih kak ustanovka tochek ekrana. IN AL,DX Pomeshchaet v AX bajt, obnaruzhennyj v porte, adres koto- rogo ukazan v DX. Imeetsya takzhe instrukciya OUT. JMP Peredaet upravlenie v drugoe mesto programmy, kak instrukciya GOTO v Bejsike. JMP YYY peredaet upravle- nie na stroku programmy, imeyushchuyu metku YYY. CMP AL,BL Sravnivaet soderzhimoe AL i BL. Za instrukciej CMP obychno sleduet instrukciya uslovnogo perehoda. Napri- mer, esli za instrukciej CMP sleduet instrukciya JGE, to perehod proizojdet tol'ko esli BL bol'she ili ravno AL. Instrukciya CMP dostigaet togo zhe rezul'tata, chto i instrukciya IF .. THEN v Bejsike (na samom dele instrukciya IF .. THEN perevoditsya interpretatorom Bejsika v instrukciyu CMP). TEST AL,BL Proveryaet est' li sredi bitov, ustanovlennyh v BL, takie, kotorye ustanovleny takzhe i v AL. Za etoj instrukciej obychno sleduet komanda uslovnogo pereho- da, tak zhe kak za CMP. TEST ochen' polezen pri prover- ke statusnyh bitov (bitovye operacii ochen' prosto realizuyutsya v yazyke assemblera). MOVS Peresylaet stroku, dlina kotoroj soderzhitsya v CX, s mesta, na kotoroe ukazyvaet SI, na mesto, na kotoroe ukazyvaet DI. Imeetsya eshche neskol'ko drugih instruk- cij, svyazannyh s peresylkoj i poiskom strok. YAzyk assemblera obespechivaet neskol'ko variantov etih instrukcij, a takzhe ryad drugih special'nyh instrukcij. Imeetsya takzhe celyj klass instrukcij, nazyvaemyh psevdooperatorami, kotorye pomeshchayut- sya v tekst programmy s cel'yu ukazaniya assembleru kak obrabatyvat' dannuyu programmu. Naprimer, odin iz tipov psevdooperatorov avto- maticheski vstavlyaet chasto ispol'zuemyj kusok koda po vsej prog- ramme. Takaya porciya koda nazyvaetsya makrosom i imenno eto svojst- vo assemblera dalo emu nazvanie "makroassembler". I, nakonec, assembler imeet vozmozhnost', kotoroj zaviduyut (ili, po krajnej mere, dolzhny zavidovat') vse kto programmiruet tol'ko na yazykah vysokogo urovnya. Imeetsya vvidu vozmozhnost' opti- mal'nym obrazom ispol'zovat' preryvaniya operacionnoj sistemy. Ved' eto nichto inoe, kak gotovye procedury. Odnako vmesto togo, chtoby vyzyvat' ih po CALL, oni vyzyvayutsya instrukciej INT. INT21H vyzyvaet preryvanie s shestnadcatirichnym nomerom 21. Imeetsya ryad takih preryvanij, kak v bazovoj sisteme vvoda/vyvoda PZU, tak i v operacionnoj sisteme, prichem nekotorye iz etih procedur neobychaj- no moshchny. Na samom dele nekotorye iz nih nastol'ko tesno svyazany s sistemoj, chto Vy prakticheski ne mozhete sami napisat' ekviva- lentnuyu proceduru. YAzyki vysokogo urovnya pozvolyayut ispol'zovat' mnogie iz etih preryvanij. Oni ispol'zuyut ih dlya vyvoda na ekran, priema vvoda s klaviatury i dostupa k diskam. No mnogie dejstvi- tel'no poleznye preryvaniya ignoriruyutsya yazykami vysokogo urovnya, naprimer takie, kotorye pozvolyayut zapustit' iz odnoj programmy druguyu. Nekotorye translyatory (takie kak Lattice C ili Turbo Pascal) pozvolyayut dostup k etim preryvaniyam, esli Vy znaete kak ih gotovit' i Vy mozhete ispol'zovat' razdely srednego urovnya etoj knigi dlya etoj celi. Pered vyzovom preryvaniya nekotoraya informaciya dolzhna byt' pomeshchena v registry processora. Naprimer, preryvanie, verikal'no sdvigayushchee ekran, dolzhno znat' razmery sdvigaemogo okna, chislo strok na kotoroe ego nado sdvinut' i t.d. |ti znacheniya chasto nazyvayut vhodnymi registrami. Snova i snova Vy budete vstrechat' slova "pri vhode BX dolzhen soderzhat' ...", opisyvayushchie specifika- ciyu vhodnyh registrov. Analogichno, pri vozvrate iz preryvaniya nekotorye registry vozvrashchayut znacheniya ili statusnuyu informaciyu. Oni nazyvayutsya vyhodnymi registrami i my opisyvaem ih slovami "pri vyhode AX soderzhit ...". Zachastuyu odno preryvanie soderzhit mnogo funkcij. V chastnosti, operacionnaya sistema vpihnula prakti- cheski vse svoi vozmozhnosti v preryvanie 21H. Poetomu pri vyzove preryvaniya neobhodimo ukazyvat' nomer funkcii. Vse preryvaniya (kak BIOS tak i DOS) peredayut nomer funkcii v AH (inogda v AL soderzhitsya nomer podfunkcii). Vse skazannoe v osnovnom sluzhit tol'ko chtoby dat' pervoe predstavlenie o predmete. No esli Vy budete vnimatel'no prosmat- rivat' prostejshie primery, soderzhashchiesya v etoj knige, to Vy poj- mete stoyashchuyu za nimi logiku. YAzyk assemblera imeet reputaciyu trudnogo yazyka. No to, chto Vy tol'ko chto prochitali - nastoyashchaya chepuha. Imeetsya dostatochno slozhnostej i v yazykah vysokogo urovnya. I esli oshibki v assemblernoj programme byvaet ochen' slozhno obna- ruzhit', to v osnovnom eto svyazano s tem, chto sam tekst programmy namnogo dlinnee, chem ekvivalentnyj tekst na yazyke vysokogo urov- nya (odnako assemblernyj kod namnogo plotnee). V nastoyashchee vremya mnogie professionaly pishut programmy na yazyke C, zatem analizi- ruyut effektivnost' i perepisyvayut kriticheskie kusochki programmy, kotorye rashoduyut mnogo vremeni, na yazyke assemblera. Nevozmozh- nost' napisaniya takih assemblernyh procedur mozhet inogda svesti usiliya programmista k nulyu. Poetomu najdite horoshij bukvar' po assembleru i pristupajte! Vozmozhno samoj bol'shoj nagradoj dlya Vas stanet moment, kogda Vy nakonec dejstvitel'no stanete ponimat' kak zhe rabotaet komp'yuter. Prilozhenie G. Vklyuchenie assemblernyh procedur v programmy na Bejsike. Procedury na yazyke assemblera sostoyat iz strok bajtov mashinno- go koda. Pri vypolnenii etoj procedury Bejsik peredaet upravlenie iz posledovatel'nosti instrukcij, sostavlyayushchih programmu na Bej- sike, v to mesto, gde hranyatsya instrukcii, kotorye mogut byt' dekodirovany v posledovatel'nost' instrukcij yazyka assemblera. Pri zavershenii assemblernoj procedury upravlenie vozvrashchaetsya v to mesto bejsikovskoj programmy, otkuda byla vyzvana procedura. V etoj knige assemblernye procedury, ispol'zuemye v programmah na Bejsike, privedeny v dvuh vidah. V oboih vidah procedury vklyu- cheny v programmu, a ne hranyatsya v vide otdel'nogo diskovogo faj- la. Pri pervom sposobe trebuetsya, chtoby kody procedury nahodilis' v otdel'nom meste v pamyati, a pri vtorom, menee prinyatom, etogo ne trebuetsya. V pervom sposobe procedura pomeshchaetsya v operatory DATA i prog- ramma peresylaetsya v neispol'zuemuyu chast' pamyati, a zatem vyzy- vaetsya operatorom CALL. Nado pozabotit'sya o tom, chtoby kod proce- dury ne nakladyvalsya na kakie-libo dannye i naoborot. Obychnoe reshenie etoj problemy sostoit v tom, chto procedura pomeshchaetsya v te adresa pamyati, k kotorym Bejsik ne mozhet poluchit' dostup. Poskol'ku interpretator Bejsika ne mozhet imet' dostup za predely 64K, to dlya sistemy, skazhem, s pamyat'yu 256K, nuzhno pomestit' proceduru v starshie 64K. Dlya sistem s pamyat'yu 128K Vy dolzhny vychislit' skol'ko pamyati trebuetsya operacionnoj sisteme, Bejsiku i drajveram ustrojstv. Dopustimo, chtoby oni zanimali 25K plyus 64K, ispol'zuemyh Bejsikom. V sistemah s 64K ispol'zujte pri starte komandu CLEAR, kotoraya ogranichivaet ob®em pamyati dostupnyj dlya Bejsika. CLEAR,n ogranichivaet Bejsik n bajtami. Zatem pomes- tite proceduru v samye verhnie adresa pamyati. Dlya ukazaniya nachala oblasti, kuda budet pomeshchena procedura, ispol'zujte operator DEF SEG, a zatem s pomoshch'yu operatora READ schityvayutsya bajty procedury i pomeshchayutsya v pamyat' do teh por, poka vsya procedura ne budet pomeshchena na mesto. Naprimer: 100 DATA &Hxx, &Hxx, &Hxx, &Hxx, &Hxx '10-bajtnaya procedura 110 DATA &Hxx, &Hxx, &Hxx, &Hxx, &Hxx . . 300 '''pomeshchaem proceduru v pamyat' 310 DEF SEG = &H3000 'ukazyvaem na oblast' pamyati 320 FOR N = 0 TO 9 'dlya kazhdogo iz 10 bajtov 330 READ Q 'chitaem bajt dannyh 340 POKE N,Q 'pomeshchaem ego v pamyat' 350 NEXT Posle togo kak procedura zagruzhena v pamyat' i Vy hotite ee ispol'zovat', neobhodimo chtoby poslednij operator DEF SEG ukazy- val na nachalo procedury. Zatem prisvojte celoj peremennoj znache- nie 0 i napishite operator CALL s imenem etoj peremennoj. Esli procedure peredayutsya parametry, to oni dolzhny byt' ukazany v skobkah v konce operatora CALL. Naprimer: 500 DEF SEG = &H3000 'ukazyvaem na nachalo procedury 510 DOGS = 12 'u nee 3 parametra 520 CATS = 44 ' 530 POSSUMS = 1 ' 540 CASUALTIES = 0 'nachinaem vypolnenie s 1-go bajta 550 CALL CASUALTIES(DOGS,CATS,POSSUMS) 'vypolnyaem proceduru Imeetsya namnogo bolee prostoj i ekonomichnyj sposob sozdaniya assemblernyh procedur, kotoryj izbegaet problemy raspredeleniya pamyati. Nado prosto sozdat' proceduru v vide strokovoj peremennoj vnutri programmy. Kazhdyj bajt mozhet byt' zakodirovan s pomoshch'yu CHR$. Zatem ispol'zujte funkciyu VARPTR dlya opredeleniya polozheniya etoj stroki v pamyati. Smeshchenie po kotoromu nahoditsya eta peremen- naya hranitsya v dvuh bajtah, kotorye idut za tem, na kotoryj uka- zhet VARPTR (v pervom bajte soderzhitsya dlina stroki). Zatem etot adres ispol'zuetsya dlya vyzova procedury. Otmetim sposob, kotorym ispol'zuetsya operator DEF SEG, dlya ukazaniya na segment dannyh Bejsika, s tem chtoby poluchennoe smeshchenie ukazyvalo na adres stro- ki dlya operatora CALL. Naprimer: 100 DEF SEG 'ustanavlivaem segment na dannye Bejsika 110 X$ = "CHR$(B4)+..." 'kod procedury 120 Y = VARPTR(X$) 'poluchaem deskriptor stroki 130 Z = PEEK(Y+1)+PEEK(Y+2)*256 'vychislyaem ee adres 140 CALL Z Mnogie znacheniya, vyrazhaemye cherez CHR$() mogut byt' predstavleny i v vide simvolov ASCII. Vy mozhete pisat' ROUT = CHR$(12) + "AB" vmesto ROUT = CHR$(12) + CHR$(65) + CHR$(66). Na samom dele bol'- shinstvo simvolov ASCII mogut vvodit'sya putem nazhatiya klavishi Alt, nabore nomera koda na dopolnitel'noj klaviature, a zatem otpuska- niya klavishi Alt. Odnako kody ot 0 do 31 ne mogut byt' vvedeny takim obrazom dlya nashih celej. Prilozhenie D. Ispol'zovanie drajvera ustrojstva ANSI.SYS. ANSI.SYS eto nebol'shaya programma, vhodyashchaya v sostav operacion- noj sistemy, kotoraya mozhet byt' zagruzhena v pamyat', s tem chtoby uvelichit' vozmozhnosti MS DOS. Ona ne sdelana chast'yu COMMAND.COM s cel'yu ekonomiya pamyati, kogda ona ne ispol'zuetsya. Sredstva, pre- dostavlyaemye ANSI.SYS, mogut byt' ispol'zovany dlya udobstva prog- rammirovaniya, no oni mogut takzhe sluzhit' sredstvom dostizheniya nekotoroj programmnoj sovmestimosti s ne IBM-ovskimi mashinami, ispol'zuyushchimi MS DOS. |tot drajver ne predostavlyaet nikakih doba- vochnyh vozmozhnostej, kotoryh nel'zya bylo by dobit'sya drugim obra- zom, no on delaet nekotorye vozmozhnosti upravleniya klaviaturoj i terminalom namnogo bolee prostymi (i obychno bolee medlenno). Vse svojstva drajvera ANSI.SYS opisany v etoj knige pod sootvetstvuyu- shchim zagolovkom. ANSI.SYS mozhet byt' zagruzhen tol'ko vo vremya zagruzki opera- cionnoj sistemy. Nachinaya s versii 2.0 sistema avtomaticheski ishchet fajl CONFIG.SYS, tak zhe kak i fajl AUTOEXEC.BAT. Fajl CONFIG.SYS soderzhit razlichnye parametry, takie kak chislo sozdavaemyh buferov dlya fajlov. No on soderzhit takzhe i imena teh drajverov ustrojstv, kotorye dolzhny byt' zagruzheny i vklyucheny v COMMAND.COM. ANSI.SYS kak raz i yavlyaetsya takim drajverom. Nado prosto vklyuchit' v etot fajl stroku DEVICE = ANSI.SYS. Ona mozhet byt' edinstvennoj stro- koj v fajle. Dlya sozdaniya etogo fajla mozhno vospol'zovat'sya ko- mandoj COPY. Nado prosto vvesti s terminala takie stroki: COPY CON: CONFIG.SYS <CR> DEVICE = ANSI.SYS <CR> <F6> <CR> Nazhatie klavishi F6 zapisyvaet simvol Ctrl-Z (ASCII 26), otmechayu- shchij konec fajla. Prilozhenie E. Nabor instrukcij mikroprocessora 8088. CHislo taktov, kotoroe nado dobavit' dlya vychisleniya effektivno- go adresa sleduyushchee: komponenty adresa operandy takty (a) baza ili indeks [BX],[BP],[DI],[SI] 5 (b) smeshchenie metka ili smeshchenie 6 (v) baza + indeks [BX][SI], [BX][DI] 7 [BP][SI], [BP][DI] 8 (g) smeshchenie + baza ili indeks [BX],[BP],[DI],[SI] + smeshch. 9 (d) smeshchenie + baza + indeks [BX][SI],[BX][DI] + smeshch. 11 [BP][SI],[BP][DI] + smeshch. 12 Neobhodimo dobavit' takzhe 2 takta pri peresechenii segmenta. Vot vremena instrukcij: instrukciya takty bajty AAA 4 1 AAD 60 2 AAM 83 1 AAS 4 1 ADC registr, registr 3 2 ADC registr, pamyat' 9(13) + EA 2-4 ADC pamyat', registr 16(24) + EA 2-4 ADC registr, znachenie 4 3-4 ADC pamyat', znachenie 17(25) + EA 3-6 ADC akkumulyator, znachenie 4 2-3 ADD registr, registr 3 2 ADD registr, pamyat' 9(13) + EA 2-4 ADD pamyat', registr 16(24) + EA 2-4 ADD registr, znachenie 4 3-4 ADD pamyat', znachenie 17(25) + EA 3-6 ADD akkumulyator, znachenie 4 2-3 AND registr, registr 3 2 AND registr, pamyat' 9(13) + EA 2-4 AND pamyat', registr 16(24) + EA 2-4 AND registr, znachenie 4 3-4 AND pamyat', znachenie 17(25) + EA 3-6 AND akkumulyator, znachenie 4