ris.12.2 procedura D10DWD demonstriruet prostoj sposob slozheniya soderzhimogo odnoj pary slov (WORD1A i WORD1B) s soderzhimym vtoroj pary slov (WORD2A i WORD2B) i sohraneniya summy v tret'ej pare slov (WORD3A i WORD3B). Snachala vypolnyaetsya slozhenie pravyh slov: WORD1B BC62 WORD2B 553A Summa: 1119C Summa - shest.1119C prevyshaet emkost' registra AX. Perepolnenie vyzyvaet ustanovku flaga perenosa v 1. Zatem vypolnyaetsya slozhenie levyh slov, no v dannom sluchae, vmesto komandy ADD ispol'zuetsya komanda slozheniya s perenosom ADC (ADd with Carry). |ta komanda skladyvaet dva znacheniya, i esli flag CF uzhe ustanovlen, to k summe pribavlyaetsya 1: WORD1A 0123 WORD2A 0012 Plyus perenos 1 Summa: 0136 Pri ispol'zovanii otladchika DEBUG dlya trassirovki arifmeticheskih komand mozhno uvidet' etu summu 0136 v registre AX, i obpatnye znacheniya 3601 v pole WORD3A i 9C11 v pole WORD3B. Na ris.12.2 procedura E10DWD demonstriruet podhod k slozheniyu znachenij lyuboj dliny. Dejstvie nachinaetsya so slozheniya samyh pravyh slov skladyvaemyh polej. V pervom cikle skladyvayutsya pravye clova, vo vtorom - slova, raspolozhennye levee. Pri etom adresa v registrah SI, DI i BX umen'shayutsya na 2. Po dve komanda DEC vypolnyayut etu operaciyu dlya kazhdogo registra. Primenyat' komandu SUB reg,02 v dannom sluchae nel'zya, t.k. pri etom budet ochishchen flag perenosa, chto privedet k iskazheniyu rezul'tata slozheniya. Vvidu nalichiya cikla, ispol'zuetsya tol'ko odna komanda slozheniya ADC. Pered ciklom komanda CLC (CLear Carry - ochistit' flag perenosa) ustanavlivaet nulevoe znachenie flaga perenosa. Dlya raboty dannogo metoda neobhodimo: 1) obespe chit' smezhnost' slov, 2) vypolnyat' obrabotku sprava nalevo i 3) zagruzit' v registr CX chislo skladyvaemyh slov. Dlya mnogoslovnogo vychitaniya ispol'zuetsya komanda SBB (SuBtract with Borrow - vychitanie s zaemom) ekvivalentnaya komande ADC. Zameniv v procedure E10DWD (ris.12.2) komandu ADC na SBB, poluchim proceduru dlya vychitaniya. BEZZNAKOVYE I ZNAKOVYE DANNYE ------------------------------------------------------------ Assembler dlya IBM PC. Glava 12 265 Mnogie chislovye polya ne imeyut znaka, naprimer, nomer abonenta, adres pamyati. Nekotorye chislovye polya predlagayutsya vsegda polozhitel'nye, naprimer, norma vyplaty, den' nedeli, znachenie chisla PI. Drugie chislovye polya yavlyayutsya znakovye, tak kak ih soderzhimoe mozhet byt' polozhitel'nym ili otricatel'nym. Naprimer, dolgovoj balans pokupatelya, kotoryj mozhet byt' otricatel'nym pri pereplatah, ili algebraicheskoe chislo. Dlya bezznakovyh velichin vse bity yavlyayutsya bitami dannyh i vmesto ogranicheniya +32767 registr mozhet soderzhat' chisla do +65535. Dlya znakovyh velichin levyj bajt yavlyaetsya znakovym bitom. Komandy ADD i SUB ne delayut raznicy mezhdu znakovymi i bezznakovymi velichinami, oni prosto skladyvayut i vychitayut bity. V sleduyushchem primere slozheniya dvuh dvoichnyh chisel, pervoe chislo soderzhit edinichnyj levyj bit. Dlya bezznakovogo chisla bity predstavlyayut polozhitel'noe chislo 249, dlya znakovogo - otricatel'noe chislo -7: Bezznakovoe Znakovoe 11111001 249 -7 00000010 2 +2 11111011 251 -5 Dvoichnoe predstavlenie rezul'tata slozheniya odinakovo dlya bezznakovogo i znakovogo chisla. Odnako, bity predstavlyayut +251 dlya bezznakovogo chisla i -5 dlya znakovogo. Takim odrazom, chislovoe soderzhimoe polya mozhet interpretirovat'sya po raznomu. Sostoyanie "perenos" voznikaet v tom sluchae, kogda imeetsya pepenos v znakovyj razryad. Sostoyanie "perepolnenie" voznika et v tom sluchae, kogda perenos v znakovyj razryad ne sozdaet perenosa iz razryadnoj setki ili perenos iz razryadnoj setki proiCXodit bez perenosa v znakovyj razryad. Pri vozniknovenii perenosa pri slozhenii bezznakovyh chisel, rezul'tat poluchaet sya nepravil'nyj: Bezznakovoe Znakovoe CF OF 11111100 252 -4 00000101 5 +5 00000001 1 1 1 0 (nepravil'no) Pri vozniknovenii perepolneniya pri slozhenii znakovyh chisel, rezul'tat poluchaetsya nepravil'nyj: Bezznakovoe Znakovoe CF OF 01111001 121 +121 00001011 11 +11 10000100 132 -124 0 1 (nepravil'no) Pri operaciyah slozheniya i vychitaniya mozhet odnovremenno vozniknut' i perepolnenie, i perenos: Assembler dlya IBM PC. Glava 12 266 Bezznakovoe Znakovoe CF OF 11110110 246 -10 10001001 137 -119 01111111 127 +127 1 1 (nepravil'no) (nepravil'no) UMNOZHENIE ------------------------------------------------------------ Operaciya umnozheniya dlya bezznakovyh dannyh vypolnyaetsya komandoj MUL, a dlya znakovyh - IMUL (Integer MULtiplication - umnozhenie celyh chisel). Otvetstvennost' za kontrol' nad formatom obrabatyvaemyh chisel i za vybor podhodyashchej komandy umnozheniya lezhit na samom programmiste. Sushchestvuyut dve osnovnye operacii umnozheniya: "Bajt na bajt". Mnozhimoe nahoditsya v registre AL, a mnozhi tel' v bajte pamyati ili v odnobajtovom registre. Posle umnozheniya proizvedenie nahoditsya v registre AX. Operaciya ignoriruet i stipaet lyubye dannye, kotorye nahodilis' v registre AH. | AH | AL | | AX | Do umnozheniya:| |Mnozhimoe| Posle:|Proizvedenie| "Slovo na slovo". Mnozhimoe nahoditsya v registre AX, a mno zhitel' - v slove pamyati ili v registre. Posle umnozheniya proizvedenie nahoditsya v dvojnom slove, dlya kotorogo trebuetsya dva registra: starshaya (levaya) chast' proizvedeniya nahoditsya v registre DX, a mladshaya (pravaya) chast' v registre AX. Operaciya ignoriruet i stiraet lyubye dannye, kotorye nahodilis' v registre DX. | AX | | DX || AX | Do umnozheniya:|Mnozhimoe| Posle: |St.chast'||Ml.chast'| | Proizvedenie | V edinstvennom operande komand MUL i IMUL ukazyvaetsya mnozhitel'. Rassmotrim sleduyushchuyu komandu: MUL MULTR Esli pole MULTR opredeleno kak bajt (DB), to operaciya predpolagaet umnozhenie soderzhimogo AL na znachenie bajta iz polya MULTR. Esli pole MULTR opredeleno kak slovo (DW), to opereciya predpolagaet umnozhenie soderzhimogo AX na znachenie slova iz polya MULTR. Esli mnozhitel' nahoditsya v registre, to dlina registra opredelyaet tip operacii, kak eto pokazanno nizhe: MUL CL ;Bajt-mnozhitel': mnozhimoe v AL, proizved. v AX MUL BX ;Slovo-mnozhitel':mnozhimoe v AX, proizv.v DX:AX Assembler dlya IBM PC. Glava 12 267 Bezznakovoe umnozhenie: Komanda MUL Komanda MUL (MULtiplication - umnozhenie) umnozhaet bezzna kovye chisla. Na ris. 12.3 v procedure C10MUL dano tri primera umnozheniya: bajt na bajt, slovo na slovo i slovo na bajt. Pervyj primer komandy MUL umnozhaet shest.80 (128) na shest.47 (64). Proizvedenie -sh est.2000 (8192) poluchaetsya v registre AX. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 12.3. Bezznakovoe i znakovoe umnozhenie. Vtoroj primer komandy MUL generiruet shest. 10000000 v registpah DX:AX. Tretij primer komandy MUL vypolnyaet umnozhenie slova na bajt i trebuet rasshirenie bajta BYTE1 do razmerov slova. Tak kak predpolagayutsya bezznakovye velichiny, to v primere levyj bit registra AH raven nulyu. (Pri ispol'zovanii komandy CBW znachenie levogo bita registpa AL mozhet byt' 0 ili 1). Proizvedenie - shest. 00400000 poluchaetsya v registrah DX:AX. Znakovoe umnozhenie: Komanda IMUL Komanda IMUL (Integer MULtiplication - umnozhenie celyh chisel) umnozhaet znakovye chisla. Na ris. 12.3 v procedure D10IMUL ispol'zuyutsya te zhe tri primera umnozheniya, chto i v procedure C10MUL, no vmesto komand MUL zapisany komandy IMUL. Pervyj primer komandy IMUL umnozhaet shest.80 (otricatel' noe chislo) na shest.40 (polozhitel'noe chislo). Proizvedenie - shest.E000 poluchaetsya v registre AX. Ispol'zuya te zhe dannye, komanda MUL daet v rezul'tate shest.2000, tak chto mozhno videt' raznicu v ispol'zovanii komand MUL i IMUL. Komanda MUL rassmatrivaet shest.80 kak +128, a komanda IMUL - kak -128. V rezul'tate umnozheniya -128 na +64 poluchaetsya -8192 ili shest.E000. (Poprobujte preobrazovat' shest.E000 v desyatichnyj format). Vtoroj primer komandy IMUL umnozhaet shest.8000 (otricatel' noe znachenie) na shest.2000 (polozhitel'noe znachenie). Proizvedenie - shest.F0000000 poluchaetsya v registrah DX:AX i predstavlyaet soboj otricatel'noe znachenie. Tretij primer komandy IMUL pered umnozheniem vypolnyaet rasshirenie bajta BYTE1 do razmerov slova v registre AX. Tak kak znacheniya predpolagayutsya znakovye, to v primere ispol'zuetsya komanda CBW dlya perevoda levogo znakovogo bita v registr AH: shest.80 v pegistre AL prevrashchaetsya v shest.FF80 v registre AX. Poskol'ku mnozhitel' v slove WORD1 imeet takzhe otricatel'noe znachenie, to proizvedenie dolzhno poluchitsya polozhitel'noe. V samom dele: shest.00400000 v Assembler dlya IBM PC. Glava 12 268 registrah DX:AX - takoj zhe rezul'tat, kak i v sluchae umnozheniya komandoj MUL, kotoraya predpolagala polozhitel'nye somnozhiteli. Takim obrazom, esli mnozhimoe i mnozhitel' imeet odinakovyj znakovyj bit, to komandy MUL i IMUL generiruyut odinakovyj rezul'tat. No, esli somnozhiteli imeyut raznye znakovye bity, to komanda MUL vyrabatyvaet polozhitel'nyj rezul'tat umnozheniya, a komanda IMUL - otricatel'nyj. Mozhno obnaruzhit' eto, ispol'zuya otladchik DEBUG dlya trassirovki primerov. Povyshenie effektivnosti umnozheniya: Pri umnozhenii na stepen' chisla 2 (2,4,8 i t.d.) bolee effektivnym yavlyaetsya sdvig vlevo na trebuemoe chislo bitov. Sdvig bolee chem na 1 trebuet zagruzki velichiny sdviga v registr CL. V sleduyushchih primerah predpolozhim, chto mnozhimoe nahoditsya v registre AL ili AX: Umnozhenie na 2: SHL AL,1 Umnozhenie na 8: MOV CL,3 SHL AX,CL Mnogoslovnoe umnozhenie Obychno umnozhenie imeet dva tipa: "bajt na bajt" i "slovo na slovo". Kak uzhe bylo pokazano, maksimal'noe znakovoe znachenie v slove ogranicheno velichinoj +32767. Umnozhenie bol'shih chisel trebuet vypolneniya nekotoryh dopolnitel'nyh dejstvij. Rassmatrivaemyj podhod predpolagaet umnozhenie kazhdogo slova otdel'no i slozhenie poluchennyh rezul'tatov. Rassmotrim sleduyushchee umnozhenie v desyatichnom formate: 1365 h12 2730 1365 16380 Predstavim, chto desyatichnaya arifmetika mozhet umnozhat' tol'ko dvuhznachnye chisla. Togda mozhno umnozhit' 13 i 65 na 12 razdel'no, cleduyushchim obrazom: 13 65 h12 h12 26 130 13 65 156 780 Sleduyushchim shagom slozhim poluchennye proizvedeniya, no poskol'ku chislo 13 predstavlyalo sotni, to pervoe proizvedenie v dejstvitel'nosti budet 15600: 15600 Assembler dlya IBM PC. Glava 12 269 +780 16380 Assemblernaya programma ispol'zuet analogichnuyu tehniku za isklyucheniem togo, chto dannye imeyut razmernost' slov (chetyre cifry) v shestnadcaterichnom formate. Umnozhenie dvojnogo slova na slovo. Procedura E10XMUL na ris.12.4 umnozhaet dvojnoe slovo na slovo. Mnozhimoe, MULTCND, sostoit iz dvuh slov, soderzhashchih sootvetstvenno shest. 3206 i shest. 2521. Opredelenie dannyh v vide dvuh slov (DW) vmesto dvojnogo slova (DD) obuslovleno neobhodimost'yu pravil'noj adresacii dlya komand MOV, peresylayushchih slova v registr AX. Mnozhitel' MULTPLR soderzhit shest. 6400. Oblast' dlya zapisi proizvedeniya, PRODUCT, sostoit iz treh slov. Pervaya komanda MUL peremnozhaet MULTPLR i pravoe clovo polya MULTCND; proizvedenie - shest. 0E80 E400 zapisyvaetsya v PRODUCT+2 i PRODUCT+4. Vtoraya komanda MUL peremnozhaet MULTPLR i levoe slovo polya MULTCND, poluchaya v rezul'tate shest. 138A 5800. Dalee vypolnyaetsya slozhenie dvuh proizvedenij sleduyushchim obrazom: Proizvedenie1: 0000 0E80 E400 Proizvedenie 2: 138A 5800 Rezul'tat: 138A 6680 E400 Tak kak pervaya komanda ADD mozhet vyrabotat' perenos, to vtoroe clozhenie vypolnyaetsya komandoj slozheniya s perenosom ADC (ADd with Carry). V silu obratnogo predstavleniya bajtov v slovah v processopah 8086/8088, oblast' PRODUCT v dejstvi tel'nosti budet soderzhat' znachenie 8A13 8066 00E4. Programma predpolagaet, chto pervoe slovo v oblasti PRODUCT imeet nachal'noe znachenie 0000. ------------------------------------------------------------ ------------------------------------------------------------ Ris.12.4. Mnogoslovnoe umnozhenie. Umnozhenie "dvojnogo slova na dvojnoe slovo". Umnozhenie dvuh dvojnyh slov vklyuchaet sleduyushchie chetyre operacii umnozheniya: Mnozhimoe Mnozhitel' slovo 2 h slovo 2 slovo 2 h slovo 1 slovo 1 h slovo 2 slovo 1 h slovo 1 Kazhdoe proizvedenie v registrah DX i AX skladyvaetsya s sootvetstvuyushchim slovom v okonchatel'nom rezul'tate. Primer takogo umnozheniya priveden v procedure F10XMUL na ris. 12.4. Assembler dlya IBM PC. Glava 12 270 Mnozhimoe MULTCND soderzhit shest. 3206 2521, mnozhitel' MULTPLR - shest. 6400 0A26. Rezul'tat zanositsya v oblast' PRODUCT, sostoyashchuyu iz chetyreh slov. Hotya logika umnozheniya dvojnyh slov analogichna umnozheniyu dvojnogo slova na slovo, imeetsya odna osobennost', posle pary komand slozheniya ADD/ADC ispol'zuetsya eshche odna komanda ADC, kotoraya pribavlyaet 0 k znacheniyu v pole PRODUCT. |to neobhodimo potomu, chto pervaya komanda ADC sama mozhet vyzvyt' perenos, kotoryj posleduyushchie komandy mogut steret'. Poetomu vtoraya komanda ADC pribavit 0, esli perenosa net, i pribavit 1, esli perenos est'. Final'naya para komand ADD/ADC ne treduet dopolnitel'noj komandy ADC, tak kak oblast' PRODUCT dostatochno velika dlya generacii okonchatel'nogo rezul'tata i perenosa na poslednem etape ne budet. Okonchatel'nyj rezul'tat 138A 687C 8E5C CCE6 poluchitsya v pole PRODUCT v obratnoj zapisi bajt v slovah. Vypolnite trassirovku etogo primera s pomoshch'yu otladchika DEBUG. SDVIG REGISTROVOJ PARY DX:AX ------------------------------------------------------------ Sleduyushchaya podprogramma mozhet byt' polezna dlya sdviga soderzhimogo pegistrovoj pary DX:AX vpravo ili vlevo. Mozhno pridumat' bolee effektivnyj metod, no dannyj primer predstavlyaet obshchij podhod dlya lyubogo chisla ciklov (i, sootvetstvenno, sdvigov) v registre CX. Zamet'te, chto sdvig edinichnogo bita za razryadnuyu setku ustanavlivaet flag perenosa. Sdvig vlevo na 4 bita MOV CX,04 ;Inicializaciya na 4 cikla C20: SHL DX,1 ;Sdvinut' DX na 1 bit vlevo SHL AX,1 ;Sdvinut' AX na 1 bit vlevo ADC DX,00 ;Pribavit' znachenie perenosa LOOP C20 ;Povtorit' Sdvig vpravo na 4 bita MOV CX,04 ;Inicializaciya na 4 cikla D20: SHR AX,1 ;Sdvinut' AX na 1 bit vpravo SHR DX,1 ;Sdvinut' DX na 1 bit vpravo JNC D30 ;Esli est' perenos, OR AH,10000000B ; to vstavit' 1 v AH D30: LOOP D20 ;Povtorit' Nizhe priveden bolee effektivnyj sposob dlya sdviga vlevo, ne trebuyushchij organizacii cikla. V etom primere faktor sdviga zapisyvaetsya v registr CL. Primer napisan dlya sdviga na 4 bita, no mozhet byt' adaptirovan dlya drugih velichin sdvigov: MOV CL,04 ;Ustanovit' faktor sdviga SHL DX,CL ;Sdvinut' DX vlevo na 4 bita MOV BL,AH ;Sohranit' AH v BL SHL AX,CL ;Sdvinut' AX vlevo na 4 bita SHL BL,CL ;Sdvinut' BL vpravo na 4 bita Assembler dlya IBM PC. Glava 12 271 OR DL,BL ;Zapisat' 4 bita iz BL v DL DELENIE ------------------------------------------------------------ Operaciya deleniya dlya bezznakovyh dannyh vypolnyaetsya komandoj DIV, a dlya znakovyh - IDIV. Otvetstvennost' za podbor podhodyashchej komandy lezhit na programmiste. Sushchestvuyut dve osnovnye operacii deleniya: Delenie "slova na bajt". Delimoe nahoditsya v registre AX, a delitel' - v bajte pamyati ili a odnobajtovom registre. Posle deleniya ostatok poluchaetsya v registre AH, a chastnoe - v AL. Tak kak odnobajtovoe chastnoe ochen' malo (maksimal'no +255 (shest.FF) dlya bezznakovogo deleniya i +127 (shest.7F) dlya znakovogo), to dannaya operaciya imeet ogranichennoe ispol'zovanie. | AX | | AH | AL | Do deleniya: | Delimoe| Posle: |Ostatok|CHastnoe| Delenie "dvojnogo slova na slovo". Delimoe nahoditsya v registrovoj pare DX:AX, a delitel' - v slove pamyati ili a registre. Posle deleniya ostatok poluchaetsya v registre DX, a chastnoe v registre AX. CHastnoe v odnom slove dopuskaet maksimal'noe znachenie +32767 (shest.FFFF) dlya bezznakovogo deleniya i +16383 (shest.7FFF) dlya znakovogo. | DX || AX | | AH || AL | Do deleniya:|St.chast'||Ml.chast'| Posle:|Ostatok||CHastnoe| | Delimoe | V edinstvennom operande komand DIV i IDIV ukazyvaetsya delitel'. Rassmotrim sleduyushchuyu komandu: DIV DIVISOR Esli pole DIVISOR opredeleno kak bajt (DB), to operaciya predpolagaet delenie slova na bajt. Esli pole DIVISOR opredeleno kak slovo (DW), to operaciya predpolagaet delenie dvojnogo slova na slovo. Pri delenii, naprimer, 13 na 3, poluchaetsya razel'tat 4 1/3. CHastnoe est' 4, a ostatok - 1. Zametim, chto ruchnoj kal'kulyator (ili programma na yazyke BASIC) vydaet v etom sluchae rezul'tat 4,333.... Znachenie soderzhit celuyu chast' (4) i drobnuyu chast' (,333). Znachenie 1/3 i 333... est' drobnye chasti, v to vremya kak 1 est' ostatok ot deleniya. Bezznakovoe delenie: Komanda DIV Komanda DIV delit bezznakovye chisla. Na ris.12.5 v procedure D10DIV dano chetyre primera deleniya: slovo na bajt, bajt na bajt, dvojnoe slovo na slovo i slovo na slovo. Assembler dlya IBM PC. Glava 12 272 Pervyj primer komandy DIV delit shest.2000 (8092) na shest.80 (128). V rezul'tate ostatok 00 poluchaetsya v registre AH, a chastnoe shest.40 (64) - v registre AL. Vtoroj primer komandy DIV vypolnyaet prezhde rasshirenie bajta BYTE1 do razmerov slova. Tak kak zdes' predpolagaetsya bezznakovaya velichina, to v primere levyj bit registra AH raven nulyu. V rezul'tate deleniya ostatok - shest. 12 poluchaet sya v registre AH, a chastnoe shest.05 - v registre AL. Tretij primer komandy DIV generiruet ostatok shest. 1000 v registre DX i chastnoe shest. 0080 v registre AX. V chetvertom primere komandy DIV snachala vypolnyaetsya rasshirenie slova WORD1 do dvojnogo slova v registre DX. Posle deleniya ostatok shest.0000 poluchitsya v registre DX, a chastnoe shest. 0002 - v registre AX. ------------------------------------------------------------ ------------------------------------------------------------ Ris.15.5. Bezznakovoe i znakovoe delenie. Znakovoe delenie: Komanda IDIV Komanda IDIV (Integer DIVide) vypolnyaet delenie znakovyh chisel. Na ris.12.5 v procedure E10IDIV ispol'zuyutsya te zhe chetyre primera deleniya, chto i v procedure D10DIV, no vmesto komand DIV zapisany komandy IDIV. Pervyj primer komandy IDIV delit shest.2000 (polozhitel'noe chislo) na shest.80 (otri catel'noe chislo). Ostatok ot deleniya - shest. 00 poluchaetsya v registre AH , a chastnoe - shest. C0 (-64) - v registre AL. Komanda DIV, ispol'zuya te zhe chisla, generiruet chastnoe +64. SHestnadcatirichnye rezul'taty treh ostal'nyh primerov deleniya privedeny nizhe: Primer komandy IDIV Ostatok CHastnoe 2 EE (-18) FB (-5) 3 1000 (4096) 0080 (128) 4 0000 0002 Tol'ko v primere 4 vyrabatyvaetsya takoj zhe rezul'tat, chto i dlya komandy DIV. Takim obrazom, esli delimoe i delitel' imeyut odinakovyj znakovyj bit, to komandy DIV i IDIV generiruyut odinakovyj pezul'tat. No, esli delimoe i delitel' imeyut raznye znakovye bity, to komanda DIV generiruet polozhi tel'noe chastnoe, a komanda IDIV - otricatel'noe chastnoe. Mozhno obnaruzhit' eto, ispol'zuya otladchik DEBUG dlya trassi rovki etih primerov. Povyshenie proizvoditel'nosti. Pri delenii na stepen' chisla 2 (2, 4, i t.d.) bolee effektivnym yavlyaetsya sdvig vpravo na trebuemoe chislo bitov. V sleduyushchih primerah predpolozhim, chto delimoe nahoditsya v registre AX: Delenie na 2: SHR AX,1 Assembler dlya IBM PC. Glava 12 273 Delenie na 8: MOV CL,3 SHR AX,CL Perepolneniya i preryvaniya Ispol'zuya komandy DIV i osobenno IDIV, ochen' prosto vyzvat' pepepolnenie. Preryvaniya privodyat (po krajnej mara v sisteme, ispol'zuemoj pri testirovanii etih programm) k nepredskazuemym rezul'tatam. V operaciyah deleniya predpolaga etsya, chto chastnoe znachitel'no men'she, chem delimoe. Delenie na nol' vsegda vyzyvaet preryvanie. No delenie na 1 generiruet chastnoe, kotoroe ravno delimomu, chto mozhet takzhe legko vyzvat' preryvanie. Rekomenduetsya ispol'zovat' sleduyushchee pravilo: esli delitel' - bajt, to ego znachenie dolzhno byt' men'she, chem levyj bajt (AH) delitelya: esli delitel' - slovo, to ego znachenie dolzhno byt' men'she, chem levoe slovo (DX) delitelya. Proillyustriruem dannoe pravilo dlya delitelya, ravnogo 1: Operaciya deleniya: Delimoe Delitel' CHastnoe Slovo na bajt: 0123 01 (1)23 Dvojnoe slovo na slovo: 0001 4026 0001 (1)4026 V oboih sluchayah chastnoe prevyshaet vozmozhnyj razmer. Dlya togo chtoby izbezhat' podobnyh situacij, polezno vstavlyat' pered komandami DIV i IDIV sootvetstvuyushchuyu proverku. V pervom iz sleduyushchih primepov predpolozhim, chto DIVBYTE - odnobajtovyj delitel', a delimoe nahoditsya uzhe v registre AX. Vo vtorom primere predpolozhim, chto DIVWORD - dvuhbajtovyj delitel', a delimoe nahoditsya v registrovoj pare DX:AX. Slovo na bajt Dvojnoe slovo na bajt CMP AH,DIVBYTE CMP DX,DIVWORD JNB perepolnenie JNB perepolnenie DIV DIVBYTE DIV DIVWORD Dlya komandy IDIV dannaya logika dolzhna uchityvat' tot fakt, chto libo delimoe, libo delitel' mogut byt' otricatel'nymi, a tak kak sravnivayutsya absolyutnye znacheniya, to neobhodimo ispol'zovat' komandu NEG dlya vremennogo perevoda otricatel'nogo znacheniya v polozhitel'noe. Delenie vychitaniem Esli chastnoe slishkom veliko, to delenie mozhno vypolnit' s pomoshch'yu ciklicheskogo vychitaniya. Metod zaklyuchaetsya v tom, chto delitel' vychitaetsya iz delimogo i v etom zhe cikle chastnoe uvelichivaetsya na 1. Vychitanie prodolzhaetsya, poka delimoe ostaetsya bol'she delitelya. V cleduyushchem primere, delitel' nahoditsya v registre AX, a delimoe - v BX, chastnoe vyrabatyvaetsya v CX: Assembler dlya IBM PC. Glava 12 274 SUB CX,CX ;Ochistka chastnogo C20: CMP AX,BX ;Esli delimoe < delitelya, JB C30 ; to vyjti SUB AX,BX ;Vychitanie delitelya iz delimogo INC CX ;Inkrement chastnogo JMP C20 ;Povtorit' cikl S30: RET ;CHastnoe v CX, ostatok v AX V konce podprogrammy registr CX budet soderzhat' chastnoe, a AX - ostatok. Primer umyshlenno primitiven dlya demonstracii dannoj tehniki deleniya. Esli chastnoe poluchaetsya v registro voj pare DX:AX, to neobhodimo sdelat' dva dopolneniya: 1. V metke C20 sravnivat' AX i BX tol'ko pri nulevom DX. 2. Posle komandy SUB vstavit' komandu SBB DX,00. Primechanie: ochen' bol'shoe chastnoe i malyj delitel' mogut vyzvat' tysyachi ciklov. PREOBRAZOVANIE ZNAKA ------------------------------------------------------------ Komanda NEG obespechivaet preobrazovanie znaka dvoichnyh chisel iz polozhitel'nogo v otricatel'noe i naoborot. Prakticheski komanda NEG ustanavlivaet protivopolozhnye znacheniya bitov i pribavlyaet 1. Primery: NEG AX NEG BL NEG BINAMT (bajt ili slovo v pamyati) Preobrazovanie znaka dlya 35-bitovogo (ili bol'shego) chisla vklyuchaet bol'she shagov. Predpolozhim, chto registrovaya para DX:AX soderzhit 32-bitovoe dvoichnoe chislo. Tak kak komanda NEG ne mozhet obrabatyvat' dva registra odnovremenno, to ee ispol'zovanie privedet k nepravil'nomu rezul'tatu. V sleduyu shchem primere pokazano ispol'zovanie komandy NOT: NOT DX ;Invertirovanie bitov NOT AX ;Invertirovanie bitov ADD AX,1 ;Pribavlenie 1 k AX ADC DX,0 ;Pribavlenie perenosa k DX Ostaetsya odna neznachitel'naya problema: nad chislami, predstavlennymi v dvoichnom formate, udobno vypolnyat' arifme ticheskie operacii, esli sami chisla opredeleny v programme. Dannye, vvodimye v programmu s diskovogo fajla, mogut takzhe imet' dvoichnyj format. No dannye, vvodimye s klaviatury, predstavlenny v ASCII-formate. Hotya ASCII-kody udobny dlya otobrazheniya i pechati, oni trebuyut special'nyh preobrazovanij v dvoichnyj format dlya arifmeticheskih vychislenij. No eto uzhe tema sleduyushchej glavy. Assembler dlya IBM PC. Glava 12 275 PROCESSORY INTEL 8087 I 80287 DLYA OBRABOTKI CHISLOVYH DANNYH ------------------------------------------------------------ Sistemnaya plata komp'yutera soderzhit pustoe gnezdo, zarezervirovannoe dlya chislovogo processora Intel 8087 (ili 80287). Soprocessor 8087 dejstvuet sovmestno s 8088, a sopro cessor 80287 dejstvuet sovmestno s 80286. Kazhdyj soprocessor imeet sobstvennyj nabor komand i sredstva dlya operacij s plavayushchej zapyatoj dlya vypolneniya eksponencial'nyh, logarifmicheskih i trigonometricheskih funkcij. Soprocessor soderzhit vosem' 80-bitovyh registrov s plavayushchej zapyatoj, kotorye mogut predstavit' chislovye znacheniya do 10 v 400 ste peni. Matematicheskie vychisleniya v soprocessore vypolnyayutsya primerno v 100 raz bystree, chem v osnovnom processore. Osnovnoj processor vypolnyaet special'nye operacii i peredaet chislovye dannye v soprocessor, kotoryj vypolnyaet neobhodimye vychisleniya i vozvrashchaet rezul'tat. Dlya assembli rovaniya s pomoshch'yu translyatora MASM, neobhodimo dobavlyat' parametr /E ili /R, naprimer, MASM /R. OSNOVNYE POLOZHENIYA NA PAMYATX ------------------------------------------------------------ ® Bud'te osobenno vnimatel'ny pri ispol'zovanii odnobajto vyh pegistrov. Znakovye znacheniya zdes' mogut byt' ot -128 do +127. ® Dlya mnogoslovnogo slozheniya ispol'zujte komandu ADC dlya ucheta perenosov ot predydushchih slozhenij. Esli operaciya vypolnyaetsya v cikle, to ispol'zuya komandu CLC, ustanovite flag perenosa v 0. ® Ispol'zujte komandy MUL ili DIV dlya bezznakovyh dannyh i komandy IMUL ili IDIV dlya znakovyh. ® Pri delenii bud'te ostorozhny s perepolneniyami. Esli nulevoj delitel' vozmozhen, to obespech'te proverku etoj operacii. Krome togo, delitel' dolzhen byt' bol'she soderzhimogo registra AH (dlya bajta) ili DX (dlya slova). ® Dlya umnozheniya ili deleniya na stepen' dvojki ispol'zujte cdvig. Sdvig vpravo vypolnyaetsya komandoj SHR dlya bezzna kovyh polej i komandoj SAR dlya znakovyh polej. Dlya sdviga vlevo ispol'zuyutsya identichnye komandy SHL i SAL. ® Bud'te vnimatel'ny pri assemblirovanii po umolchaniyu. Naprimer, esli pole FACTOR opredeleno kak bajt (DB), to komanda MUL FACTOR polagaet mnozhimoe v registre AL, a komanda DIV FACTOR polagaet delimoe v registre AX. Esli FACTOR opredelen kak slovo (DW), to komanda MUL FACTOR polagaet mnozhimoe v registre AX, a komanda DIV FACTOR polagaet delimoe v registrovoj pare DX:AX. Assembler dlya IBM PC. Glava 12 276 VOPROSY DLYA SAMOPROVERKI ------------------------------------------------------------ Vse voprosy imeyut otnoshenie k sleduyushchim dannym: DATAX DW 0148H DW 2316H DATAY DW 0237H DW 4052H 12.1. Zakodirujte komandy dlya slozheniya a) slova DATAX so slovom DATAY; b) dvojnogo slova, nachinayushchegosya po adresu DATAX, s dvojnym slovom v DATAY. 12.2. Ob®yasnite dejstvie sleduyushchih komand: STC MOV BX,DATAX ADC BX,DATAY 12.3. Zakodirujte komandy dlya umnozheniya (MUL): a) slova DATAX na slovo DATAY; b) dvojnogo slova , nachinayushchego sya po adresu DATAX, na slovo DATAY. 12.4. Kakoj delitel', krome nulya, vyzyvaet oshibku perepolneniya? 12.5. Zakodirujte komandy dlya deleniya (DIV): a) slova DATAX na 23; b) dvojnogo slova, nachinayushchegosya po adresu DATAX, na slovo DATAY. 12.6. Poslednij primer v razdele "Sdvig registrovrj pary DX:AX" yavlyaetsya bolee effektivnym po sravneniyu s predydushchimi primerami dlya sdviga vlevo na chetyre bita. Izmenite primer dlya sdviga vpravo na chetyre bita. Assembler dlya IBM PC. Glava 13 1 GLAVA 13. Arifmeticheskie operacii II: ------------------------------------------------------------ Arifmeticheskie operacii II: Obrabotka dannyh v formatah ASCII i BCD Cel': Rassmotret' ASCII i BCD formaty dannyh i dat' svedeniya o preobrazovaniyah mezhdu etimi formatami i dvoichnym formatom. VVEDENIE ------------------------------------------------------------ Dlya polucheniya vysokoj proizvoditel'nosti komp'yuter vypolnyaet arifmeticheskie operacii nad chislami v dvoichnom formate. Kak pokazano v glave 12, etot format ne vyzyvaet osobyh trudnostej, esli dannye opredeleny v samoj programme. Vo mnogih sluchayah novye dannye vvodyatsya programmoj s klaviatury v vide ASCII simvolov v decyatichnom formate. Analogichno vyvod informacii na ekran osushchestvlyaetsya v kodah ASCII. Naprimer, chislo 23 v dvoichnom predstavlenii vyglyadit kak 00010111 ili shest.17; v kode ASCII na kazhdyj cimvol trebuetsya odin bajt i chislo 25 v ASCII-kode imeet vnutpennee predstavlenie shest.3235. Naznachenie dannoj glavy - pokazat' tehniku preobrazovaniya dannyh iz ASCII-formata v dvoichnyj format dlya vypolneniya arifmeticheskih operacij i obratnogo preobrazovaniya dvoichnyh rezul'tatov v ASCII-format dlya vyvoda na ekran ili printer. Programma, privedennaya v konce glavy , demonstriruet bol'shuyu chast' matepiala ot glavy 1 do glavy 12. Pri programmirovanii na yazykah vysokogo urovnya, takih kak BASIC ili Pascal, dlya oboznacheniya poryadka chisla ili polozhe niya desyatichnoj zapyatoj (tochki) mozhno polozhit'sya na kampilyator. Odnako, komp'yuter ne raspoznaet desyatichnuyu zapyatuyu (tochku) v arifmeticheskih polyah. Tak kak dvoichnye chisla ne imeyut vozmozhnosti ustanovki desyatichnoj (ili dvoichnoj) zapyatoj (tochki), to imenno programmist dolzhen podrazumevat' i opredelit' poryadok obrabatyvaemyh chisel. ASCII-format ------------------------------------------------------------ Dannye, vvodimye s klaviatury, imeyut ASCII-format, naprimer, bukvy SAM imeyut v pamyati shestnadcatirichnoe predstavlenie 53414D, cifry 1234 - shest. 31323334. Vo mnogih sluchayah format alfavitnyh dannyh, naprimer, imya cheloveka ili opisanie stat'i, ne menyaetsya v programme. No dlya vypolneniya arifmeticheskih operacij nad chislovymi znacheniyami, takimi kak shest. 31323334, trebuetsya special'naya obrabotka. S pomoshch'yu sleduyushchih assemblernyh komand mozhno vypolnyat' arifmeticheskie operacii neposredstvenno nad chislami v ASCII-formate: Assembler dlya IBM PC. Glava 13 2 AAA (ASCII Adjust for Addition - korrekciya dlya slozheniya ASCII-koda) AAD (ASCII Adjust for Division - korrekciya dlya deleniya ASCII-koda) AAM (ASCII Adjust for Multiplication - korrekciya dlya umnozheniya ASCII-koda) AAS (ASCII Adjust for Subtraction - korrekciya dlya vychitaniya ASCII-koda) |ti komandy kodiruyutsya bez operandov i vypolnyayut avtomatiches kuyu korrekciyu v registre AX. Korrekciya neobhodima, tak kak ASCII kod predstavlyaet tak nazyvaemyj raspakovannyj desyatichnyj format, v to vremya, kak komp'yuter vypolnyaet arifmeticheskie operacii v dvoichnom formate. Slozhenie v ASCII-formate Rassmotrim process slozheniya chisel 8 i 4 v ASCII-formate: SHest. 38 34 SHest. 6C Poluchennaya summa nepravil'na ni dlya ASCII-formata, ni dlya dvoichnogo formata. Odnako, ignoriguya levuyu 6 i pribaviv 6 k pravoj shest.C: shest.C + 6 = shest.12 - poluchim pravil'nyj rezul'tat v desyatichnom formate. Pravil'nyj primer slegka uproshchen, no on horosho demonstriruet process, kotoryj vypolnya et komanda AAA pri korrekcii. V kachestve primera, predpolozhim, chto registr AX soderzhit shest. 0038, a registr BX - shest.0034. CHisla 38 i 34 predstavlyayut dva bajta v ASCII formate, kotorye neobhodimo slozhit'. Slozhenie i korrekciya kodiruetsya sleduyushchimi komandami: ADD AL,BL ;Slozhit' 34 i 38 AAA ;Korrekciya dlya slozheniya ASCII kodov Komanda AAA proveryaet pravuyu shest. cifru (4 bita) v registre AL. Esli eta cifra nahoditsya mezhdu A i F ili flag AF raven 1, to k registru AL pribavlyaetsya 6, a k registru AH pribavlyaetsya 1, flagi AF i CF ustanavlivayutsya v 1. Vo vseh sluchayah komanda AAA ustanavlivaet v 0 levuyu shest. cifru v registre AL. Rezul'tat - v registre AX: Posle komandy ADD: 006C Posle komandy AAA: 0102 Dlya togo, chtoby vyrabotat' okonchatel'noe ASCII-predstav lenie, dostatochno prosto postavit' trojki na mesto levyh shest. cifr: OR AX,3030H ;Rezul'tat 3132 Assembler dlya IBM PC. Glava 13 3 Vse pokazannoe vyshe predstavlyaet slozhenie odnobajtovyh chisel. Slozhenie mnogobajtovyh ASCII-chisel trebuet organiza cii cikla, kotoryj vypolnyaet obrabotku sprava nalevo s uchetom perenosa. Primer , pokazannyj na ris.13.1 skladyvaet dva trehbajtovyh ASCII-chisla v chetyrehbajtovuyu summu. Obratite vnimanie na sleduyushchee: ® V programme ispol'zuetsya komanda ADC, tak kak lyuboe slozhenie mozhet vyzvat' perenos, kotoryj dolzhen byt' pribavlen k sleduyushchemu (sleva) bajtu. Komanda CLC ustanavlivaet flag CF v nulevoe sostoyanie. ------------------------------------------------------------ ------------------------------------------------------------ Ris. 13.1. Slozhenie v ASCII-formate. ® Komanda MOV ochishchaet registr AH v kazhdom cikle, tak kak komanda AAA mozhet pribavit' k nemu edinicu. Komanda ADC uchityvaet pepenosy. Zamet'te, chto ispol'zovanie komand XOR ili SUB dlya ochistki registra AH izmenyaet flag CF. ® Kogda zavershaetsya kazhdyj cikl, proishodit peresylka soderzhimogo pegistra AH (00 ili 01) v levyj bajt summy. ® V rezul'tate poluchaetsya summa v vide 01020702. Program ma ne ispol'zuet komandu OR posle komandy AAA dlya zaneseniya levoj trojki, tak kak pri etom ustanavlivaet sya flag CF, chto izmenit pezul'tat komandy ADC. Odnim iz reshenij v dannom sluchae yavlyaetsya sohranenie flagovogo registra s pomoshch'yu komandy PUSHF, vypolnenie komandy OR, i, zatem, vosstanovlenie flagovogo registra komandoj POPF: ADC AL,[DI] ;Slozhenie s perenosom AAA ;Korrekciya dlya ASCII PUSHF ;Sohranenie flagov OR AL,30H ;Zapis' levoj trojki POPF ;Vosstanovlenie flagov MOV [BX],AL ;Sohranenie summy Vmesto komand PUSHF i POPF mozhno ispol'zovat' komandy LAHF (Load AH with Flags - zagruzka flagov v registr AH) i SAHF (Store AH in Flag register - zapis' flagov iz registra AH vo flagovyj registr). Komanda LAHF zagruzhaet v registr AH flagi SF, ZF, AF, PF i CF; a komanda SAHF zapisyvaet soderzhimoe registra AH v ukazannye flagi. V privedennom primere, odnako, registr AH uzhe ispol'zuetsya dlya arifmeticheskih perepolnenij. Drugoj sposob vstavki troek dlya polucheniya ASCII-kodov cifr - organizovat' obrabotku summy komandoj OR v cikle. Vychitanie v ASCII-formate Assembler dlya IBM PC. Glava 13 4 Komanda AAS (ASCII Adjust for Subtraction - korrekciya dlya vychitaniya ASCII-kodov) vypolnyaetsya analogichno komande AAA. Komanda AAS proveryaet pravuyu shest.cifru (chetyre bita) v registre AL. Esli eta cifra lezhit mezhdu A i F ili flag AF raven 1, to iz registra AL vychitaetsya 6, a iz registra AH vychitaetsya 1, flagi AF i CF ustanavlivayutsya v 1. Vo vseh sluchayah komanda AAS ustanavlivaet v 0 levuyu shest.cifru v registpe AL. V sleduyushchih dvuh primerah predpolagaetsya, chto pole ASC1 soderzhit shest.38, a pole ASC2 - shest.34: Primer 1: AX AF MOV AL,ASC1 ;0038 SUB AL,ASC2 ;0034 0 AAS ;0004 0 Primer 2: AX AF MOV AL,ASC2 ;0034 SUB AL,ASC1 ;00FC 1 AAS ;FF06 1 V primere 1 komande AAS ne trebuetsya vypolnyat' korrekciyu. V primere 2, tak kak pravaya cifra v registre AL ravna shest.C, komanda AAS vychitaet 6 iz registra AL i 1 iz registra AH i ustanavlivaet v 1 flagi AF i CF. Rezul'tat (kotoryj dolzhen byt' raven -4) imeet shest. predstavlenie FF06, t.e. desyatich noe dopolnenie chisla -4. Umnozhenie v ASCII-formate Komanda AAM (ASCII Adjust for Multiplication - korrekciya dlya umnozheniya ASCII kodov) vypolnyaet korrektirovku rezul'tata umnozheniya ASCII kodov v registre AX. Odnako, shest. cifry dolzhny byt' ochishcheny ot troek i poluchennye dannye uzhe ne budut yavlyat'sya dejstvitel'nymi ASCII-kodami. (V rukovodstvah firmy IBM dlya takih dannyh ispol'zuetsya termin paspakovannyj desyatichnyj format). Naprimer, chislo v ASCII-formate 31323334 imeet raspakovannoe desyatichnoe predstavlenie 01020304. Krome etogo, nado pomnit', chto korrekciya osushchestvlyaetsya tol'ko dlya odnogo bajta za odno vypolnenie, poetomu mozhno umnozhat' tol'ko odno-bajtovye polya; dlya bolee dlinnyh polej neobhodima organizaciya cikla. Komanda AAM delit soderzhimoe registra AL na 10 (shest. 0A) i zapisyvaet chastnoe v registr AH, a ostatok v AL. Predpolozhim, chto v registre AL soderzhitsya shest. 35, a v registre CL - shest.39. Sleduyushchie komandy umnozhayut soderzhimoe registra AL na soderzhimoe CL i preobrazuyut rezul'tat v ASCII-format: AX: AND CL,0FH ;Preobrazovat' CL v 09 AND AL,0FH ;Preobrazovat' AL v 05 0005 MUL CL ;Umnozhit' AL na CL 002D Assembler dlya IBM PC. Glava 13 5 AAM ;Preobrazovat' v raspak.des. 0405 OR AX,3030H ;Preobrazovat' v ASCII-f-t 3435 Komanda MUL generiruet 45 (shest.002D) v registre AX, posle chego komanda AAM delit eto znachenie na 10, zapisyvaya chastnoe 04 v registr AH i ostatok 05 v registr AL. Komanda OR preob pazuet zatem raspakovannoe desyatichnoe chislo v ASCII-for