Читайте также: |
|
па s Ситуация здесь вполне аналогична сложению. Рассмотрим те'же'случаи. ™Ц
' • •.:.. v.,•
Пример 8.11. Результат вычитания не больше 9е 9 •, • •,;}>;• j
6 = 0000 0110 ••• •. ; -.• :.$
–-'••• • "••',-•. ^
3 = 0000 0011 - ! ' ' : •"'". j
3 = 0000 0011 ' ••'•••' •,
" •" '•• •'; - '•!
Как видим, Ззаема из старшей тетрады нет. Результат верный и корректировки не \
требует.;:- J
"i
Пример 8.12. Результат вычитания больше 9../....,,, ~ •,,•.*
6 = 0000 0110
– ••-."...••,• ' •?•> • Ш'\
7 -= 0000 0111 • *Ь. "Я j
=
-1 = 1111 1П111 1
Вычитание проводится по правилам двоичной арифметики. Поэтому результат не
является BCD-числом. Правильный результат в неупакованном BCD-формате
должен быть 9 (0000 1001 в двоичной системе счисления). При этом предполага
ется заем из старшего разряда, как при обычной команде вычитания, то есть в
случае с BCD-числами фактически должно быть выполнено вычитание 16 - 7.
Таким образом, видно, что, как и в случае сложения, результат вычитания нужно
корректировать. Для этого существует специальная команда
aas (ASCII Adjust for Substraction) — коррекция результата вычитания для представления в символьном виде.
Команда aas также не имеет операндов и работает с регистром al, анализируя его младшую тетраду следующим образом: если ее значение меньше 9, то флаг cf сбрасывается в 0, и управление передается следующей команде. Если значение тетрады в al больше 9, то команда aas выполняет следующие действия:
- О из содержимого младшей тетрады регистра аl] (заметьте — не из содержимого всего регистра) вычитает 6;
- О обнуляет старшую тетраду регистра al;
- О устанавливает флаг cf в 1, тем самым фиксируя воображаемый заем из старшего разряда.
Понятно, что команда aas применяется вместе с основными командами вычитания sub и sbb. При этом команду sub есть смысл использовать только один раз при вычитании самых младших цифр операндов, далее должна применяться команда sbb
hb которая будет учитывать возможный заем из старшего разряда.
В листинге 8.9
' обходимся одной командой sbb, которая в цикле производит поразрядное
вычитание двух BCD-чисел. - -..........
Листинг 8.9. Вычитание неупакованных BCD-чисел
<\>;prg_8_9.asm ", •..:.- •'..?it
<ф, masm
.ф, model small
ф. stack 256 -Jк •-,*..^;С".
^.data;сегмент данных t..,,,.
<6> ьb db 1,7;неупакованное число 71 ',. ''
<-}> с db 4,5;неупакованное число 54 ' ••"-."•'"•
<8> subs db 2 dup (0) - " ' ;"fi-
<9>. code : '•' ' " ' ""' ;:
<10> main:;точка входа в программу Vl •-..-<• •:,'.„
<ц> rmnov ax,@.^data связываем регистр dx с сегнентйн-•'"• i! •''
<12> mov ds,.ax;данных через регистр ах
<13> хогr ах,ах..;очищаем ах.., •.
<14> len equ 2;2.' -.разрядность чисел ' ',:•;,;.,'.'
<15> хогr bx.,bx,.., |,,,,.., (
<16> mov ecx,len;загрузка в сх счетчика цикла../.'.".,
<17> ml: '' ; '; '"' : '•
<18> mov al,b[bx]. •, '•' "V
<19> sbb al.,c[bx].,... ii.jK. ',
<20> aas ' ' • ••.'"• •'' " •;41 '-'
<21> mov subs[bx],al - "-'• '• • •;..••• • s'"'1 v т; s...
<22> •.. Iinc bx..., (|,. ;,:.... '.':-
<23> ' loop ml....-- - •. •.
<:24> jc m2; анализ флага эзаенма
<25> jmp exit = - - '." • ^'-iv:.;:•(-. r~. v •
m^26> ni2:.... ".. • •-
•=27> exit:
<28> mov ax,4c00OOh;стандартный выход
^29> innt 21h.- -.I..',.W- '.
":30> end main;конец программы,; • -,,.,v •
Данная программа не требует особых пояснений, когда уменьшаемое больше вычитаемого. Поэтому обратите внимание на строку 24. С ее помощью Мы предусматриваем случай, когда после вычитания старших цифр чисел был зафиксирован факт заема. Это говорит о том, что вычитаемое было больше уменьшаемого, в результате чего разность будет неправильной. Эту ситуацию нужно как-то обработать. С этой целью в строке 24 командой jc анализируется флаг cf. По результату этого анализа мы уходим на ветку программы, обозначенную меткой т2, где и будут выполняться некоторые действия. Набор этих действий сильно зависит от конкретного алгоритма обработки, поэтому поясним только суть действий, которые может Выполнять соответствующий фрагмент программы. Для этого посмотрим в отлад-ике, как наша программа выполнит вычитание 50 - 74 (правильный ответ -24). о, что вы увидите в окне Dump отладчика, в поле, соответствующем адресу subs, УДет далеко от истинного ответа. Что делает в этом случае человек? Он просто ыполняет вычитание 74 - 50 = 24 и рассматривает результат как имеющий знакминус. Так как у микропроцессора нет средств обработки подобной ситуации, то фрагмент программы, обозначенный меткой т2, может поменять уменьшаемое ц вычитаемое местами, выполнить вычитание и где-то отметить тот факт, что раз-ность, на самом деле, нужно рассматривать как отрицательное число. Но ключевой момент здесь все-таки тот, что микропроцессор с помощью флага cf сигнализирует нам об этой особой ситуации.
Дата добавления: 2015-08-27; просмотров: 53 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Над двоично-десятичными числами | | | Умножение I |