Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 34

Unknown Author

В некоторых ЭВМ в такой ситуации фиксируется ошибка и на этом прекращается выполнение программы. Однако в ПК реакция иная: ошибка не фиксируется, левая единица (единица переноса) отбрасывается и в качестве ответа выдается искаженная сумма (в нашем примере ответом будет байт 00000ЮОЬ, т. е. число 4). Но зато в флаг переноса CF записывают 1. Это сигнал о том, что получилась неправильная сумма (если переноса не было, то в CF записывают 0). Затем можно проанализировать этот флаг (подходящие средства для этого есть) и "поймать" такую ошибку.

Такое суммирование с отбрасыванием единицы переноса в математике называется суммированием по модулю 2к (к - размер ячейки), при этом в флаге CF фиксируется, был ли перенос:

сумма(х,у)=(х+у) mod 2 =

х+у, если х+у< 2 , CF=0 x+y-2k, если x+y>=2k, CF=1

При вычитании беззнаковых целых чисел также возникает проблема: что делать, если при вычитании х-у число х меньше числа у? Ведь в этом случае получится отрицательная разность, а это уже вне области беззнаковых чисел.

В ПК поступают следующим образом: при х>=у выполняется обычное вычитание, но если х<у, тогда числу х дается "заем" единицы (к числу х прибавляется величина 2к) и только после этого производится вычитание. Полученное таким образом число и объявляется разностью. Например, при к=8 вычитание 1-2 происходит таким образом:

1-2 ==> (28+1)-2 = (256+1)-2 = 257-2 = 255

(в двоичной системе замена 1 на 256+1 - это замена 00000001 на 100000001, т. е. приписывание 1 слева) и именно число 255 объявляется результатом вычитания 1-2. При этом ошибка не фиксируется, зато в флаг переноса CF заносится 1, что сигнализирует о заеме единицы, о неправильном результате (при х>=у в CF заносится 0).

Выполняемое так вычитание в математике называют вычитанием по модулю 2к, при этом фиксируется, был ли заем:

Итак, в ПК сложение и вычитание беззнаковых целых чисел - это На самом деле сложение и вычитание по модулю 2к, где ,к - размер ячеек. Причем появление после операции значения 1 в флаге переноса CF свидетельствует о том, что выданный ответ неправильный.

Теперь рассмотрим сложение и вычитание знаковых чисел. Оказывается, если целые со знаком представлены в дополнительном коде, то складывать и вычитать их можно по алгоритмам для беззнаковых чисел. Делается это так: дополнительные коды знаковых операндов рассматривают как числа без знака и в таком виде их складывают или вычитают, а полученный результат затем рассматривают как дополнительный код знакового ответа.

Пример (при ячейке в 8 битов). Пусть надо сложить +3 и -1. Их дополнительные коды - это 3 и (256-1)=255. Складываем их как числа без знака: 3+255 (mod 256) = 258 (mod 256) = 2. Теперь величина 2 рассматривается как дополнительный код ответа, поэтому получается ответ +2.

Другой пример. Пусть надо сложить -3 и +1. Дополнительные коды этих знаковых чисел: (256-3)=253 и 1. Складываем их как беззнаковые числа: 253+1 (mod 256) = 254. Теперь, рассматривая эту величину как дополнительный код ответа, получаем результат -2 (254=256-2).