![]() |
![]() |
![]() |
HLT Останов
Команда hlt прекращает выполнение программы и переводит процессор в состояние останова. Работа процессора возобновляется после операции запуска, а также в случае прихода немаскируемого или разрешенного маскируемого прерываний.
IDIV Деление целых чисел со знаком
Команда IDIV выполняет деление целого числа со знаком, находящегося в регистрах
АХ (в случае деления на байт) или DX:AX (в случае деления на слово), на операнд-источник
(целое число со знаком). Размер делимого в два раза больше размеров делителя
и остатка. Оба результата рассматриваются как числа со знаком, причем знак остатка
равен знаку делимого.
Для однобайтовых операций делимое помещается в регистр АХ; после выполнения
операции деления частное записывается в регистр
AL, остаток - в регистр АН.
Для двухбайтовых операций делимое помещается в регистры DX:AX (в DX - старшая
часть, в АХ - младшая); после выполнения операции деления частное записывается
в регистр АХ, остаток - в регистр DX.
В качестве операнда-делителя команды idiv можно указывать регистр данных или
ячейку памяти; не допускается деление на непосредственное значение. Если делитель
равен 0, или если частное не помещается в назначенный регистр, возбуждается
прерывание через вектор 0. Команда не воздействует на флаги процессора.
Пример 1
mov AX,506 ;Делимое
mov BL,50 ;Делитель
idiv BL ;AL=0Ah (частное), AH=06h
; (остаток)
Рис.П3. Состояние стека после входа в подпрограмму и выполнения команды enter8,0(на рисунке адреса ячеек уменьшаются в низ)
Пример 2
;В полях данных
long dd 0F0007h ;Делимое
; В программном сегменте
mov DX,word ptr long+2;DX=000Fh, старшая
;часть делимого
mov AX,word ptr long;AX=0007h, младшая
;часть делимого
mov CX,256 ;Делитель
idiv СХ ;AX=0F00h (частное),
;DX=0007h (остаток)
Пример 3
mov AX,-506 ;AX=FE06h, делимое
mov BL,50 ;Делитель
idiv BL ;AL=F6h (-10), AH=FAh (-6)
Допустимо использование
32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
При этом, если делитель представляет 32-битовую величину, то возможен только
один вариант команды деления, когда делимое находится в парс регистров
EDX:EAX.
В этом случае частное будет помещено в регистр БАХ, остаток - в
EDX.
Пример
; В полях данных
dvd dq -100001 Делимое
;B программном сегменте
mov EAX,dword ptr dvd EAX=FFFE795Fh
;(младшая часть делимого)
mov EDX,dword ptr dvd+4 EDX=FFFFFFFFh (старшая
;часть делимого)
mov EBX,50 Делитель
idiv EBX Частное в EAX=FFFFF830h=
;-2000, остаток в EDX=FFFFFFFFh=-1
IMUL Умножение целых чисел со знаком
Команда IMUL выполняет умножение целого числа со знаком, находящегося в регистре
AL (в случае умножения на байт) или АХ (в случае умножения на слово), на операнд-источник
(целое число со знаком). Размер произведения в два раза больше размера сомножителей.
Для однобайтовых операций один из сомножителей помещается в регистр
AL; после
выполнения операции произведение записывается в регистр АХ.
Для двухбайтовых операций один из сомножителей помещается в регистр АХ; после
выполнения операции произведение записывается в регистры DX:AX (в DX - старшая
часть, в АХ - младшая).
В качестве операнда-сомножителя команды imul можно указывать регистр (кроме
сегментного) или ячейку памяти; не допускается умножение на непосредственное
значение. Команда воздействует на флаги OF и
CF. Если АН или DX представляют
собой просто знаковое расширение AL или АХ, соответственно (т.е. результат умножения
со знаком верен), OF и CF сбрасываются в 0; в противном случае (результат со
знаком не помещается в АХ или DX:AX) OF и CF устанавливаются в 1.
Пример 1
mov AL,5 ;Первый сомножитель
mov BL,3 ;Второй сомножитель
imul BL ;AX=000Fh (произведение)
Пример 2
mov AX,256 ;Первый сомножитель
mov BX,256 ;Второй сомножитель
imul BX ;DX=0001h, AX=0000h
;(число 65536)
Пример 3
mov AL,-5 ;AL=FBh
mov BL,3 ;BL=03h
imul BL ;AX-'FFF1h (-15)
Допустимо использование
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-разрядные регистры общего назначения или 16- или 32-битовые ячейки памяти;
в качестве третьего операнда - только непосредственное значение. Два первых
операнда должны иметь один размер. Если результат умножения помещается в первый
операнд, флаги CF и OF сбрасываются в 0. В противном случае они устанавливаются
в 1.
Пример 1
mov EAX,-1 ;Первый сомножитель
mov ESI,100000000 ;Второй сомножитель
imul ESI ;EDX=FFFFFFFFh,
;EAX=FA0AlF00h
;Результат=-100000000
Пример 2
;В полях данных
ор2 dd 100h ;Первый сомножитель
; В программном сегменте
mov EAX,400000h ;Второй сомножитель
imul EAX,op2 ;EAX=40000000h
Пример 3
mov BX,300h
imul АХ,ВХ,4 ;AX=300h*4=0C00h
Команда in вводит в регистр AL или АХ соответственно байт или слово из порта,
указываемого вторым операндом. Адрес порта помещается в регистр
DX. Если адрес
порта не превышает 255, он может быть указан непосредственным значением. Указание
регистра-приемника (AL или АХ) обязательно, хотя с другими регистрами команда
in не работает, и их указывать нельзя. Команда не воздействует на флаги процессора.
Пример 1
in AL, 60h ;Ввод байта из порта 60h
Пример 2
mov DX,3D5h ;Адрес порта
in AL,DX ;Ввод байта из порта 3D5h
Допустимо использование
в качестве операнда-приемника расширенного регистра ЕАХ (если адресуемое устройство
позволяет прочитать из его порта двойное слово).
Пример
mov DX,345h ;Адрес порта
in EAX,DX
INC Инкремент (увеличение на 1)
Команда inc прибавляет 1 к операнду, в качестве которого можно указывать регистр
(кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не
допускается использовать в качестве операнда непосредственное значение. Операнд
интерпретируется как число без знака. Команда воздействует на флаги
OF, SF, ZF, AF и PF. Команда не воздействует на флаг
CF; если требуется воздействие
на этот флаг, необходимо использовать команду add
op,l.
Пример 1
mov AX,0563h
inc AX ;AX=0564h
Пример 2
mov BH,15h
inc BH ;BH=16h
Пример 3
mov AX,A5FFh
inc AL ;AX=A500h
inc AH ;AX=A600h
Пример 4
mov AX,0FFFFh
inc AX ;AX=0000h, ZF=1, CF=0
;Для сравнения:
mov CX,0FFFFh
add CX,1 ;CX=0000h, ZF=1, CF=1
Допустимо использование
32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
Пример
;В полях данных
mem dd 12345678h
; В программном сегменте
inc mem ;mem=12345679h
![]() |
![]() |
![]() |