Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Idiv Деление целых чисел со знаком

Команда IDIV выполняет деление целого числа со знаком, находяще­гося в регистрах АХ (в случае деления на байт) или DX:AX (в случае деления на слово), на операнд-источник (целое число со знаком). Размер делимого в два раза больше размеров делителя и остатка. Оба результата рассматриваются как числа со знаком, причем знак остатка равен знаку делимогр.

Для однобайтовых операций делимое помещается в регистр АХ; после выполнения операции деления частное записывается в регистр AL, оста­ток — в регистр АН.

Для двухбайтовых операций делимое помещается в регистры DX:AX (в DX — старшая часть, в АХ — младшая); после выполнения операции деления частное записывается в регистр АХ, остаток — в регистр DX.

В качестве операнда-делителя команды idiv можно указывать регистр данных или ячейку памяти; не допускается деление на непосредственное значение. Если делитель равен 0, или если частное не помещается в назна­ченный регистр, возбуждается прерывание через вектор 0. Команда не воздействует на флаги процессора.

Пример 1

mov AX.506

mov BL,50

. idiv BL

;Делимое

;Делитель

;AL=OAli (частное), AH-06h

Достаток)

Система команд процессоров Intel

225

Пример 2

;В полях данных

long dd OF0007h ;Делимое

;В программном сегменте

mov DX,word ptr loiig+2;DX=OOOFh, старшая

;часть делимого mov AX.word ptr Iong;AX=0007h, младшая

;часть делимого

mov CX, 256 ; Делитель

idiv CX ;AX=OFOOh (частное),

;DX=0007h (остаток)

Пример 3

mov mov idiv

AX,-506 ;AX=FE06h, делимое

BL,50 ; Делитель

;AL=F6h (-10), AH=FAli (-6)

386+ Допустимо использование 32-битовых операндов и дополнитель­ных режимов адресации 32-разрядных процессоров. При этом, если дели­тель представляет 32-битовую величину, то возможен только один вари­ант команды деления, когда делимое находится в паре регистров EDX:EAX. В этом случае частное будет помещено в регистр ЕАХ, остаток — в EDX.

Пример

;В полях данных

dvd dq -100001 ;Делимое

;В программном сегменте

mov EAX,dword ptr dvd+2;EAX=FFFF795Fh

; (младшая часть делимого) mov EDX,dword ptr dvd;EDX=FFFFFFFFh (старшая

;часть делимого) mov EBX,50 ;Делитель

idiv ЕВХ ;Частное в EAX=FFFFF830h=

;-2000, остаток в ;EDX=FFFFFFFFh=-l

Imul Умножение целых чисел со знаком

Команда IMUL выполняет умножение целого числа со знаком, нахо-^дящегося в регистре AL (в случае умножения на байт) или АХ (в случае ^умножения на слово), на операнд-источник (целое число со знаком). Раз-?мер произведения в два раза больше размера сомножителей.

Для однобайтовых операций один из сомножителей помещается в ре­гистр AL; после выполнения операции произведение записывается в ре­гистр АХ.

Для двухбайтовых операций один из сомножителей помещается в ре­гистр АХ; после выполнения операции произведение записывается в ре­гистры DX:AX (в DX — старшая часть, в АХ — младшая).

226

Приложение

В качестве операнда-сомножителя команды imul можно указывать ре­гистр (кроме сегментного) или ячейку памяти; не допускается умноже­ние на непосредственное значение. Команда воздействует на флаги OF и CF. Если АН или DX представляют собой просто знаковое расширение AL или АХ, соответственно (т.е. результат умножения со знаком верен), OF и CF сбрасываются в 0; в противном случае (результат со знаком не помещается в АХ или DX:AX) OF и CF устанавливаются в 1.

Пример 1

mov AL,5

mov BL,3

imul BL

Пример 2

mov AX,256

mov BX.256

imul BX

;Первый сомножитель ;Второй сомножитель ;AX=OOOFh (произведение)

;Первый сомножитель ; Второй сомножитель ;DX=0001h, AX=OOOOh ;(число 65536)

Пример 3

mov AL,-5

mov BL,3

imul BL

;AL=FBh ;BL=03h ;AX=FFFlh (-15)

386+ Допустимо использование 32-битовых операндов и дополнитель­ных режимов адресации 32-разрядных процессоров. Имеются также вари­анты команды с двумя и тремя операндами.

Для команды imul с одним операндом второй сомножитель должен располагаться в AL, АХ или ЕАХ. Процессор выбирает размерность второ­го сомножителя, исходя из размерности первого, указанного в качестве операнда. 16-, 32- или 64-битовый знаковый результат помещается в реги­стры АХ, DX:AX или EDX:EAX, соответственно. Если после операции умножения содержимое АН, DX или EDX является лишь знаковым рас­ширением AL, АХ или ЕАХ, соответственно, то флаги CF и OF сбрасы­ваются в 0. В противном случае они устанавливаются в 1.

Для команды imul с двумя операндами их произведение записывается в первый операнд; второй операнд не изменяется. В качестве первого опе­ранда могут выступать 16- или 32-разрядные регистры общего назначе­ния; в качестве второго операнда — 16- или 32-разрядные регистры обще­го назначения, 16- или 32-битовые ячейки памяти или непосредственное значение. Оба операнда должны иметь один размер. Если результат умно­жения помещается в первый операнд, флаги CF и OF сбрасываются в 0. В противном случае они устанавливаются в 1.

Для команды imul с тремя операндами произведение второго и тре­тьего операндов записывается в первый операнд. В качестве первого опе­ранда могут выступать 16- или 32-разрядные регистры общего назначе­ния; в качестве второго операнда — 16- или 32-разрядные регистры обще-

Система команд процессоров Intel

227

го назначения или 16- или 32-битовые ячейки памяти; в качестве третьего операнда — только непосредственное значение. Два первых операнда дол­жны иметь один размер. Если результат умножения помещается в первый операнд, флаги CF и OF сбрасываются в 0. В противном случае они уста­навливаются в 1.

Пример 1

mov mov imul

ЕАХ,-1

ESI, 100000000 ESI

;Первый сомножитель ;Второй сомножитель ;EDX=FFFFFFFFh, ;EAX=FAOAlFOOh ;Результат=-100000000

Пример 2

;B полях данных

ор2 dd lOOh

;В программном сегменте mov EAX,400000h imul EAX,op2

Пример 3

BX=300h imul AX.BX.4

;Первый сомножитель

;Второй сомножитель ;EAX=40000000h

;AX=300h*4=OCOOh