0x00876002 / 0x10 = 0x87600
, поэтому частное DX:AX / BX
не вписывается в AX, поэтому вы получаете исключение #DE.Справочное руководство по инструкциям Intel (x86 SDM vol. 2) содержит подробные описания каждой инструкции, и запись для div
объясняет это.Здесь есть HTML-фрагмент записи div
.См. вики-тег x86 для ссылок на документы Intel и другие материалы.
Деление на 10h - это сдвиг вправо на 1 шестнадцатеричное число, но верхняя половина ввода, DX,имеет 2 значащих шестнадцатеричных числа.
x86 Сборка: деление Исключение с плавающей запятой, деление на 11 в основном дублирует это, и в ответе @ rcgldr есть код для деления с повышенной точностью (например, 32-бит / 16 бит, производящий 32-битный коэффициент и 16-битный остаток) с использованием div
, который работает для произвольного 16-битного делителя.
В вашем конкретном случае вы делитесь настепень 2. Это очень неэффективно с div
.
Для этих делений степени 2 следует использовать
; input in DX:AX
shrd ax, dx, 4 ; right shift AX, shifting in bits from DX
shr dx, 4 ; separately right shift DX
; DX:AX = 0008:7600 = 0x87600 = 32-bit quotient
Если вы хотите остаток, это 4 младших бита оригинального AX, которые вы должны получить с mov cl, al
/ and cl, 0Fh
.
SHRD изменяет только пункт назначения, а не источник, поэтому вам нужночто 2 shr
на DX.Это имеет смысл для больших сдвигов с расширенной точностью: вы хотите использовать цепочку команд SHRD для сдвига битов в верхнюю часть каждого элемента по очереди, и не хотите сдвигать нули.
Или если выне может использовать 386 инструкций, таких как shrd
, вы можете эмулировать SHRD с левым и правым смещением и OR.В оригинальном 8086 также нет сдвигов немедленного подсчета, поэтому вам понадобится подсчет в CL.
; 8086-compatible version of 32-bit division by 10h, i.e. right shift by 4.
; input in DX:AX
mov bx, dx
mov cl, 16-4
shl bx, cl ; bx = the bits shifted across the 16-bit boundary into low half
mov cl, 4
shr ax, cl
shr dx, cl ; discards the bits shifted out
or ax, bx ; replace the 4 zeros at the top of AX with the bits from DX
; quotient in DX:AX
Или если вы знаете, что результат не будет переполнен, как при делении на 100h
(сдвиг вправо на 8), вы можете использовать только один SHRD.