main
  right
imgsearch
menu_left menu_right
separate
shop_left
Книга
hr

shop_right
below
gap
navigate
 
bottom

Команды Ассемблера: Арифметические команды

Команда сложения 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. Командам условного перехода также будет уделено внимание.

Автор:Евгений Катрич
<< назад  оглавление 
tranpx
bottom_map  
bot-top
Copyright © 2004-2008 E-mail: [email protected]