Загрузка...

Умножение и деление


Процессор 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.

Загрузка...