logo

Воскресенье 11 Декабрь 2016 (GMT+0300)

Система команд x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

IDIV

Деление со знаком

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

?

     

?

?

?

?

?

 

Код

Команда

Описание

Проц.

Пример

F6 /7

IDIV AL,r/m8

Деление знаковых AX на r/m8, частное помещается в AL, остаток от деления - в AH

8086

idiv dl

F7 /7

IDIV AX,r/m16

Деление знаковых DX:AX на r/m16, частное помещается в AX, остаток от деления - в DX

8086

idiv cx

F7 /7

IDIV EAX,r/m32

Деление знаковых EDX:EAX на r/m32, частное помещается в EAX, остаток от деления - в EDX

Intel386

idiv esi

Операция:

IF SRC = 0

   THEN #DE; (* Деление на нуль *)

FI;

IF OpernadSize = 8 (* Операция "слово/байт" *)

   THEN

      temp = AX / SRC; (* Знаковое деление *)

      IF (temp > 7Fh) OR (temp < 80h) (* Положительный результат больше 7Fh или отрицательный результат меньше чем 80h *)

         THEN #DE; (* Ошибка деления *)

         ELSE

            AL = temp;

            AH = AX SignedModulus SRC;

      FI;

   ELSE

      IF OpernadSize = 16 (* Операция "двойное слово/слово" *)

         THEN

            temp = DX:AX / SRC; (* Знаковое деление *)

            IF (temp > 7FFFh) OR (temp < 8000h) (* Положительный результат больше 7FFFh или отрицательный результат меньше чем 8000h *)

               THEN #DE; (* Ошибка деления*)

               ELSE

                  AX = temp;

                  DX = DX:AX SignedModulus SRC;

            FI;

         ELSE (* Операция "учетверенное слово/двойное слово" *)

            temp = EDX:EAX / SRC; (* Знаковое деление *)

            IF (temp > 7FFFFFFFh) OR (temp < 80000000h) (* Положительный результат больше 7FFFFFFFh или отрицательный результат меньше чем 80000000h *)

               THEN #DE; (* Ошибка деления *) ;

               ELSE

                  EAX = temp;

                  EDX = EDXE:AX SignedModulus SRC;

            FI;

      FI;

FI;

Описание:

Команда IDIV выполняет деление со знаком. Делимое, частное и остаток неявно расположены в фиксированных регистрах. Только делитель представлен как явный r/m-операнд. Тип делителя определяет, какие из регистров будут использованы.

 

Таблица 6.48. Операнды, используемые командой IDIV

Размер

Делитель

Частное

Остаток

Делимое

byte

r/m8

AL

AH

AX

word

r/m16

AX

DX

DX:AX

dword

r/m32

EAX

EDX

EDX:EAX

 

Если результирующее частное слишком велико, чтобы помещаться по назначению или если делитель равен нулю, то генерируется особая ситуация #DE. Целочисленное частное округляется в сторону нуля. Остаток имеет тот же знак, что и делимое, и абсолютная величина остатка всегда меньше, чем абсолютная величина делителя.

Особые ситуации защищенного режима:

#DE, если делимое равно нулю или частное слишком велико для регистра-назначения.
#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки), страничная ошибка.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.

Особые ситуации режима реальной адресации:

#DE, если делимое равно нулю или частное слишком велико для регистра-назначения.
#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.

Особые ситуации режима V86:

Такие же, как и в режиме реальной адресации.
#PF(Код ошибки), страничная ошибка.
#AC(0) при невыровненной ссылке в память.


Входит в группу команд: Базовая система команд CPU



Все права защищены © 1997-2011 Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Яндекс.Метрика               Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники