mat. Primer na ris.13.2 demonstriruet umnozhenie chetyreh- bajtovogo mnozhimogo na odno-bajtovyj mnozhitel'. Tak kak komanda AAM mozhet imet' delo tol'ko s odnobajtovymi chislami, to v programme organizovan cikl, kotoryj obrabatyvaet bajty sprava nalevo. Okonchatel'nyj rezul'tat umnozheniya v dannom primere - 0108090105. Esli mnozhitel' bol'she odnogo bajta, to neobhodimo obespechit' eshche odin cikl, kotoryj obrabatyvaet mnozhitel'. V etom sluchae proshche budet preobrazovat' chislo iz ASCII-formata v dvoichnyj format (sm. sleduyushchij razdel "Preobrazovanie ASCII-formata v dvoichnyj format"). ------------------------------------------------------------ ------------------------------------------------------------ Ris.13.2. Umnozhenie v ASCII-formate. Delenie v ASCII-formate Komanda AAD (ASCII Adjust for Division - korrekciya dlya deleniya ASCII-kodov) vypolnyaet korrektirovku ASCII koda delimogo do neposredstvennogo deleniya. Odnako, prezhde neobhodimo ochistit' levye trojki ASCII-kodov dlya polucheniya raspakovannogo desyatichnogo formata. Komanda AAD mozhet operirovat' s dvuhbajtovymi delimymi v registre AX. Predpolozhim, chto registr AX soderzhit delimoe 3238 v ASCII- formate i registr CL soderzhit delitel' 37 takzhe v ASCII- formate. Sleduyushchie komandy vypolnyayut korrekciyu dlya posleduyu shchego deleniya: AX: AND CL,0FH ;Preobrazovat' CL v raspak.des. AND AX,0F0FH ;Preobrazovat' AX v raspak.des. 0208 AAD ;Preobrazovat' v dvoichnyj 001C DIV CL ;Razdelit' na 7 0004 Komanda AAD umnozhaet soderzhimoe AH na 10 (shest.0A), pribavlyaet pezul'tat 20 (shest.14) k registru AL i ochishchaet registr AH. Znachenie 001C est' shest. predstavlenie desyatich nogo chisla 28. Delitel' mozhet byt' tol'ko odnobajtovyj ot 01 do 09. Primer na ris. 13.3. vypolnyaet delenie chetyrehbajtovogo delimogo na odnobajtovyj delitel'. V programme organizovan cikl obrabotki delimogo sprava nalevo. Ostatki ot deleniya nahodyatsya v registre AH i komanda AAD korrektiruet ih v registre AL. Okonchatel'nyj pezul'tat: chastnoe 00090204 i v registre AH ostatok 02. Assembler dlya IBM PC. Glava 13 6 Esli delitel' bol'she odnogo bajta, to neobhodimo postro it' drugoj cikl dlya obrabotki delitelya, no luchshe vospol'zo vat'sya sleduyushchim razdelom "Preobrazovanie ASCII-formata v dvoichnyj format." DVOICHNO-DESYATICHNYJ FORMAT (BCD) ------------------------------------------------------------ V predydushchem primere deleniya v ASCII-formate bylo polucheno chastnoe 00090204. Esli szhat' eto znachenie, sohranyaya tol'ko pravye cifry kazhdogo bajta, to poluchim 0924. Takoj format nazyvaetsya dvoichno-desyatichnym (BCD - Binary Coded Decimal) (ili upakovannym). On soderzhit tol'ko desyatichnye cifry ot 0 do 9. Dlina dvoichno-desyatichnogo predstavleniya v dva raza men'she ASCII-predstavleniya. ------------------------------------------------------------ ------------------------------------------------------------ Ris.13.3. Delenie v ASCII-formate. Zametim, odnako, chto desyatichnoe chislo 0924 imeet osnovanie 10 i, buduchi preobrazovannym v osnovanie 16 (t.e. v shest. predstavlenie), dast shest.039C. Mozhno vypolnyat' slozhenie i vychitanie chisel v dvoichno-desyatichnom predstavlenii (BCD-formate). Dlya etih celej imeyutsya dve korrektipuyushchih komandy: DAA (Decimal Adjustment for Addition - desyatichnaya korrekciya dlya slozheniya) DAS (Decimal Adjustment for Subtraction - desyatichnaya korrekciya dlya vychitaniya) Obrabotka polej takzhe osushchestvlyaetsya po odnomu bajtu za odno vypolnenie. V primere programmy, privedennom na ris. 13.4, vypolnyaetsya preobrazovanie chisel iz ASCII-formata v BCD-format i slozhenie ih. Procedura B10CONV preobrazuet ASCII v BCD. Obrabotka chisel mozhet vypolnyat'sya kak sprava nalevo, tak i sleva napravo. Krome togo, obrabotka slov proshche, chem obrabotka bajtov, tak kak dlya generacii odnogo bajta BCD-koda trebuetsya dva bajta ASCII-koda. Orientaciya na obrabotku slov trebuet chetnogo kolichestva bajtov v ASCII- pole. Procedura C10ADD vypolnyaet slozhenie chisel v BCD-formate. Okonchatel'nyj rezul'tat - 127263. PREOBRAZOVANIE ASCII-FORMATA V DVOICHNYJ FORMAT ------------------------------------------------------------ bypolnenie arifmeticheskih operacij nad chislami v ASCII ili BCD formatah udobno lish' dlya korotkih polej. V bol' shinstve sluchaev dlya arifmeticheskih operacij ispol'zuetsya preobrazovanie v dvoichnyj format. Prakticheski proshche Assembler dlya IBM PC. Glava 13 7 preobrazovanie iz ASCII-formata neposredstvenno v dvoichnyj format, chem preobrazovanie iz ASCII- v BCD-format i, zatem, v dvoichnyj format: Metod preobrazovaniya baziruetsya na tom, chto ASCII-format imeet osnovanie 10, a komp'yuter vypolnyaet arifmeticheskie operacii tol'ko nad chislami s osnovaniem 2. Procedura preobrazovaniya zaklyuchaetsya v sleduyushchem: 1. Nachinayut s samogo pravogo bajta chisla v ASCII-formate i obrabatyvayut sprava nalevo. 2. Udalyayut trojki iz levyh shest.cifr kazhdogo ASCII-bajta. 3. Umnozhayut ASCII-cifry na 1, 10, 100 (shest.1, A, 64) i t.d. i skladyvayut rezul'taty. Dlya primera rassmotrim preobrazovanie chisla 1234 iz ASCII-formata v dvoichnyj format: Desyatichnoe SHestnadcatirichnoe 4 h 1 = 4 4 3 h 10 = 30 1E 2 h 100 = 200 C8 1 h 1000 = 1000 3E8 Rezul'tat: 04D2 ------------------------------------------------------------ ------------------------------------------------------------ Ris. 13.4. BCD-preobrazovanie i arifmetika. Prover'te, chto shest.04D2 dejstvitel'no sootvetstvuet desyatichnomu 1234. Na ris. 13.5. v procedure B10ASBI vypolnyaetsya preobrazonie ASCII-chisla 1234 v dvoichnyj format. V primere predpolagaetsya, chto dlina ASCII-chisla ravna 4 i ona zapisana v pole ASCLEN. Dlya inicializacii adres ASCII- polya ASCVAL-1 zanositsya v registr SI, a dlina - v registr BX. Komanda po metke B20 peresylaet ASCII-bajt v registr AL: MOV AL,[SI+BX] Zdes' ispol'zuetsya adres ASCVAL-1 plyus soderzhimoe registra BX (4), t.e. poluchaetsya adres ASCVAL+3 (samyj pravyj bajt polya ASCVAL). V kazhdom cikle soderzhimoe registra BX umen'shaetsya na 1, chto privodit k obrashcheniyu k sleduyushchemu sleva bajtu. Dlya dannoj adresacii mozhno ispol'zovat' registr BX, no ne CX, i, sledovatel'no, nel'zya primenyat' komandu LOOP. V kazhdom cikle proishodit takzhe umnozhenie polya MULT10 na 10, chto daet v rezul'tate mnozhiteli 1,10,100 i t.d. Takoj priem primenen dlya bol'shej yasnosti, odnako, dlya bol'shej proizvoditel'nosti mnozhitel' mozhno hranit' v registre SI ili DI. PREOBRAZOVANIE DVOICHNOGO FORMATA V ASCII-FORMAT ------------------------------------------------------------ Assembler dlya IBM PC. Glava 13 8 Dlya togo, chtoby napechatat' ili otobrazit' na ekrane arifmeticheskij pezul'tat, neobhodimo preobrazovat' ego v ASCII-format. Dannaya operaciya vklyuchaet v sebya process obratnyj predydushchemu. Vmesto umnozheniya ispol'zuetsya delenie dvoichnogo chisla na 10 (shest. 0A) poka rezul'tat ne budet men'she 10. Ostatki, kotorye lezhat v granicah ot 0 do 9, obrazuyut chislo v ASCII-formate. V kachestve primera rassmotrim preobrazovanie shchest.4D2 obratno v desyatichnyj format: CHastnoe Ostatok 4D2 : A 7B 4 7B : A C 3 C : A 1 2 Tak kak poslednee chastnoe 1 men'she, chem shest.A, to operaciya zavershena. Ostatki vmeste s poslednim chastnym obrazuyut rezul'tat v ASCII-formate, zapisyvaemyj sprava nalevo 1234. Vse ostatki i poslednee chastnoe dolzhny zapisyvat'sya v pamyat' s trojkami, t.e. 31323334. Na ris. 13.5. procedura C10BIAS preobrazuet shest. 4D2 (rezul'tat vychisleniya v procedure B10ASBI) v ASCII-chislo 1234. Polezno perepisat' vsyu programmu (ris.13.5.) v komp'yuter i vypolnit' trassipovku ee vypolneniya po shagam. ------------------------------------------------------------ ------------------------------------------------------------ Ris.13.5. Preobrazovanie ASCII i dvoichnogo formatov. SDVIG I OKRUGLENIE ------------------------------------------------------------ Rassmotrim process okrugleniya chisla do dvuh desyatichnyh znakov posle zapyatoj. Esli chislo ravno 12,345, to neobhodimo pribavit' 5 k otbrasyvaemomu razryadu i sdvinut' chislo vpravo na odin desyatichnyj razryad: CHislo: 12,345 Plyus 5: +5 Okruglennoe chislo: 12,350 = 12,35 Esli okruglyaemoe chislo ravno 12,3455, to neobhodimo pribavit' 50 i sdvinut' na dva desyatichnyh razryada. Dlya 12,34555 neobhodimo pribavit' 500 i sdvinut' na tri desyatichnyh razryada: 12,3455 12,34555 +50 +500 12,3505 = 12,35 12,35055 = 12,35 K chislu, imeyushchemu shest' znakov posle zapyatoj, neobhodimo pribavit' 5000 i sdvinut' na chetyre desyatichnyh razryada i t.d. Poskol'ku dannye predstavlyayutsya v komp'yutere v dvoichnom Assembler dlya IBM PC. Glava 13 9 vide, to 12345 vyglyadit kak shest.3039. Pribavlyaya 5 k 3039, poluchim 303E, chto sootvetstvuet chislu 12350 v desyatichnom predstavlenii. Poka vse horosho. No vot sdvig na odnu dvoich nuyu cifru daet v rezul'tate shest.181F, ili 1675 - t.e. sdvig na odnu dvoichnuyu cifru prosto delit chislo popolam. No nam neobhodim takoj sdvig, kotoryj ekvivalenten sdvigu vpravo na odnu desyatichnuyu cifru. Takoj sdvig mozhno osushchestvit' deleniem na 10 (shest.A): SHest.303E : SHest.A = 4D3 ili des.1235 Preobrazovanie shest.4D3 v ASCII-format daet chislo 1235. Teper' ostaetsya lish' vstavit' zapyatuyu v pravil'nuyu poziciyu chisla 12,35, i mozhno vydat' na ekran okruglennoe i sdvinutoe znachenie. Takim obrazom mozhno okruglyat' i sdvigat' lyubye dvoichnye chisla. Dlya treh znakov posle zapyatoj neobhodimo pribavit' 5 i razdelit' na 10, dlya chetyreh znakov posle zapyatoj: pribavit' 50 i pazdelit' na 100. Vozmozhno vy zametili model': faktor okrugleniya (5, 50, 500 i t.d.) vsegda sostavlyaet polovinu faktora sdviga (10, 100, 1000 i t.d.). Konechno, desyatichnaya zapyataya v dvoichnom chisle tol'ko podpazumevaetsya. PROGRAMMA: PREOBRAZOVANIE VREMENI I RASCENKI RABOT DLYA RASCHETA ZARPLATY ------------------------------------------------------------ Programma, privedennaya na ris.13.6, pozvolyaet vvodit' s klaviatury znacheniya prodolzhitel'nosti i rascenki rabot i otobrazhat' na ekran paschitannuyu velichinu zarabotannoj platy. Dlya kratkosti v programme opushcheny nekotorye proverki na oshibku. Programma soderzhit sleduyushchie procedury: B10INPT Vvodit znacheniya vremeni raboty na ee rascenku s klaviatury. |ti znacheniya mogut soderzhat' desyatich nuyu zapyatuyu. D10HOUR Vypolnyaet preobrazovanie znacheniya vremeni iz ASCII v dvoichnyj format. E10RATE Vypolnyaet preobrazovanie znacheniya rascenki iz ASCII v dvoichnyj format. F10MULT Vypolnyaet umnozhenie, okruglenie i sdvig. Velichina zarplaty bez drobnoj chasti ili s odnim ili dvumya znakami posle zapyatoj ne trebuet okrugleniya i sdvi ga. Dannaya procedura ogranichena tem, chto pozvolyaet obrabatyvat' velichinu zarplaty s tochnost'yu do shesti desyatichnyh znakov, chto, konechno, bol'she, chem trebuetsya. G10WAGE Vstavlyaet desyatichnuyu zapyatuyu, opredelyaet pravuyu poziciyu dlya nachala zapisi ASCII simvolov i preobrazuet dvoichnoe znachenie zarplaty v ASCII-format. Assembler dlya IBM PC. Glava 13 10 K10DISP Zamenyaet lidiruyushchie nuli na probely i vyvodit rezul'tat na ekran. M10ASBI Preobrazuet ASCII v dvoichnyj format (obshchaya procedura dlya vremeni i rascenki) i opredelyaet chislo cifr posle zapyatoj v vvedennom znachenii. ------------------------------------------------------------ ------------------------------------------------------------ Ris.13.6. Raschet zarabotnoj platy. Ogranicheniya. Pervoe ogranichenie v programme, privedennoj na ris.13.6, costoit v tom, chto dopuskaet ne bolee shesti desyatichnyh znakov posle zapyatoj. Drugoe ogranichenie - razmer samoj zarplaty i tot fakt, chto sdvig vklyuchaet delenie na chislo, kratnoe 10, a preobrazovanie v ASCII-format vklyuchaet delenie na 10. Esli znachenie vremeni ili rascenki soderzhit bol'she shesti desyatichnyh znakov ili zarplata prevy shaet velichinu okolo 655350, to programma vydaet nulevoj rezul'tat. Na praktike programma mozhet predusmotret' v dannom sluchae vyvod preduprezhdayushchego soobshcheniya ili imet' podprogrammy dlya isklyucheniya takih ogranichenij. Kontrol' oshibok. Programma, razrabotannaya dlya pol'zovate lej, ne yavlyayushchihsya programmistami, dolzhna ne tol'ko vydavat' preduprezhdayushchie soobshcheniya, no takzhe proveryat' korrektnost' vvodimyh znachenij. Pravil'nymi simvolami pri vvode chislovyh znachenij yavlyayutsya cifry ot 0 do 9 i simvol desyatichnoj zapyatoj. Dlya lyubyh drugih simvolov programma dolzhna vydat' preduprezhdayushchee soobshchenie i vnov' povtorit' zapros na vvod. Poleznoj komandoj dlya proverki korrektnosti vvodimyh simvolov yavlyaetsya XLAT (sm. glavu 14). Tshchatel'no proveryajte programmy dlya lyubyh vozmozhnyh sostoyanij: nulevoe znachenie, maksimal'no bol'shie i malye znacheniya, otricatel'nye znacheniya. Otricatel'nye velichiny Nekotorye primeneniya programm dopuskayut nalichie otricatel'nyh velichin. Znak minus mozhet ustanavlivat'sya posle chisla, naprimer, 12,34-, ili pered chislom -12,34. Programma mozhet proveryat' nalichie minusa pri preobrazovanii v dvoichnyj format. Mozhno ostavit' dvoichnoe chislo polozhitel'nym, no ustanovit' sootvetstvuyushchij indikator ishodnoj otricatel'noj velichiny. Posle zaversheniya arifmeticheskih operacij znak minus pri neobhodimosti mozhet byt' vstavlen v ASCII pole. Esli neobhodimo, chtoby dvoichnoe chislo bylo takzhe otricatel'nym, to mozhno preobrazovat', kak obychno, ASCII-format v dvoichnyj, a dlya izmeneniya znaka dvoichnogo chisla vospol'zovat'sya komandami, opisannymi v glave 12 "Preobrazovanie znaka". Bud'te vnimatel'ny pri ispol'zovanii Assembler dlya IBM PC. Glava 13 11 komand IMUL i IDIV dlya obrabotki znakovyh dannyh. Dlya okrugleniya otricatel'nyh chisel sleduet ne pribavlyat', a vychitat' faktor 5. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® ASCII-format trebuet odin bajt na kazhdyj simvol. Esli pole soderzhit tol'ko cifry ot 0 do 9, to zamena starshih troek v kazhdom bajte na nuli sozdaet raspakovannyj desyatichnyj format. Szhatie chisla do dvuh cifr v bajte sozdaet upakovannyj desyatichnyj format. ® Posle ASCII-slozheniya neobhodimo vypolnit' korrekciyu s pomoshch'yu komandy AAA; posle ASCII-vychitaniya - korrekciya s pomoshch'yu komandy AAS. ® Prezhde chem vypolnit' ASCII-umnozhenie, neobhodimo preobrazovat' mnozhimoe i mnozhitel' v "raspakovannyj desyatichnyj" format, obnuliv v kazhdom bajte levye trojki. Posle umnozheniya neobhodimo vypolnit' korrekciyu rezul'tata s pomoshch'yu komandy AAM. ® Prezhde chem vypolnit' ASCII-delenie, neobhodimo: 1) preobrazovat' delimoe i delitel' v "raspakovannyj desyatichnyj" format, obnuliv v kazhdom bajte levye trojki i 2) vypolnit' korrekciyu delimogo s pomoshch'yu komandy AAD. ® Dlya bol'shinstva arifmeticheskih operacij ispol'zujte preobrazovanie chisel iz ASCII-formata v dvoichnoj format. V processe takogo preobrazovaniya proveryajte na korrektnost' ASCII-simvoly: oni dolzhny byt' ot shest.30 do shest.39, mogut soderzhat' desyatichnuyu zapyatuyu (tochku) i, vozmozhno, znak minus. VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ 13.1. Predpolozhim, chto registr AX soderzhit 9 v ASCII kode, a registr BX -7 takzhe v ASCII kode. Ob®yasnite i dajte tochnyj rezul'tat dlya sleduyushchih nesvyazannyh operacij: a) ADD AX,33H b) ADD AX,BX AAA AAA v) SUB AX,BX g) SUB AX,0DH AAS AAS 13.2. Pole UNPAK soderzhit shest. 01040705 v raspakovochnom desyatichnom formate. Napishite cikl, kotoryj preobrazuet eto soderzhimoe v ASCII-format, t.e. 31343735. Assembler dlya IBM PC. Glava 13 12 13.3. Pole ASCA soderzhit znachenie 313733 v ASCII-formate, a drugoe pole ASCB soderzhit 35. Napishite komandy dlya umnozheniya etih chisel v ASCII-formate i zapisi proizvedeniya v pole ASCPRO. 13.4. Ispol'zuya dannye iz voprosa 13.3, razdelite ASCA na ASCB i zapishite chastnoe v pole ASCQUO. 13.5. Vypolnite sleduyushchie vychisleniya vruchnuyu: a) preobrazo vat' ASCII 46328 v dvoichnyj format i pokazat' rezul'tat v shest.vide; b) preobrazovat' poluchennoe shest.znachenie obratno v ASCII-format. 13.6. Napishite i vypolnite programmu, kotoraya opredelyaet razmer pamyati komp'yutera (INT 12H - sm.gl.2), preobrazuet poluchennoe znachenie v ASCII-format i vyvodit rezul'tat na ekran v sleduyushchem vide: Razmer pamyati nnn bajtov. Assembler dlya IBM PC. Glava 14 24 GLAVA 14. Obrabotka tablic ------------------------------------------------------------ Obrabotka tablic Cel': Raskryt' trebovaniya dlya opredeleniya tablic, organiza cii poiska v tablicah i sortirovki elementov tablicy. VVEDENIE ------------------------------------------------------------ Mnogie programmnye primeneniya ispol'zuyut tablichnuyu organizaciyu takih dannyh, kak imena, opisaniya, razmery, ceny. Opredelenie i ispol'zovanie tablic vklyuchaet odnu novuyu komandu assemblera - XLAT. Takim obrazom, ispol'zova nie tablic - eto lish' delo tehniki i primeneniya znanij, poluchennyh iz predydushchih glav. Dannaya glava nachinaetsya opredeleniem nekotoryh obshcheprinyatyh tablic. Organizaciya poiska v tablice zavisit ot sposoba ee opredeleniya. Sushchestvuet mnogo razlichnyh variantov opredeleniya tablic i algoritmov poiska. OPREDELENIE TABLIC ------------------------------------------------------------ Dlya oblegcheniya tablichnogo poiska bol'shinstvo tablic opredelyayutsya sistematichno, t.e. elementy tablicy imeyut odina kovyj format (simvol'nyj ili chislovoj), odinakovuyu dlinu i voshodyashchuyu ili nishodyashchuyu posledovatel'nost' elementov. Tablica, kotoroj uzhe prihodilos' pol'zovat'sya v dannoj knige - eto stek, predstavlyayushchij soboj tablicu iz 64-h neinicializirovannyh slov: STACK DW 64 DUP(?) Sleduyushchie dve tablicy inicializirovany simvol'nymi i chislovymi znacheniyami: MONTAB DB 'JAN','FEB','MAR', ... ,'DEC' COSTAB DB 205,208,209,212,215,224,... Tablica MONTAB opredelyaet alfavitnye abbreviatury mesyacev, a COSTAB - opredelyaet tablicu nomerov sluzhashchih. Tablica mozhet takzhe sodepzhat' smeshannye dannye (regulyarno chereduyushchiesya chislovye i simvol'nye polya). V sleduyushchej assortimentnoj tablice kazhdyj chislovoj element (inventarnyj nomer) imeet dve cifry (odin bajt), a kazhdyj simvol'nyj element (naimenovanie) imeet devyat' bajtov. Tochki, pokazannye v naimenovanii "Paper" dopolnyayut dlinu etogo polya do 9 bajt. Tochki pokazyvayut, chto nedostayushchee prostranstvo dolzhno prisutstvovat'. Vvodit' tochki neobyazatel'no. Assembler dlya IBM PC. Glava 14 25 STOKTBL DB 12,'Computers',14,'Paper....',17,'Diskettes' Dlya yasnosti mozhno zakodirovat' elementy tablicy vertikal'no: STOKTBL DB 12, 'Computers' DB 14, 'Paper....' DB 17, 'Diskettes' Rassmotrim teper' razlichnye sposoby ispol'zovaniya tablic v programmah. PRYAMOJ TABLICHNYJ DOSTUP ------------------------------------------------------------ Predpolozhim, chto pol'zovatel' vvel nomer mesyaca - 03 i programma dolzhna preobrazovat' etot nomer v alfavitnoe znachenie March. Programma dlya vypolneniya takogo preobrazova niya vklyuchaet opredelenie tablicy alfavitnyh nazvanij mesyacev, imeyushchih odinakovuyu dlinu. Tak kak samoe dlinnoe nazvanie - September, to tablica imeet sleduyushchij vid: MONTBL DB 'January..' DB 'February.' DB 'March....' Kazhdyj element tablicy imeet dlinu 9 bajt. Adres elementa 'January' - MONTBL+0, 'February' - MONTBL+9, 'March' - MONTBL+18. Dlya lokalizacii mesyaca 03, programma dolzhna vypolnit' sleduyushchee: 1. Preobrazovat' vvedennyj nomer mesyaca iz ASCII 33 v dvoichnoe 03. 2. Vychest' edinicu iz nomera mesyaca: 03 - 1 = 02 3. Umnozhit' rezul'tat na dlinu elementa (9): 02 h 9 = 18 4. Pribavit' proizvedenie (18) k adresu MONTBL; v rezul'tate poluchitsya adres trebuemogo nazvaniya mesyaca: MONTBL+18. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 14.1. Pryamaya tablichnaya adresaciya. Na ris.14.1 priveden primer pryamogo dostupa k tablice nazvanij mesyacev. Dlya kratkosti v programme ispol'zuyutsya vmesto devyatisimvol'nyh nazvanij - trehsimvol'nye. Vvedennyj nomer mesyaca opredelen v pole MONIN. Predpolozhim, chto nekotoraya podprogramma formiruet zapros na vvod nomera mesyaca v ASCII-formate v pole MONIN. Opisannaya tehnika raboty s tablicej nazyvaetsya pryamym tablichnym dostupom. Poskol'ku dannyj alglritm neposredstven no vychislyaet adpes neobhodimogo elementa v tablice, to v programme ne trebuetsya vypolnyat' operacii poiska. Assembler dlya IBM PC. Glava 14 26 Hotya pryamaya tablichnaya adresaciya ochen' effektivna, ona vozmozhna tol'ko pri posledovatel'noj organizacii. To est' mozhno ispol'zovat' takie tablicy, esli elementy raspolagayutsya v regulyarnoj posledovatel'nosti: 1, 2, 3,... ili 106, 107, 108,... ili dazhe 5, 10, 15. Odnako, ne vsegda tablicy postroeny takim obrazom. V sleduyushchem razdele rassmatrivayutsya tablicy, imeyushchie neregulyarnuyu organizaciyu. TABLICHNYJ POISK ------------------------------------------------------------ Nekotorye tablicy sostoyat iz chisel, ne imeyushchih vidimoj zakonomernosti. Harakternyj primer - tablica inventarnyh nomerov s posledovatel'nymi nomerami, naprimer, 134, 138, 141, 239 i 245. Drugoj tip tablic sostoit iz raspredelennyh po ranzhiru velichin, takih kak podohodnyj nalog. V sleduyushchih razdelah rassmotrim eti tipy tablic i organizaciyu tablichnogo poiska. Tablicy s unikal'nymi elementami Inventarnye nomera bol'shinstva firm chasto ne imeyut posledovatel'nogo poryadka. Nomera, obychno, gruppiruyutsya po kategoriyam, pervye cifry ukazyvayut na mebel' ili pribory, ili nomer otdela. Krome togo vremya ot vremeni nomera udalyayutsya, a novye dobavlyayutsya. V tablice neobhodimo svyazat' inventarnye nomera i ih konkretnye naimenovaniya (i, esli trebuetsya, vklyuchit' stoimost'). Inverntarnye nomera i naimenovaniya mogut byt' opredeleny v razlichnyh tablicah, naprimer: STOKNOS DB '101','107','109',... STOKDCR DB 'Excavators','Processors','Assemblers',... ili v odnoj tablice, naprimer: STOKTAB DB '101','Excavators' DB '107','Processors' DB '109','Assemblers' ... Programma na ris.14.2 opredelyaet inventarnuyu tablicu i vypolnyaet tablichnyj poisk. Tablica soderzhit shest' par nomerov i naimenovanij. Cikl poiska nachmnaetsya so sravneniya vvedennogo inventarnogo nomera v pole STOKNIN s pervym nomerom v tablice. Esli nomera razlichnye, to adres v tablice uvelichivaetsya dlya sravneniya so sleduyushchim inventarnym nomerom. Esli nomera ravny, to programma (A30) vydelyaet naimenovanie iz tablicy i zapisyvaet ego v pole DESCRN. Poisk vypolnyaet maksimum shest' sravnenij i esli trebuemyj nomer v tablice otsutstvuet, to proishodit perehod na programmu obrabotki oshibki, kotoraya vyvodit na ekran sootvetstvuyushchee soobshchenie. Assembler dlya IBM PC. Glava 14 27 Obratite vnimanie, chto v nachale programmy imeetsya komanda, kotoraya peresylaet soderzhimoe polya STOKNIN v registr AX. Hotya STOKNIN opredelenno kak 3233, komanda MOV zagruzit v registr AX eto znachenie v obratnoj posledovatel' nosti bajtov 3332. Tak kak elementy tablicy imeyut pryamuyu posledovatel'nost' bajtov, to posle komandy MOV imeetsya komanda XCHG, kotoraya menyaet mestami bajty v registre AX, vozvrashchaya im pryamuyu posledovatel'nost', t.e. 3233. Komanda CMP, predpolagaya obratnuyu posledovatel'nost', sravnivaet snachala pravye bajty, a zatem - levye. Sledovatel'no, proverka na pavenstvo budet korrektnoj, no proverki na bol'she ili men'she dadut nepravil'nye rezul'taty. Dlya sravneniya na bol'she ili men'she sleduet opustit' komandu XCHG, pereslat' element tablicy komandoj MOV, skazhem, v registr BX i zatem sravnit' soderzhimoe registrov AX i BX sleduyushchim obrazom: MOV AX,STOKNIN LEA SI,STOKTAB C20: MOV BX,[SI] CMP AX,BX JA ili JB ... V programme takogo tipa drugaya tablica mozhet opredelyat' stoimost' edinicy tovara. Programma mozhet lokalizovat' element tablicy, vychislit' prodazhnuyu stoimost' (kolichestvo tovara umnozhit' na stoimost' edinicy tovara) i vydat' na ekran naimenovanie i pradazhnuyu stoimost' tovara. V primere na ris. 14.2 tablica soderzhit dvuhbajtovye nomera i desyatibajtovye naimenovaniya. Detal'noe programmiro vanie budet otlichat'sya dlya razlichnogo chisla i dliny elementov. Naprimer, dlya sravneniya trehbajtovyh polej mozhno ispol'zovat' komandu REPE CMPSB, hotya eta komanda takzhe vklyuchaet ispol'zovanie pegistra CX. Tablicy s ranzhirovaniem Podohozhnyj nalog daet harakternyj primer tablicy s ranzhirovannymi znacheniyami. Predstavim sebe tablicu, soderzhashchuyu razmery dohodov oblagaemyh nalogami, procent naloga i popravochnyj koefficient: Razmer dohoda Procent naloga Popravochnyj k-nt 0-1000.00 10 0,00 1000,01-2500,00 15 050,00 2500,01-4250,00 18 125,00 4250,01-6000,00 20 260,00 6000,01 i bolee 23 390,00 Assembler dlya IBM PC. Glava 14 28 V nalogovoj tablice procent uvelichivaetsya v sootvetstvii s uvelicheniem nalogooblagaemogo dohoda. |lementy tablicy dohodov soderzhat maksimal'nye velichiny dlya kazhdogo shaga: TAXTBL DD 100000,250000,425000,600000,999999 dlya organizacii poiska v takoj tablice, programma sravnivaet doxod nalogoplatil'shchika s tablichnym znacheniem dohoda: esli men'she ili ravno, to ispol'zovat' sootvetstvuyushchij procent i popravku; esli bol'she, to perejti k sleduyushchemu elementu tablicy. Velichina naloga rasschityvaetsya po formule: Dohod h Procent naloga : 100 - popravochnyj k-nt Tablichnyj poisk s ispol'zovaniem sravneniya strok Esli element tablicy prevyshaet dlinu v dva bajta, to dlya operacii sravneniya mozhno ispol'zovat' komandu REPE CMPS. Predpolozhim, chto tablica inventarnyh nomerov (ris.14.2) peredelana dlya trehbajtovyh nomerov. Esli STOKNIN yavlyaetsya pervym polem v oblasti dannyh, a STOKTAB - vtorym, to oni mogut vyglyadet' cleduyushchim obrazom: Dannye: |123|035Excavators|038Lifters |049Presses | ... | | | | | | | Adres: 00 03 06 16 19 29 32 Programma na ris.14.3 opredelyaet tablicu STOKTAB, vklyuchaya poslednij element '999' dlya indikacii konca tablicy pri poiske. Programma poiska sravnivaet soderzhimoe kazhdogo elementa tablicy s soderzhimym polya STOKNIN: |lement tablicy STOKNIN Rezul'tat sravneniya 035 123 Men'she: proverit' sled.el-t 038 123 Men'she: proverit' sled.el-t 049 123 Men'she: proverit' sled.el-t 102 123 Men'she: proverit' sled.el-t 123 123 Ravno: element najden Zametim, chto komanda CMPSB na ris.14.3 sravnivaet bajt za bajtom, poka bajty ne budut ravny i avtomaticheski uvelichiva et registpy SI i DI. ------------------------------------------------------------ ------------------------------------------------------------ Ris.14.3. Tablichnyj poisk s ispol'zovaniem komandy CMPSB Assembler dlya IBM PC. Glava 14 29 Registr CX inicializiruetsya znacheniem 03, a nachal'nye otnositel'nye adresa v registrah SI i DI ustanavlivayutsya ravnymi 03 i 00 sootvetstvenno. Sravnenie s pervym elementom tablicy (035:123) zavershaetsya na pervom bajte, posle etogo registr SI soderzhit 04, DI: 01, CX: 02. Dlya sleduyushchego sravneniya registr SI dolzhen imet' znachenie 16, a DI: 00. Korrektirovka registra DI svoditsya k prostoj perezagruzke adresa STOKNIN. Uvelichenie adresa sleduyushchego elementa tablicy, kotoryj dolzhen byt' v registre SI, zavisit ot togo, na kakom bajte (pervom, vtorom ili tret'em) zakonchilos' predydushchee sravnenie. Registr CX soderzhit chislo bajt, ne uchastvuyushchih v sravnenii, v dannom sluchae - 02. Pribaviv k soderzhimomu registra SI znachenie v registre CX i dlinu naimenovaniya, poluchim otnositel'nyj adres sleduyushchego elementa: Adres v SI posle CMPSB 04 Pribavit' CX 02 Pribavit' dlinu naimenovaniya 10 Otnositel'nyj adres sled.elementa 16 Tak kak registr CX vsegda soderzhit chislo bajt, ne uchastvuyushchih v sravnenii (esli takie est'), to raschet spravedliv dlya vseh sluchaev: prekrashchenie sravneniya posle 1, 2 ili 3 bajta. Esli sravnivayutsya odinakovye elementy, to registr CX poluchit znachenie 00, a adres v pegistre SI ukazhet na trebuemoe naimenovanie. Tablicy s elementami peremennoj dliny Sushchestvuyut tablicy, v kotoryh elementy imeyut peremennuyu dlinu. Kazhdyj element takoj tablicy mozhet zavershat'sya special'nym simvolom ogranichitelem, naprimer, shest.00; konec tablicy mozhno oboznachit' ogpanichitelem shest.FF. V etom sluchae neobhodimo garantirovat', chtoby vnutri elementov tablicy ne vstrechalis' ukazannye ogranichiteli. Pomnite, chto dvoichnye chisla mogut vyrazhat'sya lyubymi bitovymi kombinaciya mi. Dlya poiska mozhno ispol'zovat' komandu SCAS. TRANSLIRUYUSHCHAYA KOMANDA XLAT ------------------------------------------------------------ Komanda XLAT transliruet soderzhimoe odnogo bajta v drugoe predopredelennoe znachenie. S pomoshch'yu komandy XLAT mozhno proverit' korrektnost' soderzhimogo elementov dannyh. Pri peredache dannyh mezhdu personal'nym komp'yuterom i ES |VM (IBM) s pomoshch'yu komandy XLAT mozhno vypolnit' perekodirovku dannyh mezhdu formatami ASCII i EBCDIC. V sleduyushchem primere proishodit preobrazovanie cifr ot 0 do 9 iz koda ASCII v kod EBCDIC. Tak kak predstavlenie cifr v ASCII vyglyadit kak shest.30-39, a v EBCDIC - shest.F0-F9, to zamenu mozhno vypolnit' komandoj OR. Odnako, dopolnitel'no preobrazuem vse ostal'nye kody ASCII v probel (shest.40) v Assembler dlya IBM PC. Glava 14 30 kode EBCDIC. Dlya komandy XLAT neobhodimo opredelit' tablicu perekodirovki, kotoraya uchityvaet vse 256 vozmozhnyh simvolov, s kodami EBCDIC v ASCII poziciyah: XLTBL DB 47 DUP(40H) ;Probely v kode EBCDIC DB 0F0H,0F1H,0F2H,0F3H,...,0F9H ;0-9 (EBCDIC) DB 199 DUP(40H) ;Probely v kode EBCDIC Komanda XLAT predpolagaet adres tablicy v registre BX, a transliruemyj bajt (naprimer, polya ASCNO) v registre AL. Sleduyushchie komandy vypolnyayut podgotovku i translyaciyu bajta: LEA BX,XLTBL MOV AL,ASCNO XLAT Komanda XLAT ispol'zuet znachenie v registre AL v kachestve otnositel'nogo adresa v tablice, t.e. skladyvaet adres v BX i smeshchenie v AL. Esli, naprimer, ASCNO soderzhit 00, to adres bajta v tablice budet XLTBL+00 i komanda XLAT zamenit 00 na shest.40 iz tablicy. Esli pole ASCNO coderzhit shest.32, to adres sootvetstvuyushchego bajta v tablice budet XLTBL+50. |tot bajt soderzhit shest.F2 (2 v kode EBCDIC), kotoryj komanda XLAT zagruzhaet v registr AL. ------------------------------------------------------------ ------------------------------------------------------------ Ris.14.4. Preobrazovanie ASCII v EBCDIC. V programme na ris.14.4 dobavleno preobrazovanie desyatichnoj tochki (2E) i znaka minus (2D) iz koda ASCII v kod EBCDIC (4B i 60 sootvetstvenno). V programme organizovan cikl dlya obrabotki shestibajtovogo polya. Pole ASCNO v nachale vypolneniya programmy soderzhit znachenie 31.5 s posleduyushchim probelom, ili shest.2D33312E3520. V konce vypolneniya program my v pole EBCNO dolzhno byt' shest. 60F3F14BF540. PROGRAMMA: OTOBRAZHENIE SHEST. I ASCII-KODOV ------------------------------------------------------------ Programma, privedennaya na ris.14.5, otobrazhaet na ekrane pochti vse ASCII-simvoly, a takzhe ih shest.znacheniya. Naprimer, ASCII-simvol dlya shest.53 - eto bukva S, eti dannye programma vyvodit v vide 53 S. Polnoe izobrazhenie na ekrane vyglyadit v vide matricy 16h16: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ------------------------------------------------------------ Assembler dlya IBM PC. Glava 14 31 ------------------------------------------------------------ Ris.14.5. Otobrazhenie shest. i ASCII-kodov Kak bylo pokazano eshche na ris.8.1, otobrazhenie ASCII- simvolov, osobyh problem ne vyzyvaet. CHto zhe kasaetsya otobrazheniya shest.znachenij v simvolah ASCII, to etot process bolee slozhnyj. Naprimer, dlya vyvoda na ekran v kode ASCII shest. 00, 01 i t.d. neobhodimo preobrazovat' shest.00 v shest. 3030, shest.01 v shest.3031 i t.d. V programme nachal'noe znachenie polya HEXCTR ravno 00. |to znachenie posledovatel'no uvelichivaetsya na 1. Procedura C10HEX rasshcheplyaet bajt HEXCTR na dve shchest.cifry. Predpolozhim, chto bajt HEXCTR soderzhit shest. 4F. Procedura snachala vydelyaet shest.cifru 4 i ispol'zuet eto znachenie dlya perekodirovki po tablice XLATAB. V registre AL ustanavlivaet sya v rezul'tate znachenie shest.34. Zatem procedura vydelyaet vtoruyu shest.cifru F i perekodiruet ee v shest.46. V rezul'tate obrabotki poluchaetsya shest.3446, chto otobrazhaetsya na ekrane kak 4F. Tak kak funkciya DOS dlya vyvoda na ekran (shest.40) rassmatrivaet shest.1A kak konec fajla, to v programme eto znachenie zamenyaetsya na probel. Programma, ispol'zuyushchaya dlya vyvoda na ekran funkciyu DOS (shest.09), dozhna zamenyat' simvol ogranichitel' '$' na probel. Sushchestvuet mnogo razlichnyh sposobov preobrazovaniya shest.cifr v ASCII-simvoly. Mozhno poeksperimentirovat' s operaciyami sdviga i sravneniya. PROGRAMMA: SORTIROVKA |LEMENTOV TABLICY ------------------------------------------------------------ CHasto voznikaet neobhodimost' sortirovki elementov tablicy v voshodyashchem ili nishodyashchem poryadke. Naprimer, pol'zovatelyu mozhet potrebovat'sya spisok naimenovanij tovara v alfavitnom poryadke ili spisok obshchih cen v nishodyashchej posledovatel'nosti. Obychno, tablichnye dannye ne opredelyayutsya kak v predydushchej programme, a zagruzhayutsya s klaviatury ili s diska. Dannyj razdel posvyashchen sortirovke elementov tablicy, chto kasaetsya razlichnyh primenenij, vklyuchayushchih sortirovku zapisej na diskah, to zdes' vozmozhny bolee slozhnye programmy. Sushchestvuet neskol'ko algoritmov sortirovki tablic ot neeffektivnyh, no ponyatnyh, do effektivnyh i neponyatnyh. Programma sortirovki, predlagaemaya v dannom razdele, ves'ma effektivna i mozhet primenyat'sya dlya bol'shenstva tablichnyh sortirovok. Konechno, esli ne proverit' razlichnye algoritmy sortirovok, to dazhe samaya neeffektivnaya programma mozhet pokazat'sya rabotayushchej so skorost'yu sveta. No cel' dannoj knigi - pokazat' tehniku assemblera, a ne sortirovki. Osnovnoj podhod zaklyuchaetsya v sravnenii sosednih elementov tablicy. Esli pervyj element bol'she vtorogo, to elementy menyayutsya mestami. Takim obrazom vypolnyaetsya sravnenie elementov 1 so 2, 2 s 3 i t.d. do konca tablicy s Assembler dlya IBM PC. Glava 14 32 perestanovkoj elementov tam, gde eto neobhodimo. Esli v prohode byli sdelany perestanovki, to ves' process povtoryaet sya s nachala tablicy t.e. sravnivayutsya snova elementy 1-2, 2-3 i t.d. Esli v prohode ne bylo perestanovok, to tablica otsortirovana i mozhno prekratit' process. Nizhe priveden algoritm, v kotorom peremennaya SWAP yavlyaetsya indikatorom: byla perestanovka elementov (YES) ili net (NO): G10: Opredelit' adres poslednego elementa G20: Ustanovit' SWAP=NO Opredelit' adres pervogo elementa G30: |lement > sleduyushchego elementa? Da: Predstavit' elementy Ustanovit' SWAP=YES Perejti k sleduyushchemu elementu Konec tablicy? Net: Perejti na G30 Da: SWAP=YES? Da: Perejti na G20 (povtorit' sort.) Net: Konec sortirovki Programma, pokazannaya na ris.14.6, obespechivaet vvod s klaviatury do 30 imen, sortirovku vvedennyh imen v alfavit nom poryadke i vyvod na ekran otsortirovannogo spiska imen. ------------------------------------------------------------ ------------------------------------------------------------ Ris.14.6. Sortirovka tablicy imen. OPERATORY TIPA, DLINA I RAZMERA ------------------------------------------------------------ Assembler soderzhit ryad special'nyh operatorov, kotorye mogut okazat'sya poleznymi pri programmirovanii. Naprimer, pri izmenenii dliny tablicy pridetsya modificirovat' programmu (dlya novogo opredeleniya tablicy) i procedury, proveryayushchie konec tablicy. V etom sluchae ispol'zovanie operatorov TYPE (tip), LENGTH (dlina) i SIZE (razmer) pozvolyayut umen'shit' chislo modificiruemyh komand. Rassmotrim opredelenie sleduyushchej tablicy iz desyati slov: TABLEX DW 10 DUP(?) ;Tablica iz 10 slov Programma mozhet ispol'zovat' operator TYPE dlya opredeleniya tipa (DW v dannom sluchae), operator LENGTH dlya opredeleniya DUP-faktora (10) i operator SIZE dlya opredeleniya chisla bajtov (10 h 2 = 20). Sleduyushchie komandy illyustriruyut tri takih primeneniya: MOV AX,TYPE TABLEX ;AX=0002 MOV BX,LENGTH TABLEX ;BX=000A (10) MOV CX,SIZE TABLEX ;CX=0014 (20) Assembler dlya IBM PC. Glava 14 33 Znacheniya LENGTH i SIZE mozhno ispol'zlvat' dlya okonchaniya tablichnogo poiska ili sortirovki. Naprimer, esli registr SI soderzhit prodvinutyj adres tablicy pri osushchestvlenii poiska, to proverka na konec tablicy mozhet byt' sleduyushchij: CMP SI,SIZE TABLEX V glave 23 "Spravochnik po direktivam assemblera" daetsya detal'noe opisanie operatorov TYPE, LENGTH i SIZE. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® Dlya bol'shinstva primenenij, opredelyajte tablicy, imeyushchie rodstvennye elementy odnoj dliny i formata dannyh. ® Strojte tablicy na osnove formatov dannyh. Naprimer, elementy mogut byt' simvol'nye ili chislovye dlinoj odin, dva i bolee bajtov kazhdyj. Mozhet okazat'sya bolee praktichnym opredelenie dvuh tablic: odna, naprimer, dlya trehsimvol'nyh znachenij nomepov, a drugaya dlya dvuhbajtovyh znachenij cen edinic t