Я пытаюсь отменить операцию MUL, которая имеет переполнение регистра DX.
mov ax, 1234h
mov dx, 109h
mul dx
; ax = C024
; dx = 0007
Как разделить DX и AX на 109h?
Я пытаюсь получить исходный AX через полученные AX и DX (из операции MUL).
Мой вопрос: как разделить оба регистра и сохранить одинаковое значение? Разделить каждое по отдельности, а затем объединить их — это не одно и то же, поскольку dx — это 7h, но перед делением к нему нужно добавить суффикс ax.
Я бы посоветовал внимательнее ознакомиться со спецификацией DIV r/m16 инструкции. В частности, какие регистры он использует в качестве входных данных?





MUL 16-битных значений дает 32-битный результат, поэтому ЦП разбивает 32-битный результат на два 16-битных регистра, например dx2 = (ax1 * dx1) >> 16 и ax2 = (ax1 * dx1) & 0xFFFF.
DIV может разделить 32-битное значение на 16-битное значение, где 32-битный числитель разделен на два 16-битных регистра, которые являются одними и теми же регистрами dx и ax.
Имея это в виду (используя разные регистры, чтобы значение, которое вам нужно позже для делителя, не перезаписывалось результатами умножения):
mov bx, 1234h
mov ax, 109h
mul bx ;dx:ax = ax * bx = 0x0109 * 0x1234
div bx ;ax = dx:ax / bx = 0x0109 * 0x1234 / 0x1234 = 0x0109
;dx = dx:ax % bx = 0x0109 * 0x1234 % 0x1234 = 0
Пробовали
DIV?