Иллюстрированный самоучитель по Assembler

         

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 Ввод из порта

Команда 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


Содержание раздела