Главная страница
Предыдущая страница (основные понятия)

Описание простейших команд Ассемблера

1) mov приёмник, источник – команда пересылки данных. Копирует содержимое источника в приёмник, источник не изменяется. Например: mov ax, 1 присваивает регистру ax значение 1. Команда mov ax, word ptr eax – записывает в ax слово, лежащее по адресу eax. Байт по адресу eax записывается в младшую половину ax (в al), а байт по адресу eax+1 записывается в ah (по закону Intel). Но не обязательно, записывая команды, использовать такую сложную адресацию. Например, если у нас есть переменая "y" типа longint, то при помощи следующей команды ей можно присвоить значение 10000: mov y, 10000; Можно также записать mov dword ptr y, 10000, показывая, что "y" – 32-разрядная переменная. Если записать mov dword ptr [y+10], 5000, то, начиная с адреса [y+10] в память будет записано 32-битное число 5000. Можете не бояться писать подобные вещи (прибавление константы к адресу), так как все эти выражения вычисляются на стадии компиляции и на скорость программы не влияют. Пусть, например, "y" находится по адресу 34567. Если мы запишем [y+10], то компилятор просто поймёт это как [32577], так как он знает адрес переменной "y". Операнды команды mov могут быть как регистрами, так и переменными, но одновременно оба операнда не могут быть переменными

2) xchg операнд1, операнд2 – обменивает операнды. Например, если al=45, ah=37, то после выполнения xchg al, ah будет al=37, ah=45

3) add приёмник, источник – выполняет сложение приёмника и источника, результат заносится в приёмник. Источник не изменяется. Но зато меняются флаги

4) adc приёмник, источник – выполняет сложение приёмника, источника и флага CF. Обычно эта команда используется для сложения чисел повышенной точности. Пусть, например, у нас имеются два 64-битных числа: первое в edx:eax (младшее двойное слово в eax, старшее двойное слово в edx), второе – в ebx:ecx. Тогда после выполнения команд: add eax, ecx; adc edx, ebx; в паре регистров edx:eax будет находиться сумма этих 64-битных чисел. Когда были 16-разрядные процессоры, подобным образом складывали 32-битные числа (считая, что каждое состоит из двух 16-битных). Сейчас это не имеет смысла. Более того, процессору всё равно, какие числа складывать – 16-разрядные, или 32-разрядные. Скорость одинаковая. Поэтому сложение 32-битных чисел напрямую быстрее, чем с разбиением и сложением 16-битных (в 2 раза). Но иногда это может понадобиться (например, Турбо-Паскаль не понимает 32-битные регистры). Если в Турбо-Паскале вы заведёте переменную типа longint, то он будет таким тупым образом выполнять над ней операции. Этим и объясняется, что 16-битные программы медленнее, чем 32-битные

5) sub приёмник, источник – вычитает источник из приёмника, результат заносит в приёмник

6) sbb приёмник, источник – вычитает из приёмника значение источника, затем вычитает значение CF. Её можно использовать для вычитания 64-битных слов

7) inc приёмник – то же самое, что и add приёмник, 1

8) dec приёмник – то же самое, что и sub приёмник, 1

9) cmp операнд1, операнд2 – по сути вычитание операнда2 из операнда1, только операнды не меняется (команда меняет только флаги). С помощью этой команды обычно выполняются условные переходы (самый очевидный способ)

10) and|or приёмник, источник – выполняет логическое побитовое И|ИЛИ над приёмником и источником, и помещает результат в приёмник. Часто используется для выборочного обнуления|объединичивания отдельных битов. Например, команда and al, 00001111b обнулит старшие 4 бита регистра al, а младшие не изменит

11) xor приёмник, источник – логическое исключающее ИЛИ. Выполняет побитое логическое исключающее ИЛИ над приёмником и источником, результат заносится в приёмник. Часто используется для обнуления регистров. Например, xor ax, ax обнуляет регистр ax, и делает это быстрее, чем mov ax, 0. Этой командой следует пользоваться для обнуления регистров. Можете не бояться экзотичности этой команды. Она будет эффективно работать на любом Intel-совместимом компьютере. Эта команда официально поддерживается
Intel как каманда обнуления регистра

12) test операнд1, операнд2 – по сути выполняет команду and над операндами, но операнды не меняет, а меняет только флаги аналогично and

13) not приёмник – каждый бит приёмника, равный нулю, устанавливается в 1, и каждый бит, равный 1, устанавливается в 0. Флаги не меняются

Следующая страница (основные команды процессора)