вторник, 21 сентября 2010 г.

ASM: Операции

add a1,a2 : a1 = a1 + a2;
sub a1,a2 : a1 = a1 - a2;
adc a1,a2 : a1 = a1 + a2 + CF;
sbb a1,a2 : a1 = a1 - a2 - CF;
inc a1 : a1 = a1 + 1 (не меняет флаг CF);
dec a1 : a1 = a1 - 1 (не меняет флаг CF);
neg eax : eax = -eax (число с противоположным знаком);

Команда CBW копирует седьмой (старший) бит регистра AL в регистр АН, расширяя
таким образом оригинальное значение регистра AL в значение со знаком
регистра АХ (значение АН становится равно 0x00 или 0xFF = 11111111b, в зависимости
от старшего бита AL).

Команда CWD копирует старший бит АХ в регистр DX, расширяя таким образом
оригинальное значение АХ в пару регистров со знаком DX:AX.

Команда CDQ копирует старший бит ЕАХ в регистр EDX, расширяя таким образом
оригинальное значение ЕАХ в пару регистров со знаком EDX:EAX.

Команда CWDE копирует старший бит АХ в верхнюю часть (старшую часть)
ЕАХ, расширяя таким образом оригинальное значение АХ в двойное слово
со знаком, которое будет помещено в регистр ЕАХ.

mov al , -1 : AL = -1 (или 0xFF)
cbw : знаковое расширение на весь АХ

После выполнения команды CBW АХ будет содержать значение 0xFFFF, то
есть -1. Единица (1) старшего разряда заполнила все биты АН, и мы получили
знаковое расширение AL на весь регистр АХ.

Умножение и деление:
Первое арифметическое действие выполняется командой
MUL, а второе — командой DIV.

Дополнительный код делает возможным сложение и вычитание целых чисел
со знаком и без знака с помощью одних и тех же команд ADD и SUB. Но к
умножению и делению это не относится: для умножения и деления чисел со
знаком служат отдельные команды — IMUL и IDIV. Операнды этих инструкций
такие же, как у MUL и DIV.

mov al , bh : AL = ВН — сначала заносим в AL второй операнд
mul cl  : АХ = AL * CL — умножаем его на CL;
 
Результат будет сохранен в регистре АХ.
Пример: вычислить 486*486, результат сохранить в DX:AX:

mov ax, 486 : АХ = 486
mul ах : АХ * АХ -> DX:AX

Команда IMUL умножает целые числа со знаком и может использовать один,
два или три операнда. Когда указан один операнд, то поведение IMUL будет
таким же, как и команды MUL, просто она будет работать с числами со
знаком.

Если указано два операнда, то инструкция IMUL умножит первый операнд
на второй и сохранит результат в первом операнде, поэтому первый операнд
всегда должен быть регистром. Второй операнд может быть регистром, непосредственным
значением или адресом памяти.

Если указано три операнда, то команда IMUL перемножит второй и третий
операнды, а результат сохранит в первый операнд. Первый операнд — только
регистр, второй может быть любого типа, а третий должен быть только непосредственным
значением.

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.