Процессор 8086 может выполнять отдельные типы операций умно-жения и деления. Эта одна из сильных сторон процессора 8086, пос-кольку во многих микропроцессорах вообще отсутствует непосредст-венная поддержка операций умножения и деления, а эти операции до-вольно сложно выполнить программным путем.
Инструкция MUL перемножает 8- или 16-битовые беззнаковые сомножители, создавая 16- или 32-битовое произведение. Давайте сначала рассмотрим умножение 8-битовых сомножителей.
При 8-битовом (8-разрядном) умножении один из операндов дол-жен храниться в регистре AL, а другой может представлять собой любой 8-битовый общий регистр или переменную памяти соответствую-щего размера. Инструкция MUL всегда сохраняет 16-битовое произве-дение в регистре AX. Например, во фрагменте программы:
mov al,25
mov dh,40
mul dh
AL умножается на DH, а результат (1000) помещается в регистр AX. Заметим, что в инструкции MUL требуется указывать только один операнд, другой сомножитель всегда храниться в регистре AL (или в регистре AX в случае перемножения 16-битовых сомножителей).
Инструкция перемножения 16-битовых сомножителей работает аналогично. Один из сомножителей должен храниться в регистре AX, а другой может находиться в 16-разрядном общем регистре или в пе-ременной памяти. 32-битовое произведение инструкция MUL помещает в этом случае в регистры DX:AX, при этом младшие (менее значащие) 16 битов произведения записываются в регистр AX, а старшие (более значащие) 16 бит — в регистр DX. Например, инструкции:
mov ax,1000
mul ax
загружают в регистр AX значение 1000, а затем возводят его в квадрат, помещая результат (значение 1000000) в регистры DX:AX.
В отличие от сложения и вычитания, в операции умножения не учитывается, являются ли сомножители операндами со знаком или без знака, поэтому имеется вторая инструкция умножения IMUL для умно-жения 8- и 16-битовых сомножителей со знаком. Если не принимать во внимание, что перемножаются значения со знаком, инструкция IMUL работает аналогично инструкции MUL. Например, при выполнении инструкций:
mov al,-2
mov ah,10
imul ah
в регистре AX будет записано значение -20.
Процессор 8086 позволяет вам с определенными ограничениями разделить 32-битовое значение на 16-битовое, или 16-битовое зна-чение на 8-битовое. Давайте сначала рассмотрим деление 16-битового значения на 8-битовое.
При беззнаковом делении 16-битового значения на 8-битовое делимое должно быть записано в регистре AX. 8-битовый делитель может храниться в любом 8-битовом общем регистре или переменной в памяти соответствующего размера. Инструкция DIV всегда записывает 8-битовое частное в регистр AL, а 8-битовый остаток — в AH. Нап-ример, в результате выполнения инструкций:
mov ax,51
mov dl,10
div dl
результат 5 (51/10) будет записан в регистр AL, а остаток 1 (ос-таток от деления 51/10) — в регистр AH.
Заметим, что частное представляет собой 8-битовое значение. Это означает, что результат деления 16-битового операнда на 8-битовый операнд должен превышать 255. Если частное слишком ве-лико, то генерируется прерывание 0 (прерывания по делению на 0).
Инструкции:
mov ax,0fffh
mov bl,1
div bl
генерируют прерывание по делению на 0 (как можно ожидать, преры-вание по делению на 0 генерируется также, если 0 используется в качестве делителя).
При делении 32-битового операнда на 16-битовый операнд дели-мое должно записываться в регистрах DX:AX. 16-битовый делитель может находиться в любом из 16-битовых регистров общего назначе-ния или в переменной в памяти соответствующего размера. Например, в результате выполнения инструкций:
mov ax,2
mov dx,1 ; загрузить в DX:AX 10002h
mov bx,10h
div bx
частное 1000h (результат деления 10002h на 10h) будет записано в регистре AX, а 2 (остаток от деления) — в регистре DX.
Как и при умножении, при делении имеет значение, используют-ся операнды со знаком или без знака. Для деления беззнаковых опе-рандов используется операция DIV, а для деления операндов со зна-ком — IDIV. Например, операции:
.DATA
TestDivisor DW 100
.CODE
mov ax,-667
cwd ; установить DX:AX в значение -667
idiv [TestDivisor]
сохраняют значение -6 в регистре AX и значение -67 в регистре DX.
