На процессоре 8086 вы можете выбирать между делением в байтах и делением в словах.
Деление размером байт будет разделите слово в AX
на любой операнд размера байт . Ваш пример кода использует этот вид деления. Частное переходит в регистр AL
, а остальное - в регистр AH
.
В вашем примере деление 9999h на 1 дает коэффициент 9999h. Этот результат слишком велик, чтобы поместиться в AL
, и поэтому вы получили исключение деления #DE.
Деление размера word делит двойное слово в DX:AX
на любое значение * 1021 Определяемый вами размер слова * word . Частное переходит в регистр AX
, а остальное - в регистр DX
.
Ваш пример:
XOR DX, DX
MOV AX, 9999H
MOV BX, 1
DIV BX
На этот раз проблем нет, и регистр AX
будет содержать частное 9999h, а регистр DX
будет содержать остаток 0.
РЕДАКТИРОВАТЬ после комментария
Извините, что неясно ... На самом деле я пытаюсь разделить 8-битный регистр на 16-битный регистр в для получения 16-битного отношения ... мне не нужен остаток
Примером будет BL
/ CX
, выдающее AX
Если это что вы хотите сделать, то имейте в виду, что если 16-разрядный делитель (CX
) содержит значение, превышающее значение в 8-разрядном дивиденде (BL
), частное от этого целочисленного деления (AX
) ) всегда будет нулевым. Не очень эффектно!
Хитрость заключается в том, чтобы увеличить дивиденд, чтобы мы могли использовать деление по размеру слова, потому что именно оно использует желаемый 16-разрядный делитель.
mov al, bl ; \
mov ah, 0 ; / sets AX=BL
cwd ; sets DX=0
div cx ; divides DX:AX by CX producing quotient AX
В качестве альтернативы и при условии, что CH
- ноль:
mov al, bl ; \
mov ah, 0 ; / sets AX=BL
div cl ; divides AX by CL producing quotient AL
mov ah, 0 ; desired 16-bit quotient AX
РЕДАКТИРОВАТЬ 2 после комментария
AX - 16-битное число ... BL - 8-битное число ... Выполните некоторые инструкции DIV BL .. AX теперь является 16-битным частным
Если вы абсолютно хотите выполнить DIV BL
, он всегда будет вычислять AX / BL
, получая 8-битное частное в AL
и 8-битный остаток в AH
. Вы ничего не можете сделать, чтобы изменить это.
Теперь, как вы сказали ранее, если вам не нужен этот остаток и требуется частное во всем регистре AX
, все, что вам нужно добавить, это обнулить AH
зарегистрироваться.
div bl
mov ah, 0 ; Quotient is now AX