Что происходит, когда мы делим 16-битное число на 8-битное 1? - PullRequest
3 голосов
/ 07 февраля 2020

Насколько я слышал, если мы используем инструкцию div с 8-битным числом, то частным является 8-битное число, хранящееся в AL, а оставшаяся часть снова является 8-битным числом, хранящимся в AH

Но что, если мы разделим 16-битное число на 1?

В результате мой указатель инструкций смещается при каждом выполнении кода ниже.

MOV AX, 9999H
MOV BL, 1
DIV BL

Есть ли способ заставить 8086 использовать топор для частного и сделать для остатка при делении на AX?

1 Ответ

5 голосов
/ 10 февраля 2020

На процессоре 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
...