В.Н. Пильщиков - Программирование на языке ассемблера IBM PC (1110551), страница 16
Текст из файла (страница 16)
цифр ;коррекцик словении и вались церевоса в ХВ ;лреобразоваиие цифри в символ яб2 Прогроммирссанио нв изино всссмбяора (ВЫ РС )запись кода цифра в 2 ИОЧ 2[31+1],АЬ Ввс а1 ЬООР Яви ОВ АИ,ЗСЬ МОР 2,АН ;запись в 2 переноса из старина цифр Сложслив упакованных двоичио десятичных чисвл И зцесь приходится складывать числа по частяы, но уже не по одной цифре, а по паре цифр, упакованных в олноы байте: по команде А01) или А)зС складывается пара цифр из первого слагаемого с парой цифр из второго слагаемого, а затем с помощью специальной команлм корректируется полученная суьцаа Это следующая команда: Двсатизвал коррекция после словения (Оесйав1 ав)пвз аквек аовхэхоа)з ОАА Эта команда имеет смысл, только если она поставлена после команды сложения, которая сложила упакованную пару правильных лесятичнмх цифр и записала сумму в регистр АЬ.
Команда ПАА преобразует значение этого реп(стра в две правильные десятичные цифры и фиксирует в флаге СР перенос из этих цифр. Например: МОУ АЬ,З9Ь АОО А1,69Ь ВАА ;Ах-ВС2Ь ;СР 1, Ахмзяь ;слокевив упакозавиик 2-10-инк чисеьц 2з Х+1 моя сх,н ;количество байтов (пар цифр) э слатаеннк Более точно команда )УАА действует так: если Агп1 или если величина в 4 правых битах АЬ больше 9, тогда А1.
увеличивается на 6 (это коррекция правой цифры пары); если СРи1 или если величина в 4 левых битах АЬ больше 9, то к А1. прибавляется число 60Ь ( т. е. 6 к левой половине) и СР получает значение 1, а иначе Сг получает значение О (это коррекция левой цифры и учет переноса из данной пары цифр). Команда меняет и другие флап(, но их значения обычно не предстапэлют интерес. Например, в приведенных выше командах сумма правых цифр (9 и 9) равна 18 = 12Ь, поэтому в правую половину реп(стра АЬ попадает цифра 2, а цифра 1 как перенос добавляется к сумые левых цифр (5+6+1и12нОСЬ), при этом флаг Аг получает значение 1.
По этому значению АГ команда ПАА и узнает, что правая цифра в АЬ неправильная, и увеличивает ее на б; в этот момент А1-ОС8Ь. Лалее анализируется левая половина регистра АЬ: поскольку в команде А)я1) не было переноса, то Срнй, но в левых битах АЬ находится величина ОСЬ, которая больше,9, поэтому левую цифру также надо скорректировать, Лля чего к ней прибавляется 6 (с записью переноса в СЕ): (12+6) шод 16 и 2 и СРн1. Для примера привелеы алгоритм сложения описанных выше чисел Х, 1' и Е, когда их значения трактуются как 2*Ккзначные упакованные числа: Дополнительные еозмокносгн 263 ;запись в г перевоса вз старвпх цвфр 14.1З.
Вычитание двончне-десятичных чисел Здесь все аналогично сложению. Вычитание двоично-десятичных чисел также осуществляется по цифрам, от младших цифр к старшим. Х(ля коррекции "ке разности цифр в ПК используются команды ААБ и ()АЗ. АВС11-коррекцвк после зычпталпл (АВС11 алзцес етаек есвзкассзов): ААВ Эту команлу следует применять после кома(шы вычитания (Я)В и т. п.), которая записывает разность двух десятичных пнфр в регистр А(, Команда ААЗ действует так: если АРы) или если величина 4 правых битов Аз. больше 9, тогда из А).
Вычитжтся б, из АН вычитается 1 и флаг СР получает значение 1 (фиксируется заем из старших цифр), иначе же флаг СЕ получает значение 0; в любом случае обнуляются 4 левых бита регистра Аз.. Например: )АЬ ОЗЬ, АР 0 )АЬ ОЗИ, СР 0 вуква )АХ ОРВЬ, АР 1 )ОРВИ-О ОР7Ь > АЬ 07И, СР 1 Команда ААЗ применяется при вычитании как неупакованных двоично-десятичных чисел, так и АЗСП-чисел. Алгоритмы вычитания аналогичны алгоритмюч ело:кения, поэтому мы их не будем приводить. При вычитании упакованных двоично-десятичных чисел для коррекции цифр разности используется команда Десетвчвак коррекцвя после зычптаюю (десзвь1 ал)еес атсак зоЬЕкасз1оз): ОАВ Зту команду следует применять после кома(шы вычитания (Я)В и т. и.), которая из одного байта, тле упакованы две правильные десятичные цифры, вычитает другой полобный байт и записывает разность в регистр А(, Команда ПАЗ действует так: если АРы) нлн если величина 4 правмх битов А1.
больше 9, тогда -ДИА)ЮГ-МИЕИ- иОО 81,В-Х сьс вон1 нот Аь,х(вх) АОС Аь,т[ВХ) ВАА мот 2(ВХ+1),аь ВВС 21 ЬООР ВОМ нот г,о Апс г,о )коррекцвя нот Аь,05ь ВОВ А1,02Ь ААЯ ;коррекцвл мот Аь,02ь ВОВ АЬ,05Ы )ивдекс байта слагаемых (справа палево] )СР - перенос вз младппк цифр (звачале его вет) (слохевве двух пар цвфр с учетом леревоса )коррекция цвфхз сузюы в заплел в ср перевоса ;заплел пары цяфрв сузввг з 2 )(комавды ВгС в 1ООР ве мевлвт флаг СР) ябе Программирование ие языке ассемблере (ВМ РС МОЧ АН,О МОЧ )й,25Ь ВОВ АЬ,52Ь ОЬВ ;Ах ОВЗЬ, ЬР О, СР 1 )ЬЬ: ОЦЗЬ-ООЬ=73Ь, СР 1 14.1.4.
умножение и деление двоична-десятичных чисел Надо сразу отыетить, что реализовать в ПК умножение и деление двоично-десятичных чисел чрезвычайно сложно, т. к. система команд ПК предоставляет срелства только для умножения и деления одной цифры на другую. Причем эти цифры обязательно должны быть неупакованными.
По этой причине в ПК имеется только по олной команде коррекции лля умножения и для деления. Лля коррекции при умножении используется команда ЬВС11-коррекцяа лослв умаоквииа (АВСтт вб)ляе еяевг мо1С1р1у): ЬЬМ Эту команлу следует применять после команды умножения (МШ ) двух неупакованных десятичных цифр, которая записывает их произведение в регистр А1..
Коыанда ААМ делит значение А1 на 10 и записывает неполное частное в регистр АН, а остаток - в регистр А1„получая тем самыы в двух этих регистрах правильные десятичные цифры произведения. Например: Мот ЬЬ,Я МОЧ ВВ,9 моь вн ЬЬМ )АЬ 56 36Ь (АН 0) )ЬН 5, Ах=Я В качестве приыера использования команды ААМ рассмотрим умножение )з(-значного неупакованного двоично-десятичного числа Х на однозначное число У с записью произведения в А.
Будем брать справа налево цифры из Х и по очереди умножать их на У, записывая в Е правую цифру получившегося произведения и прибавляя левую цифру к произведению старших цифр: )н>0 н ВСО Х ОВ Н ВОР(2) т РВ 2 Я ВВ 2, Н ООР(2) ;от 0 до 9 )дврвяй байт - дла лереаоса )умвокваив ивулаковвиаого 2-10-го числа Х иа десатичауе цяфру Х иоч сх,н ;количество цифр и Х МОЧ Яз,в-з )иидвкс цяфри яв Х (слрава ивлево) иоч вн,о ;лервиос ае млвдаик цифр мы: моч ьь,х(ях) (для коррекции правой цифры разности) из А1. вычитается б; если Сря1 или ес- ли Величина 4 левых битов А1. больше 9, тогда (для коррекции левой цифры и учета заема) из А1. вычитается бОЬ и флаг СР получает значение 1, а иначе СР получает значение О.
Наприыер: Дололнитвльнме вазможности Евв ;старвая цм]фа провзьедеиия Д»В» коррекции при делении лвоично-десятичных чисел в ПК используьчся команда ЬВС11-коррекция перед делением (ЬВСП аезпзч Ьеяоке 4»чзвьоь)» ЬАО Эта команда ставится после команды, которая в регистре АХ получает пару неупакованных цифр делимого (в АН - старшая цифра, в А1. - младшая). Команда АА]3 преобразует эту пару цифр в двоичное число, записывая его в репютр АХ: АХ:и]0*АН+А]..
После этого уже можно делить обычным образом (по коыанде ]й1»Г) это число на делитель из одной десятичной цифры. Например: МОЧ ВН,9 ИОЧ АХт0307Ь ЬЬВ ОХЧ ВЕ ; делвтеиь ;д З7 (ЬН=З, АГ 7) »ЬХ 25Ь (37 как дзоичвое число) ;ЬН 1 (37 мое 9), ЬЬ 4 (37 аьч 9) В качестве примера рассмотрим деление ]»)-значного неупакованного двоичнодесятичного числа Х на однозначное число »' с записью неполного часпюго от деления в (ь а остатка - в В.
Преллагается следующий алгоритм. Пусть надо разделить ХФ746 на »мЗ. Верех» 0 и первую цифру (7) числа Х и делим это двузначное число (07) на зт; неполное частное (2) записываел» в начало (), а х осппху (1) присоелиняем следующую цифру (4) числа х. полученное двузначное число (14) делим на 1', после чего неполное частное (4) записываем в (», а х остатку (2) присоелиняем последнюю цифру (6) из Х. Разделив двузначное число 26 на 1; неполное частное (8) записываем в Я, а остаток (2) - в переменную й.
»н>0 н епч ... Х ОВ Н ООР(2) ХОВ2 О ОВ М ОЧР(7) ДОВР »от 0 до 9 ;место для х е(ч х осто дия Х вое 1 »делевие веупькозьввого моч сх,и ИОЧ Ях,о МОЧ Ьи,о Очт моч Аь,х(ях] "ДИЛЛОПМИФИ ИЧЬ 1 АЬМ АОО ЬЬ,ВВ АЬА ИОЧ Х(В1+1],АЬ МОЧ ВвтЬН ОЕС В1 ЬООР Мгт МО\т я Вн ;умвовевие цифри из Х вь т ;ЬН левая цифра произьедеввя, ЬЬ правая ;учет переноса из мльдвик ци»]ф ;коррекцвя слокевмя (если задо, ЬЕ» ЬЕ+1) )лепясь прьвоя цвфрв з Е )запомнить перевос в старине цм]фв 2-10-то числа Х мь десятичвув цвфру т ;количество цмфр ь Х ;ввдекс цифри вз Х (слеье вецраьо) ;ЬН - остаток от делаю»я старивк цвфр ;ЬЬ - очередвал цяфра из Х ябб Прогрвммирояение не извне ассемблера )ВМ РС ;остаток от делеиил Х иа т 14.ь. Дополнительные команды ПК Здесь вкратце перечислены комюшы ПК, которые нс были рассмотрены в предыдуших главах. Это либо команды, которые достаточно репко используются на прзхтикс, либо команды, которые приысняются в ситуациях, нс рассматривасыых в данной книге (например, при взаимодействии центрального процессора с арифыстичсским сопроцессором).