<<
>>

Неупакованные BCD-числа

Сложение Рассмотрим два случая сложения. ■ Результат сложения не больше 9: 6 = 0000 0110 + 3=0000 ООП 9 = 0000 1001. Переноса из младшей тетрады в старшую нет. Результат правильный.
Результат сложения больше 9: 06 = 0000 0110 + 07=00000111 13 = 0000 1101. То есть мы получили уже не BCD-число. Результат неправильный. Правиль- ный результат в неупакованном BCD-формате в двоичном представлении должен быть таким: 0000 0001 0000 ООН (или 13 в десятичном). Проанализировав данную проблему при сложении BCD-чисел (и подобные проблемы при выполнении дру- гих арифметических действий), а также возможные пути ее решения, разработчи- ки системы команд процессора решили не вводить специальные команды для ра- боты с BCD-числами, а ввести несколько корректировочных команд. Назначение этих команд — корректировка результата работы обычных арифметических команд для случаев, когда операнды в них являются BCD-числами. В случае сложения во втором примере видно, что полученный результат нужно корректировать. Для кор- рекции операции сложения двух однозначных неупакованных BCD-чисел и пред- ставления результата сложения в символьном виде в системе команд процессора существует специальная команда ААА (ASCII Adjust for Addition). Команда ААА не имеет операндов. Онд работает неявно только с регистром AL и анализирует значение его младшей тетрады. Если это значение меньше 9, то флаг CF сбрасывается в 0 и осуществляется переход к следующей команде. Если это значение больше 9, то выполняются следующие действия. 1. К содержимому младшей тетрады AL (но не к содержимому всего регистра!) прибавляется 6, тем самым значение десятичного результата корректируется в правильную сторону. 2. Флаг CF устанавливается в 1, тем самым фиксируется перенос в старший раз- ряд для того, чтобы его можно было учесть в последующих действиях. Так, во втором примере сложения, предполагая, что значение суммы 0000 1101 находится в AL, после выполнения команды ААА в регистре будет 1101 + 0110 = = 0011, то есть двоичное значение 0000 0011 или десятичное значение 3, а флаг CF установится в 1, то есть перенос запоминается в процессоре.
Далее программисту нужно использовать команду сложения А DC, которая учтет перенос из предыдуще- го разряда. Приведем пример программы сложения двух неупакованных BCD-чи- сел (листинг 8.8). ввода обратен нормальному, то есть цифры младших разрядов расположены по меньшему адресу. Это вполне логично по нескольким причинам: во-первых, такой порядок удовлетворяет общему принципу представления данных для процессо- ров Intel, во-вторых, это очень удобно для поразрядной обработки неупакованных BCD-чисел, так как каждое из них занимает один байт. Хотя, повторюсь, програм- мист сам волен выбирать способ описания BCD-чисел в сегменте данных. Строки 14 и 15 содержат команды, которые складывают цифры в очередных разрядах BCD- чисел, при этом учитывается возможный перенос из младшего разряда. Команда ААА в строке 16 корректирует результат сложения, формируя в AL BCD-цифру и при необходимости устанавливая в 1 флаг CF. Строка 20 учитывает возможность пере- носа при сложении цифр из самых старших разрядов чисел. Результат сложения формируется в поле sum, описанном в строке 7. Вычитание Ситуация при вычитании вполне аналогична сложению. Рассмотрим те же слу- чаи. . Результат вычитания не больше 9: 6 = 0000 0110 3=00000011 3=00000011. Как видим, заема из старшей тетрады нет. Результат верный и корректировки не требует. Результат вычитания больше 9: 6 =00000110 7 =00000111 -1-11111111. . Вычитание проводится по правилам двоичной арифметики. Поэтому резуль- тат не является BCD-числом. Правильный результат в неупакованном BCD-фор- мате должен быть 9 (0000 1001 в двоичной системе счисления). При этом предпо- лагается заем из старшего разряда, как при обычной команде вычитания, то есть в случае с BCD-числами фактически должно быть выполнено вычитание 16 - 7. Таким образом, как и в случае сложения, результат вычитания нужно корректиро- вать. Для этого существует специальная команда AAS (ASCII Adjust for Substrac- tion), выполняющая коррекцию результата вычитания для представления в сим- вольном виде.
Команда AAS также не имеет операндов и работает с регистром AL, анализируя его младшую тетраду следующим образом: если ее значение меньше 9, то флаг CF сбрасывается в 0 и управление передается следующей команде. Если значение тет- рады в AL больше 9, то команда AAS выполняет следующие действия. 1. Из содержимого младшей тетрады регистра AL (заметьте, не из содержимого всего регистра) вычитается 6. 2. Старшая тетрада регистра AL обнуляется. 3. Флаг CF устанавливается в 1, тем самым фиксируется воображаемый заем из старшего разряда. Понятно, что команда AAS применяется вместе с основными командами вычи- тания S UB и SBB. При этом команду SUB есть смысл использовать только один раз при вычитании самых младших цифр операндов, далее должна применяться ко- манда SB В, которая будет учитывать возможный заем из старшего разряда. В лис- тинге 8.9 мы обходимся одной командой SB В, которая в цикле производит пораз- рядное вычитание двух BCD-чисел.
Листинг 8.9. Вычитание неупакованных BCD-чисел

Данная программа не требует особых пояснений в случае, когда уменьшаемое больше вычитаемого. Поэтому обратите внимание на строку 24. С ее помощью мы предусматриваем случай, когда после вычитания старших цифр чисел был зафик- сирован факт заема. Это говорит о том, что вычитаемое было больше уменьшаемо- го, в результате чего разность оказалась неправильной. Эту ситуацию нужно как- то обработать. С этой целью в строке 24 командой JC анализируется флаг CF. По результату этого анализа мы уходим на ветку программы, обозначенную меткой т2, где и выполняются нужные действия. Набор этих действий зависит от кон- кретного алгоритма обработки, поэтому поясним только их суть. Для этого посмот- рите в отладчике, как наша программа выполняет вычитание 50 - 74 (правильный ответ------ 24). То, что вы увидите в окне Dump отладчика (в поле, соответствующем адресу subs), окажется далеким от истины. Что делает в этом случае человек? Он просто мысленно меняет местами вычитаемое и уменьшаемое (74 - 50 = 24), а ре- зультат рассматривает со знаком «минус». Так и фрагмент программы, обозначен- ный меткой т2, может, поменяв уменьшаемое и вычитаемое местами и выполнив вычитание, где-то отметить тот факт, что разность, на самом деле, нужно рассмат- ривать как отрицательное число.

<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Неупакованные BCD-числа:

  1. Расчет числа сущности
  2. Расчет числа личности
  3. какиe виды тайны влекут исключения из числа свидетелей.
  4. Расчет золотого алхимического числа
  5. 1.8. Взаимосвязь анкетных вопросов и числа респондентов
  6. Сопоставление общего числа изданий и журналов
  7. Звук "И"- это вибрации числа 1 (Солнце).
  8. Звук "О"- это вибрации числа 7 (Сатурн).
  9. Звук "Е" - это вибрации числа 6 (Венера).
  10. Звук "A" - это вибрации числа 1 (Солнце).
  11. Звук "У" - это вибрации числа 3 (Марс).
  12. Звук "Э" - это вибрации числа 4 (Меркурий).
  13. Звук "Ю" - это вибрации числа 5 (Юпитер).
  14. Звук "СИ"- это усиленная вибрация числа 1 (Солнце).
  15. 3. Виды права собственности в зависимости от числа собственников. Индивидуальная (персональная) и общая собственность
  16. 3. Вычислим третье число.
  17. Запись нумерологического кода человека
  18. Разницу в ответах на открытый и закрытый вопрос