Команды Ассемблера: Арифметические команды
Команда сложения ADD
Addition
Пример:
add [a],eax
Эта строка к адресу переменной a добавит значение регистра eax.
Команда сложения ADC
Addition with carry
Ассемблерная команда сложения adc использует бит переноса CF, а это значит, что она может быть применена,
например, для сложения 64-разрядных чисел.
Пример:
x dd 77777777h,77777777h
y dd 77777777h,77777777h
---
;сложение младших бит
mov eax,[x]
add eax,[y]
mov [z],eax
;сложение старших бит
mov eax,[x+4]
adc eax,[y+4]
mov [z+4],eax
;учет переноса
mov [z+8],0
adc [z+8],0
Команда вычитания SUB
Subtract
Пример:
sub eax,ebx
sub eax,eax
Команда sub противоположна команде add. В первой строке, из регистра eax будет вычтено значение
регистра ebx. Тогда, не трудно догадаться, что после выполнения команды второй строки, содержимое регистра eax будет равно нулю, этот метод используется для обнуления регистров, хотя это можно сделать и небезызвестной командой
пересылки mov.
Команда вычитания SBB
Subtract with borrow CF - Вычитание с заемом флага переноса CF
Пример:
sbb eax,ebx
Полный пример программы не приведен, потому что команда sbb обратна команде adc и аналогична
по принципу действия.
Команда INC
Increment
Команда увеличивает значение операнда на 1.
Пример:
inc eax; eax=eax+1
Команда DEC
Decrement
Команда уменьшает значение операнда на 1.
Пример:
dec eax; eax=eax-1
Команда NEG
Negate operand - изменение знака операнда
Пример:
neg [b]
mov eax,[b]
add [a],eax
;a=a-b
Проделанное выше можно сделать с помощью команды sub:
mov eax,[b]
sub [a],eax
Поскольку операция вычитания более медленна, чем операция сложения, первый способ, с применением ассемблерной команды
neg более эффективен.
Команда умножения MUL
Multiply - Беззнаковое умножение
Пример:
mov eax,[a]
mul [b]
mov [a],eax
Команда mul умножает значение регистра eax на значение операнда. Результат всегда будет записан в
регистр eax.
Команда умножения IMUL
Integer Multiply - Знаковое целочисленное умножение
Пример:
mov ebx,[a]
imul ebx,[b]
mov [a],ebx
Знаковое целочисленное умножение imul можно записать и как беззнаковое mul, а можно, как это
показано в примере выше. Отличие состоит в том, что команда imul не привязана к регистру eax.
Команда imul имеет и 3-х операндную запись:
mov ebx,[b]
imul eax,ebx,10
mov [a],eax
Результат будет равен произведению второго операнда на константу, и записан в первый операнд.
Команда деления DIV
Divide - Беззнаковое деление
Пример:
mov edx,0
mov eax,[a]
div [b]
mov [a],eax
mov [b],edx
Ассемблерная команда div использует два регистра для формирования результатов деления: eax – частное, и edx -
остаток от деления.
Команда деления IDIV
Integer Divide - Знаковое целочисленное деление
idiv [b]
Синтаксис этого деления аналогичен делению div.
Команда сравнения CMP
Compare
Пример:
mov eax,0
for1:
;тело цикла
inc eax
mov [b],eax
cmp eax,5
jl for1
Команда cmp сравнивает значения двух операндов. В примере приведен участок кода со структурой цикла,
который будет повторяться, пока eax не достигнет 5. В организации цикла присутствуют и неизвестная команда - команда
условного перехода jl. Командам условного перехода также будет уделено внимание.
|