Mov приймач,джерело
У якості приймача може виступати регістр, або ділянка пам’яті. У якості джерела – регістр, ділянка пам’яті або константа.
Приклади використання команди mov:
Для вказування розміру змінної при записі в неї константи зарезервовані наступні ключові слова: byte, word, dword, qword. Використовувати qword дозволено тільки в режимі x64.
Заборонено пересилання «mov змінна,змінна», тобто запис однієї створеної у пам’яті змінної в іншу.
Синтаксис команди обміну операндами:
Xchg операнд1,операнд2
Обмін операндами між пам’яттю та регістром:
Заборонений обмін «xchg змінна,змінна».
Будь-який операнд інструкції з посиланням на пам’ять називається ефективною адресою. У нашому останньому прикладі таким операндом є var.
Команди цілочисельної арифметики:
add, sub, neg, mul, imul, div, idiv, cmp, inc, dec.
Додавання та віднімання. Синтаксис команди додавання:
add операнд1,операнд2
Синтаксис команди віднімання:
sub операнд1,операнд2
Результат додавання/віднімання поміщується в операнд1. Операнди повинні мати однакову розрядність.
Додавання чисел, що знаходяться в регістрах al та bl:
Додавання вмісту комірки пам’яті та регістра:
Приклад із відніманням:
Додавання/віднімання констант до/від змінних:
Додавати і віднімати можна як без знакові, так й знакові числа.
Заборонено додавання/віднімання «add змінна,змінна»/
«sub змінна,змінна», тобто обидва операнди в команді add/sub не можуть бути змінними одночасно.
Інкремент (збільшення на 1) та декремент (зменшення на 1) вмісту регістра:
inc al
dec bx
Зміна знака вмісту регістра:
neg cx
Інкремент, декремент та зміна знака змінних у пам’яті:
inc word[var1]
dec word[var2]
neg byte[var3]
Залежно від типу змінної використовуються записи: byte, word, dword, qword.
Множення. Синтаксис команди беззнакового множення:
Mul операнд
Операнд, який вказаний у команді є одним із співмножників (уміст регістра або змінна у пам’яті). Якщо цей співмножник є змінною, то треба вказати її розмір (byte, word, dword), наприклад, word[var4].
Місцезнаходження другого співмножника та добутку фіксоване і в команді не вказується:
– якщо операнд команди mul має розмір db (байт), то другий співмножник береться з регістра al, а результат поміщується до регістра ax;
– якщо операнд команди mul має розмір dw (слово), то другий співмножник береться з регістра ax, а результат поміщується до регістрової пари dx:ax;
– якщо операнд команди mul має розмір dd (подвійне слово), то другий співмножник береться з регістра eax, а результат поміщується до регістрової пари edx:eax.
Команда знакового множення:
Imul операнд
Один із співмножників міститься в команді, другий повинен міститися в регістрі eax/ax/al, а результат поміщується до регістрів edx:eax/dx:ax/ax.
Приклад (помножимо 20000 на 20000):
Результат (20000*20000=400000000=17d78400h):
Як скористатися результатом операції, якщо він розкиданий по декількох регістрах? Із частиною, що була поміщена до eax, просто – вона на своєму місці, у частині молодших бітів регістра eax (у регістрі ax) і відповідає молодшим розрядам числа. Для використання старших розрядів нашого результату (а також, для звернення до старших бітів регістрів) використовують команду зсуву бітів.
Зсув бітів (логічний). Синтаксис команди:
SHL <операнд>, <кількість бітів> ; Логічний зсув уліво
SHR <операнд>, <кількість бітів> ; Логічний зсув управо
Наприклад,
Зрозуміло, що команди можна написати і в іншому вигляді, наприклад, шістнадцятковому: shl eax,10h або двійковому shl eax,10000b
При логічному зсуві «вивільнені» біти заповнюються нулями.
Існують також інші зсуви (арифметичний, циклічний, розширений), які ми зараз розглядати не будемо (від логічного вони відрізняються наповнювачем «вивільнених» бітів). У всіх зазначених зсувах останній вивільнений біт зберігається у прапорці CF.
Повернемось до прикладу із множенням:
Отже, результат множення переміщений в eax і готовий до подальшого використання.
Ділення. Синтаксис команди беззнакового та знакового ділення:
