Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 38

Unknown Author

3.4.

3.4.1.

Команды умножения и деления

Команды умножения

Если сложение и вычитание беззнаковых и знаковых чисел производятся по одним и тем же алгоритмам, то умножение чисел этих двух классов выполняется по разным алгоритмам, в связи с чем в ПК имеются две команды умножения:

MUL op

Умножение целых без знака (multiply):

умножение целых со знаком (integer multiply): IMUL op

В остальном эти команды действуют одинаково:

Умножение байтов: АХ:=АЬ*ор

Умножение слов:

(DX,AX):=АХ*ор (op: г8, т8) (ор: г1б, ш!6)

Операнд ор, указываемый в команде, - это лишь один из сомножителей; он может находиться в регистре или в памяти, но не может быть непосредственным операндом. Местонахождение другого сомножителя фиксировано и потому в команде не указывается явно: при умножении байтов он берется из регистра AL, а при умножении слов - из регистра АХ.

Местонахождение результата умножения также заранее известно и потому в команде явно не указывается. При этом под результат отводится в два раза больше места, чем под сомножители. Это связано с тем, что умножение n-значных чисел в общем случае дает произведение из 2п цифр, и с желанием сохранить все цифры произведения. При умножении байтов результат имеет размер слова и записывается в весь регистр АХ (в АН - старшие цифры произведения, в AL - младшие), а при умножении слов результат имеет размер двойного слова и записывается в два регистра - в регистр DX заносятся старшие цифры произведения, а в регистр АХ - младшие цифры.

Примеры:

N DB ю

MOV AL,2 MUL N MOV AL,26 MUL N MOV AX,8 MOV BX,-1 IMUL BX

; AX=2*10=20=0014h: AH=00h, AL=14h

; AX=26*10=260=0104h: AH=01h, AL=04h

; (DX,AX)=-8=0FFFFFFF8h: DX=0FFFFh, AX=0FFF8h

Итак, команды умножения выдают результат в удвоенном формате. Это не всегда удобно: то мы работали с числами-байтами, а тут приходится переходить на обработку чисел-слов. В то же время далеко не всегда величина произведения столь велика, что ему нужен удвоенный формат; например, в первой и третьей из наших команд умножения для результата вполне достаточно было бы обычного формата. Поэтому важно знать, действительно ли произведению нужен

двойной формат или ему достаточно и одинарного формата. Иногда об этом известно заранее (мы заранее знаем, что перемножаются небольшие числа), но иногда это можно установить только после умножения. В последнем случае вопрос о том, умещается ли результат умножения в формат сомножителей или нет, решается с помощью анализа флагов переноса CF и переполнения OF, которые в обеих командах умножения меняются синхронно и по следующему правилу:

CF=OF=l - если произведение занимает двойной формат

CF=OF=0 - если произведению достаточен формат сомножителей

При CF=0 (одновременно и OF=0) можно считать, что произведение байтов занимает только регистр AL, а произведение слов - только регистр АХ, и дальше можно работать только с этими регистрами. Но если CF=1, то далее приходится работать с произведением как с числом удвоенного формата.

3.4.2. О команде умножения в процессорах 80186 н старше

Фиксированность местонахождения первого операнда и результата и невозможность указывать непосредственный операнд в командах умножения делают эти команды не очень удобными. Поэтому в процессоре 80186 была введена новая команда умножения с тремя операндами, где некоторые из этих неудобств устранены. В Я А эта команда допускает две эквивалентные формы записи: