Команды деления (DIV/IDIV)

Опубликовано декабря 21, 2017 в Архитектура процессора Intel

В командах деления (DIV / IDIV) первый операнд (делимое) представляется в удвоенном формате по сравнению со вторым операндом (делителем). Делимое является аккумуляторным операндом.

Результат целочисленного деления представляется в виде частного, которое замещает младшую половину делимого, и остатка, который замещает старшую половину делимого. Представление операнда-приемника (делимого) и результата операции в регистрах в зависимости от формата операнда-источника (делителя) приведено в таблице ниже:

Команды деления (DIV/IDIV)

DIV (unsigned integer Divide) — беззнаковое деление целых чисел.

IDIV (signed integer Divide) — знаковое деление целых чисел.

Обе команды производят деление неявно заданного операнда-приемника на указанный в команде операнд-источник. Если размер делителя 8 бит, в качестве делимого используется содержимое регистра АХ. При размере делителя 16 бит делимое находится в паре регистров DX.AX. Частное в первом случае помещается в AL, остаток — в АН, во втором случае частное помещается в АХ, а остаток — в DX.

В соответствии с принципами целочисленного деления, результат деления операнда А (делимое) на операнд В (делитель) представляется в виде частного С и остатка R. При этом должно выполняться следующее равенство: С * В + R = А. В операции знакового деления (IDIV) знак частного формируется по общим алгебраическим правилам. Знак остатка совпадает со знаком делимого. Исключением из этого правила являются нулевое частное и / или нулевой остаток, которые независимо от знаков операндов представляются всеми нулями в соответствующем формате («положительный» ноль).

Примеры:

  • DIV BL — беззнаковое деление операнда из АХ на операнд из BL;
  • IDIV СХ — знаковое деление операнда из пары регистров DX (старшие разряды) и АХ (младшие разряды) на операнд из СХ.

Отличие команд DIV и IDIV состоит в интерпретации операндов и результатов как целых беззнаковых и знаковых чисел соответственно. Так, например, для байтного делителя, равного F616, и двухбайтного делимого, равного 040016, результат беззнакового деления равен 280416 (А=1024, В=246, C=4, R=40; 4 * 246 + 40 = 1024). В свою очередь результат знакового деления будет равен 049A16 (А= +1024, В= -10, С= -102, R= +4; (-102) * (-10) +4 = +1024).

Если в ассемблерной программе для представления делимого используется тот же формат (байт или слово), что и для представления делителя, для корректного применения команд DIV / IDIV необходимо предварительно расширить делимое до удвоенного формата (слова или двойного слова) по сравнению с делителем.

Для беззнаковой интерпретации операндов перед командой DIV необходимо осуществить обнуление (сброс) старшей половины делимого (регистра АН — для байтного делителя, DX — для двухбайтного). Для знаковой интерпретации операндов перед командой IDIV необходимо выполнить знаковое расширение делимого. Для этой цели удобно использовать команды расширения форматов: CBW и CWD.

При некоторых соотношениях делимого и делителя частное может не помещаться в отводимый формат. Подобная ситуация обнаруживается на начальном этапе выполнения операции и приводит к выходу на обработку стандартного прерывания типа 0 — ошибка деления. Примером такой ситуации для байтного делителя и делимого, равного 1000, является значение делителя, меньшее 4, для беззнакового деления или значение делителя из диапазона [-7 ; 7 ] для знакового деления.

После команды деления все арифметические флаги принимают неопределенные значения.

Перейдя на сайт компании «Уютный свет», Вы найдете светодиодные светильники с пультом управления, а так же люстры Estares, Astrella, Citilux, Cтарлайт