Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Команды ассемблера

Автор: Руслан Аблязов
6 октября 2006 года

Арифметические операции - ADD, SUB, MUL, DIV. Многие опкоды делают вычисления. Вы можете узнать многие из них по их названиям: add (addition - добавление), sub (substraction - вычитание), mul (multiply - умножение), div (divide - деление).

Опкод add имеет следующий синтаксис:

add приемник, источник

Выполняет вычисление: приемник = приемник + источник.

Имеются также другие формы:

приемникисточникпример
регистр регистр add ecx, edx
регистр память add ecx, dword ptr [104h] / add ecx, [edx]
регистр значение add eax, 102
память значение add dword ptr [401231h], 80
память регистр add dword ptr [401231h], edx

Эта команда очень проста. Она добавляет значение источника к значение приемника и помещает результат в приемник. Другие математические команды:

sub приемник, источник (приемник = приемник - источник)
mul множимое, множитель (множимое = множимое * множитель)
div делитель (eax = eax / делитель, edx = остаток)

Поскольку регистры могут содержать только целочисленные значения (то есть числа, не, с плавающей запятой), результат деления разбит на частное и остаток. Теперь, в зависимости от размера источника, частное сохраняется в eax, а остаток в edx:

размер источникаделениечастное в...остаток в...
BYTE (8-bits) ax / делитель AL AH
WORD (16-bits) dx:ax* / делитель AX DX
DWORD (32-bits) edx:eax* / делитель EAX EDX

* = Например: если dx = 2030h, а ax = 0040h, dx: ax = 20300040h. Dx:ax - значение dword, где dx представляет старшее word, а ax - младшее. Edx:eax - значение quadword (64 бита), где старшее dword в edx и младшее в eax.

Источник операции деления может быть:

  1. 8-бит регистр (al, ah, cl,...)
  2. 16-бит регистр (ax, dx, ...)
  3. 32-бит регистр (eax, edx, ecx...)
  4. 8-бит значение из памяти (byte ptr [xxxx])
  5. 16-бит значение из памяти (word ptr [xxxx])
  6. a 32-бит значение памяти (dword ptr [xxxx])

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

Логические операции с битами - OR, XOR, AND, NOT.Эти команды работают с приемником и источником, исключение команда 'NOT'. Каждый бит в приемнике сравнивается с тем же самым битом в источнике, и в зависимости от команды, 0 или 1 помещается в бит приемника:

командаANDORXORNOT
Бит источника 0 0 1 1 0 0 1 1 0 0 1 1 0 1
Бит приемника 0 1 0 1 0 1 0 1 0 1 0 1 X X
Бит результата 0 1 0 1 0 1 1 1 0 1 1 0 1 0

AND (логическое И)устанавливает бит результата в 1, если оба бита, бит источника и бит приемника установлены в 1.

OR (логическое ИЛИ)устанавливает бит результата в 1, если один из битов, бит источника или бит приемника установлен в 1.

XOR (НЕ ИЛИ)устанавливает бит результата в 1, если бит источника отличается от бита приемника.

NOTинвертирует бит источника.

Пример:

mov ax, 3406d
mov dx, 13EAh
xor ax, dx
ax = 3406 (десятичное), в двоичном - 0000110101001110.
dx = 13EA (шестнадцатиричное), в двоичном - 0001001111101010. 

Выполнение операции XOR на этими битами:

Источник = 0001001111101010 (dx)
Приемник = 0000110101001110 (ax)
Результат = 0001111010100101 (новое значение в ax)

Новое значение в ax, после выполнения команды - 0001111010100101 (7845 - в десятичном, 1EA5 - в шестнадцатиричном).

Другой пример:

mov ecx, FFFF0000h
not ecx
FFFF0000 в двоичном это - 11111111111111110000000000000000 

Если вы выполните инверсию каждого бита, то получите:

00000000000000001111111111111111 , в шестнадцатиричном это 0000FFFF 

Значит после операции NOT, ecx будет содержать 0000FFFFh.

Увеличение/Уменьшение - INC/DEC.Есть 2 очень простые команды, DEC и INC. Эти команды увеличивают или уменьшают содержимое памяти или регистра на единицу. Просто поместите:

inc регистр ; регистр = регистр + 1
dec регистр ; регистр = регистр - 1
inc dword ptr [103405] ; значение в [103405] будет увеличено на 1.
dec dword ptr [103405] ; значение в [103405] будет уменьшено на 1.

Ещё одна команда сравнения - test.Команда Test выполняет операцию AND (логическое И) с двумя операндами и в зависимости от результата устанавливает или сбрасывает соответствующие флаги. Результат не сохраняется. Test используется для проверки бит, например в регистре:

test eax, 100b  
jnz смещение

Команда jnz выполнит переход, если в регистре eax третий бит справа - установлен. Очень часто комманду test используют для проверки, равен ли регистр нулю:

test ecx, ecx
jz смещение

Команда jz выполнит переход, если ecx = 0.

Ничего не делающая команда - nop. Эта команда не делает абсолютно ничего (пустая команда). Она только занимает пространство и время. Используется для резервирования места в сегменте кода или организации программной задержки.

Обмен значениями - XCHG. Команда XCHG также весьма проста. Назначение: обмен двух значений между регистрами или между регистрами и памятью:

mov eax , 237h
mov  ecx, 978h
xchg eax, ecx

в результате:

eax = 978h 
ecx = 237h 

Вот и конец урока. Надеюсь, этот не был скучным. Следующий урок расскажет вам про подпрограммы.


Назад | Оглавление | Далее

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

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
44K
22 ноября 2008 года
uisovec
2 / / 22.11.2008
+18 / -4
Мне нравитсяМне не нравится
1 декабря 2008, 23:38:10
Подскажите пожалуйста. Допустим умножаем АХ на СХ (mul cx). Тогда результат будет в dx:ax. Как тогда умножить значение в DX:AX на BX?
1.1.
100.0M
15 марта 2020 года
0 / / 15.03.2020
+2 / -1
Мне нравитсяМне не нравится
21 марта 2020, 16:36:57
Дано:
AX = 02d
CX = 05d
BX = 03d
====<ASSEMBLER>====
mul cx ; AX *= CX AX = AX * CX
mul bx ; AX *= BX AX = AX * BX
====<ASSEMBLER>====
1.1.1.
100.0M
15 марта 2020 года
0 / / 15.03.2020
+2 / -0
Мне нравитсяМне не нравится
21 марта 2020, 16:40:26
====<ASSEMBLER>====
mul ax, cx ; AX *= CX AX = AX * CX
push ax
pop ax
mul ax, bx ; AX *= BX AX = AX * BX
====<ASSEMBLER>====
2.
30K
30 мая 2007 года
demon GRU
0 / / 30.05.2007
+4 / -4
Мне нравитсяМне не нравится
30 мая 2007, 17:35:16
XCHG натолкнуло на мысль crossChange
=>
XOR - cross OR, т.е. кросс ИЛИ
3.
30K
30 мая 2007 года
demon GRU
0 / / 30.05.2007
+8 / -5
Мне нравитсяМне не нравится
30 мая 2007, 17:30:56
Выполнение операции XOR на этими битами:

Источник = 0001001111101010 (dx)
Приемник = 0000110101001110 (ax)
Результат= 0001111010100100 (новое значение в ax)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог