Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
DIV
Влияние команды на флаги и форматы команды:
? |
? |
? |
? |
? |
? |
F6 /6 |
DIV AL,r/m8 |
Беззнаковое деление AX на r/m8, частное помещается в AL, остаток от деления - в AH |
8086 |
div cl |
F7 /6 |
DIV AX,r/m16 |
Беззнаковое деление DX:AX на r/m16, частное помещается в AX, остаток от деления - в DX |
8086 |
div bx |
F7 /6 |
DIV EAX,r/m32 |
Беззнаковое деление EDX:EAX на r/m32, частное помещается в EAX, остаток от деления - в EDX |
Intel386 |
div edi |
Описание:
Команда DIV (Unsigned Divide) относится к группе команд целочисленной (или двоичной) арифметики (Binary Arithmetic Instructions) и производит целочисленное деление с остатком беззнаковых целочисленных операндов. Делимое, частное и остаток задаются неявно. Делимое является переменной в регистре (или регистровой паре) AX, DX:AX или EDX:EAX в зависимости от кода команды и атрибута размера операнда (что также определяет и разрядность делителя). Единственный явный операнд команды — операнд-источник (SRC), задающий делитель — может быть переменной в регистре или в памяти (r/m8, r/m16, r/m32). Целая часть частного помещается в регистр AL, AX или EAX в зависимости от заданного размера делителя (8, 16 или 32 бита). При этом остаток от целочисленного деления помещается в регистр AH, DX или EDX соответственно.
Действие команды DIV зависит от размера операнда-источника (SRC) следующим образом:
Размер |
Делитель |
Частное |
Остаток |
Делимое |
byte |
AL |
AH |
AX |
|
word |
AX |
DX |
DX:AX |
|
dword |
EAX |
EDX |
EDX:EAX |
Если частное, получаемое в результате деления, оказывается слишком велико, чтобы поместиться в целевом регистре-назначении (то есть имеет место переполнение), или если делитель равен нулю, то генерируется особая ситуация #DE.
Целочисленное частное округляется в сторону нуля. Абсолютная величина остатка всегда меньше, чем абсолютная величина делителя.
Команду DIV можно применять в вычислениях с числами в неупакованном двоично-десятичном формате (неупакованный BCD-формат). В этом случае необходимо использовать команду AAD непосредственно перед командой DIV, чтобы произвести так называемую ASCII-коррекцию перед делением и затем получить частное в таком же неупакованном BCD-формате, как и исходные операнды.
Дополнительной особенностью команды DIV является неопределенное значение большинства флагов в регистре EFLAGS в результате выполнения команды. То есть флаги не устанавливаются в соответствии с полученным частным или остатком.
Для деления целочисленных значений со знаком предназначены команды IDIV, FIDIV и FIDIVR.
Операция:
IF (SRC = 0)
THEN #DE; (* Деление на нуль *)
FI;
IF (OperandSize = 8) (* Слово делим на байт *)
THEN
temp = AX / SRC;
IF temp > 0xFFh
THEN #DE; (* Ошибка деления *)
ELSE
AL = temp;
AH = AX MOD SRC;
FI;
ELSE
IF (OperandSize = 16) (* Двойное слово делим на слово *)
THEN
temp = DX:AX / SRC;
IF ( temp > 0xFFFFh )
THEN #DE; (* Ошибка деления *)
ELSE
AX = temp;
DX = DX:AX MOD SRC;
FI;
ELSE (* Учетверенное слово делим на двойное слово *)
temp = EDX:EAX / SRC;
IF ( temp > 0xFFFFFFFFh )
THEN #DE; (* Ошибка деления *)
ELSE
EAX = temp;
EDX = EDX:EAX MOD SRC;
FI;
FI;
FI;
Особые ситуации защищенного режима:
#DE, если делимое равно нулю или частное слишком велико для размещения в регистре-назначении.
#GP(0), если при обращении к операнду в памяти в сегменте DS, ES, FS или GS используется нулевой селектор.
#GP(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в сегменте CS, DS, ES, FS или GS.
#SS(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в стековом сегменте SS.
Intel386 … :
#PF(Код ошибки) при страничной ошибке.
#UD при использовании префикса LOCK.
Intel486 … :
#AC(0) при невыровненной ссылке в память, если активирован контроль выравнивания (CR0.AM = 1, EFLAGS.AC = 1, CPL = 3).
Особые ситуации режима реальной адресации:
#DE, если делимое равно нулю или частное превышает разрядность регистра-назначения.
#GP, если любая часть операнда в памяти находится вне допустимого для реального режима пространства эффективных адресов в сегменте CS, DS, ES, FS или GS.
#SS, если любая часть операнда в памяти выходит за допустимую для реального режима верхнюю границу стекового сегмента SS.
Особые ситуации режима V86:
#DE, если делимое равно нулю или частное превышает разрядность регистра-назначения.
#GP(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в сегменте CS, DS, ES, FS или GS.
#SS(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в стековом сегменте SS.
Intel386 … :
#PF(Код ошибки) при страничной ошибке.
#UD при использовании префикса LOCK.
Intel486 … :
#AC(0) при невыровненной ссылке в память, если активирован контроль выравнивания (CR0.AM = 1, EFLAGS.AC = 1, CPL = 3).
Замечание:
Отдельные особенности существовали у процессоров 8086/8088 для генерации особой ситуации деления на нуль (#DE). В этих процессорах, в отличие от последующих моделей, точка возврата CS:IP, сохраняемая в стеке, не указывает на команду DIV, вызвавшую прерывание, — она указывает на следующую за ней команду.
К командам целочисленной арифметики относятся команды ADD, ADC, SUB, SBB, IMUL, MUL, IDIV, DIV, INC, DEC, NEG, CMP.
В свою очередь, сами названные команды целочисленной арифметики делятся на следующие подгруппы:
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru