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

       

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


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

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

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

Если содержимое регистра АН после однобайтового умножения или содержимое регистра DX после двухбайтового умножения не равны 0, флаги CF и OF устанавливаются в 1. В противном случае оба флага сбрасываются в 0.

В качестве операнда-сомножителя команды mul можно указывать регистр (кроме сегментного) или ячейку памяти; не допускается умножение на непосредственное значение. Команда воздействует на флаги OF и CF.

Пример 1

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

mov BL,3 ;Второй сомножитель

mul BL ;AX=000Fh, произведение

Пример 2

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

mov BX,256 ;Второй сомножитель

mul BX ;DX=0001h, AX=0000h



;(DX:AX=65536, произведение)

Пример 3

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

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

datal db 126 ;Второй сомножитель

mov AL,datal ;AL=7Eh=126

mul coef ;AX=3138h=12600,произведение

Пример 4

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

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

datal dw 1200 ;Второй сомножитель

mov AX,datal ;AX=4BOh=1200

mul coef ;DX=005Bh, AX=8D80h

;Произведение=ВХ:AX=

;5B8D80h=6000000

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

Пример 1

mov EAX,200h ;Первый сомножитель

mov ESI,l000000lh ;Второй сомножитель

mul ESI ;Произведение в EDX:EAX

;EDX=00000020h,EAX=00000200h


Пример 2

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

nmbs db 15,22,36,78,84,98,100

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

mov EDX,offset nmbs ;Относительный адрес

movzx EDX,DX ;массива

mov ECX,5 ;Смещение в массиве

mov AL,10 ;Множитель

mul byte ptr [EDX] [ЕСХ] ;Умножаем элемент

;массива с индексом 5 (98)

;на AL (10) Результат в

;АХ=980

NEG Изменение знака, дополнение до 2

Команда neg выполняет вычитание целочисленного операнда со знаком из нуля, превращая положительное число в отрицательное и наоборот. Исходный операнд затирается. В качестве операнда можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.

Пример 1

mov АХ,0 0 01

neg AX ;AX=FFFFh=-1

Пример 2

mov BX,-2 ;BX=FFFEh=-2

neg BX ;BX=0002h

Пример 3

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

nmb dw 800lh ;Если число со знаком,

;то -32767

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

neg nmb ;nmb=7FFFh=+32767

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

Пример

mov ECX, 5

neg ECX ;ECX=FFFFFFFBh=-5

NOP Холостая команда

По команде пор процессор не выполняет никаких действий, кроме увеличения на 1 содержимого указателя команд IP (поскольку команда пор занимает 1 байт). Команда иногда используется в отладочных целях, чтобы "забить" какие-то ненужные команды, не изменяя длину загрузочного модуля или, наоборот, оставить место в загрузочном модуле для последующей вставки команд. В ряде случаев команды пор включаются в текст объектного модуля транслятором. Команда не имеет ни параметров, ни операндов и не воздействует на флаги процессора.

NOT Инверсия, дополнение до 1, логическое отрицание

Команда not выполняет инверсию битов указанного операнда, заменяя 0 на 1 и наоборот. В качестве операнда можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда не воздействует на флаги процессора.



Правила побитовой инверсии:

Операнд-бит 0 1

Бит результата 1 0

Пример 1

mov AX,0FFFFh

not AX ;AX=0000h

Пример 2

mov SI,5551h

not SI ;SI=AAAEh

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

Пример

mov EAX,0C00SFF00h

not EAX ;EAX=3FFC00FFh

OR Логическое ВКЛЮЧАЮЩЕЕ ИЛИ

Команда or выполняет операцию логического (побитового) сложения двух операндов. Результат замещает первый операнд (приемник); второй операнд (источник) не изменяется. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды команды or могут быть байтами или словами. Команда воздействует на флаги OF, SF, ZF, PF и CF, при этом флаги CF и OF всегда сбрасываются в 0.

Правила побитового сложения:

Первый операнд-бит 0101

Второй операнд-бит 0011

Бит результата 0111

Пример 1

mov AX,000Fh

mov BX,00F0h

or AX,BX ;AX=00FFh, BX=00F0h

Пример 2

mov AX,000Fh

mov BX,00F7h

or AX,BX ;AX=00FFh, BX=00F7h

Пример 3

mov AX,000Fh

or AX,8001h ;AX=800Fh

Пример 4

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

mask db 80h

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

mov CH,17h

or CH,mask ;CH=97h

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

Пример

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

mem dd 80000000h

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

or mem,0C0h ;mem=800000C0h

OUT Вывод в порт

Команда out выводит в порт, указываемый первым операндом, байт или слово соответственно из регистра AL или АХ. Адрес порта помещается в регистр DX. Если адрес порта не превышает 255, он может быть указан непосредственным значением. Указание регистра-источника (AL или АХ) обязательно, хотя с другими регистрами команда out не работает, и их указывать нельзя. Команда не воздействует на флаги процессора.

Пример 1

mov AL,20h ;Команда конца прерывания (EOI)

out 20h,AL ;Вывод команды EOI в порт

;20h контроллера прерываний

Пример 2

mov DX,3CEh ; Адрес порта

mov AL,5 ;Данное

out DX,AL ;Вывод байта из AL в порт 3CEh

Допустимо использование в качестве операнда-источника расширенного регистра ЕАХ (если адресуемое устройство позволяет записать в его порт двойное слово).

Пример

mov ЕАХ,1А008РРЗh;Пересылаемое данное

mov DX,345h ;Адрес порта

out DX,EAX ;Вывод в порт двойного слова


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