Ассемблер Команды процессора
По своим функциям все команды процессоров семейства x86 делятся на шесть категорий:
команды передачи данных;
арифметические команды;
логические команды;
команды управления потоком;
команды управления процессором;
команды для работы со строками.
Команды передачи данных
Группа команд передачи данных представлена в табл. 6.1. Эта группа делится на четыре части.
Таблица 6.1. Команды передачи данных.
Мнемокод / Операнды |
Описание |
Основные команды | |
mov назначение, источник |
переслать байт или слово |
pop назначение |
извлечение слова из стека |
push источник |
занесение слова в стек |
xchg назначение, источник |
перестановка байтов и слов |
xlat/xlatb |
перекодировка таблицы |
Команды ввода / вывода | |
in аккумулятор, порт |
ввод байта или слова из порта |
out порт, аккумулятор |
вывод байта или слова в порт |
Адресные команды | |
lds назначение, источник |
загрузка регистра сегмента данных (ds) |
lea назначение, источник |
загрузка эффективного адреса |
les назначение, источник |
загрузка регистра дополнительного сегмента (es) |
Команды флагов | |
lahf |
загрузка флагов в регистр ah |
popf |
извлечение регистра флагов из стека |
pushf |
занесение регистра флагов в стек |
sahf |
установка флагов из регистра ah |
Основные команды
Команда mov работает следующим образом:
movназначениеисточник.
Операнды «назначение» и «источник» могут быть записаны в разных режимах адресации. Режимом адресации называется способ определения адреса операнда. Рассмотрим режимы адресации данных.
1. Непосредственный. Значение операнда длиной 8 или 16 бит является непосредственной частью команды.
Пример 6.1: mov ax, 10
2. Прямой. Смещение адреса операнда указано прямо в команде.
Пример 6.2: mov i, ax
3. Регистровый. Операнд содержится в указанном командой регистре; 16-битный операнд может находиться в регистрах ax, bx, cx, dx, si, di, sp, bp, а 8-битный - в регистрах al,ah,bl,bh,cl,ch,dl,dh.
Пример 6.3: inc cx
4. Регистровый косвенный. Смещение адреса операнда находится в базовом регистре bx или bp или в индексном регистре si или di.
Пример 6.4: subax, [bx]
5. Регистровый относительный. Смещение адреса операнда определяется как сумма 8- или 16-битного относительного смещения и содержимого базового (bx или bp) или индексного (si или di) регистров.
Пример 6.5: add ax, [bp+2]
6. Базовый индексный. Смещение адреса операнда определяется как сумма содержимого базового (bx или bp) и индексного регистров (si или di).
Пример 6.6: mov ax, [bx+si]
7. Относительный базовый индексный. Смещение адреса операнда определяется как сумма 3-х слагаемых: 8- или 16-битного относительного смещения, содержимого индексного регистра (si или di) и содержимого базового регистра (bx или bp).
Пример 6.7: mov ax, [bx+si+2]
Команды pop иpush, а также другие команды, образованные на их основе (popa,pushfwи т.д.) являются командами пересылки данных между стеком и регистрами.
Стек – это специальный сегмент памяти, который выполняет следующие основные функции:
временно сохраняет значения регистров;
хранит адреса возврата из подпрограмм;
хранит динамические переменные.
Стек организован по принципу LIFO(last-in-first-out) – последним вошел, первым вышел. В регистреssсодержится адрес начала стекового сегмента. Регистрspуказывает на смещение относительно этого начального адреса.
Команда pushпомещает регистр в стек, а команда pop– извлекает. Поэтому правильное управление стеком заключается в том, чтобы на каждую командуpushбыла соответствующая команда pop:
push ax
push bx
push dx
…
pop dx
pop bx
pop ax
Команда xchgпредназначена для двунаправленной пересылки данных.
Пример 6.8:xchg ax, bxменяет значения регистров между собой.
Обмен регистров можно осуществить и через стек, но только в три команды:
push ax
mov ax, bx
pop bx
Пример 6.9:xchg ah, al меняет старшую и младшую часть регистраax.
Такой обмен можно проделать в три команды через третий регистр, который, в отличие от стека, может хранить восьмибитовые значения:
mov bh, ah
mov ah, al
mov al, bh
Команда xlatпредназначена для перекодировки символов по таблице перекодировки.
Пример 6.10: Использование командыxlat
table db 'abcdef'
…
mov al, 3
lea bx, table
xlat ; (al)='c'