Команда деления
Команда деления
Одна из арифметических операций микропроцессора 8088 - деление.
Как и в случае умножения, существует две формы деления - одна для
двоичных чисел без знака DIV, а вторая для чисел в дополнительном
коде IDIV. Любая форма деления может работать с байтами и словами.
Команда деления DIV выполняет деление без знака и дает как
частное, так и остаток. Как и в случае умножения, операнды должны
находиться на специфических местах. Также подобно умножению, для
деления одно из этих чисел в два раза длиннее обычного операнда:
делимое является операндом двойной длины. Байтовые команды делят
16=битовое делимое на 8=битовый делитель. В результате деления
получается два числа. Деление помещает частное в регистр AL, а
остаток в регистр AH. Такое расположение операндов делает команду
деления дополнительной к команде умножения; это означает, что
умножение регистра AL на байтовый операнд, а затем деление регистра
AX на тот же операнд возвращает регистр AL к его первоначальному
состоянию. Регистр AH будет содержать 0, поскольку остатка нет.
Фиг. 4.14 схематически иллюстрирует команду деления.
ЪДДДДДДДДї
і AX і
і BX і
і CX і
і DX і Остаток
ЪДДДДДДДДВДДДДДДДДї АДДДДДДДДЩ ЪДДДДДДДДВДДДДДДДДї
і DX і AX і * ЪДДДДДДДДї ДДДДД> і DX і AX і
АДДДДДДДДБДДДДДДДДЩ і SI і АДДДДДДДДБДДДДДДДДЩ
і DI і
і BP і
і SP і
АДДДДДДДДЩ
ЪДДДДДДДДї
і Память і
і(слова) і
АДДДДДДДДЩ
(a) Деление слов
ЪДДДДДДДДДї
і AH і
і AL і
і BH і
і BL і
і CH і
і CL і
і DH і
і DL і Остаток
ЪДДДДДДДДї АДДДДДДДДДЩ ЪДДДДДДДДВДДДДДДДДї
і AL і * ЪДДДДДДДДДї ДДДДД> і AH і AL і
АДДДДДДДДЩ і Память і АДДДДДДДДБДДДДДДДДЩ
і(байты) і
АДДДДДДДДДЩ
(b) Деление байтов
Фиг.4.14 Операции деления
Команда, работающая со словами, делит 32=битовое делимое на
16=битовый делитель. Делимое находится в паре регистров DX:AX,
причем регистр DX содержит старшую значащую часть, а регистр AX -
младшую. Деление слов помещает частное в регистр AX, а остаток в
регистр DX. Здесь опять=таки умножение и деление взаимно
дополнительны: умножение регистра AX на слово, а затем деление его
на то же слово возвращает регистр AX к его первоначальному
состоянию. Теперь регистр DX становится нулевым, так как остатка
нет.
Ни один из флагов состояния не определен после команды деления.
Однако во время деления может возникнуть ошибка значимости. Если
частное больше, чем может быть помещено в регистр результата,
микропроцессор не может дать правильный результат. В случае деления
байтов частное должно быть меньше 256, и меньше 65535 в случае
операции со словами. Микропроцессор не устанавливает никаких флагов
для сигнализации при этой ошибке, вместо этого он выполняет
программное прерывание уровня 0. Как и в случае других программных
прерываний, это прерывание по делению на 0 сохраняет флаги, регистр
кодового сегмента и указатель команды в стеке. Затем микропроцессор
передает управление в ячейку, на которую ссылается указатель по
адресу 0. Подпрограмма деления на 0 должна предпринять
соответствующие действия по обработке этой ошибки. (Прерывание 0
называется делением на 0 даже тогда, когда это прерывание возбудило
деление на число, отличное от нуля. В документации фирмы Intel это
прерывание называется делением на нуль, хотя более точно его надо
было бы назвать прерыванием по переполнению после деления).
Деление целых чисел со знаком IDIV отличается от команды DIV
только тем, что оно учитывает знаки обоих операндов. Если результат
положителен, все происходит так же, как было описано для команды
DIV, за исключением того, что максимальное значение частного
соответственно равно 127 и 32767 для байтов и слов. Если результат
отрицателен, частное усекается, а остаток имеет тот же знак, что и
делимое. Минимальные значения частных для отрицательных результатов
-128 и -32768 для байтов и слов.
Делимое (AX) Делитель(MOD-R/M) Частное (AL) Остаток(AH)
------------------------------------------------------------------
7 2 3 1
7 -2 -3 1
-7 2 -3 -1
-7 -2 3 -1
------------------------------------------------------------------
Фиг. 4.15 Примеры деления со знаком
На Фиг. 4.15 показаны четыре примера деления, а также
полученные в них результаты. Все примеры, приведенные здесь,
байтовые, т.е. делимое находится в регистре AX, а делитель
указывается байтом mod=r/m. Деление помещает частное в регистр AL,
а остаток в регистр AH. Заметим, что знак остатка всегда тот же,
что и у делимого. Значение частного всегда усекается в направлении
нуля.