Система команд
В приводимых ниже таблицах указывается мнемоника всех допустимых инструкций для МП 8086/8088. Для удобства пользования все команды разбиты на 6 функциональных групп - пересылки данных, арифметические, битовые, строковые, передачи управления, прерываний. Внутри каждой группы команды объединяются в подгруппы по общим дополнительным признакам. Детальный анализ всех команд МП 8086/8088 занял бы слишком много места, поэтому в идущих за таблицами пояснениях рассматриваются лишь наиболее популярные команды. Исчерпывающее описание всех команд Вы найдете в [1], [20]. Команды пересылки данных Мнемоника | Формат | Пояснение | Команды общего назначения | MOV | MOV приемник, источник | Переслать значение | PUSH | PUSH источник | Поместить в стек | POP | POP приемник | Извлечь из стека | XCHG | XCHG приемник, источник | Обменять значения | XLAT | XLAT таблица | Загрузить в AL байт из таблицы | Команды ввода-вывода | IN | IN аккумулятор, порт | Читать из порта | OUT | OUT порт, аккумулятор | Записать в порт | Команды пересылки адреса | LEA | LEA регистр 16, память 16 | Загрузить исполнительный адрес | LDS | LDS регистр 16, память32 | Загрузить в DS:регистр16 полный адрес | LES | LES регистр 16, память32 | Загрузить в ES:регистр16 полный адрес | Команды пересылки флагов | LAHF | LAHF | Загрузить флаги в АН | SAHF | SAHF | Установить флаги из АН | PUSHF | PUSHF | Поместить флаги в стек | POPF | POPF | Извлечь флаги из стека |
Одна из наиболее часто используемых команд - МОV позволяет в защищенном режиме переслать байт или слово из регистра в регистр, из памяти в регистр или из регистра в память. Тип пересылаемых данных (байт или слово) определяется регистром, участвующим в пересылке. Ниже приводятся примеры использования команды: mov ах,Table {Пересылка слова из памяти в АХ} mov Table,ah {Пересылка байта из АН в память} mov ds,ax {Пересылка в сегмент данных} mov es:[bx],ax {Пересылка слова в память: базовая адресация с заменой сегмента} mov ch,-17 {Переслать константу в регистр} mov Table,$FF {Переслать константу в память} С помощью MOV нельзя пересылать: - из памяти в память, например, вместо
mov Mem1,Mem2 следует использовать mov ax,Mem2 mov Mem1,ax - константу или переменную в DS, например, нельзя
mov DS,Data_Seg нужно: mov ax,Data_Seg mov ds,ax - один сегментный регистр в другой, например, нельзя
mov es, ds но можно mov ax,ds mov es,ax - в регистр CS; значение этого регистра (сегмента кода) автоматически меняется при выполнении дальних команд CALL и JMP; кроме того, он загружается из стека при выполнении команды RETF (выход из дальней процедуры).
Для временного сохранения регистров и данных, а также для обмена значениями между регистрами широко используются стековые команды PUSH и POP. Каждая из них работает со словом, т.е. в стек нельзя поместить или извлечь из него одиночный байт. При выполнении PUSH вначале уменьшается на 2 содержимое указателя SP, а затем операнд помещается по адресу SS: SP. При извлечении из стека сначала читается память по адресу SS: SP, а затем SP увеличивается на 2. Таким образом, при заполнении указатель вершины стека SP смещается к младшим адресам, а при освобождении -к старшим. При работе со стеком следует помнить о специфике использования стековой памяти («последним пришел - первым ушел»), а также о том, что эта память интенсивно используется при вызове процедур, т.е. состояние стека к моменту выхода из процедуры должно быть строго согласовано с дальнейшей работой программы. Первое условие определяет порядок извлечения данных из стека - он должен быть обратным порядку, в котором эти данные помещались в стек. Второе условие фактически означает, что после выхода из процедуры указатель SP должен содержать то же смещение, что и к моменту входа в нее. Иными словами, процедура не должна «забыть» в стеке лишнее слово или взять из него больше нужного. Команда загрузки адреса LEA загружает в регистр адрес (смещение) нужного участка памяти. Этого же можно достичь с помощью зарезервированного слова OFFSET, стоящего перед именем переменной. Например: var X: Word; .......... asm mov ax, OFFSET X {Загружаем смещение X в АХ} lea ax,X {To же действие} end ; Разница состоит в том, что в случае команды LEA разрешается использовать индексную адресацию, что особенно удобно при пересылке массивов данных. Две другие команды адресной загрузки - LDS и LES загружают первое 16-разрядное слово из источника в регистр-приемник, а затем следующее слово - в регистр DS или ES, т.е. они рассчитаны на загрузку полного адреса операнда (сегмента и смещения). Арифметические команды Мнемоника | Формат | Комментарий | Команды сложения | ADD | ADD приемник, источник | Сложить | ADC | ADC приемник, источник | Сложить, добавить перенос | ААА | ААА | Скорректировать сложение для таблицы ASCII | DAA | DAA | Скорректировать сложение для двоично-десятичных чисел | INC | INC приемник | Увеличить на единицу | Команды вычитания | SUB | SUB приемник, источник | Вычесть | SBB | SBB приемник, источник | Вычесть с заемом | AAS | AAS | Скорректировать вычитание для таблицы ASCII | DAS | DAS | Скорректировать вычитание для двоично-десятичных чисел | DEC | DEC приемник | Уменьшить на единицу | NEG | NEG приемник | Обратить знак | СМР | СМР приемник, источник | Сравнить | Команды умножения | MUL | MUL источник | Умножить без знака | IMUL | IMUL источник | Умножить со знаком | AАМ | ААМ | Скорректировать умножение для таблицы ASCII | Команды деления | DIV | DIV источник | Делить без знака | IDIV | IDIV источник | Делить со знаком | AAD | AAD | Скорректировать деление для таблицы ASCII | Команды расширения знака | CBW | CBW | Преобразовать байт в слово | CWD | CWD | Преобразовать слово в двойное слово |
При использовании арифметических команд следует помнить о том, что МП может обрабатывать знаковые числа, числа без знака, а также двоично-десятичные числа. В беззнаковых числах для представления значения используются все биты. т.е. они эквивалентны типам Byte и Word, в то время как знаковые числа в старшем разряде хранят знак числа и эквивалентны типам Shortlnt и Integer. Двоично-десятичные числа используют по 4 бита для каждого десятичного разряда и могут быть упакованными или неупакованными. В первом случае один байт хранит 2 десятичные цифры (старшая - в старшем полубайте), во втором - только одну (старший полубайт не используется). Основные арифметические команды МП (ADD, SUB, MUL, DIV) не учитывают двоично-десятичную форму представления чисел, поэтому в архитектуру МП включены команды коррекции результата. Битовые команды Мнемоника | Формат | Комментарий | Логические команды | AND | AND приемник, источник | Выполнить AND | OR | OR приемник, источник | Выполнить OR | XOR | XOR приемник, источник | Выполнить XOR | NOT | NOT приемник | Выполнить NOT | TEST | TEST приемник, источник | Проверить | Сдвиговые команды | SAL/SHL | SAL приемник, счетчик | Сдвинуть влево | SAR/SHR | SAR приемник, счетчик | Сдвинуть вправо | ROL | ROL приемник, счетчик | Сдвинуть влево циклически | ROR | ROR приемник, счетчик | Сдвинуть вправо циклически | RCL | RCL приемник, счетчик | Сдвинуть влево с переносом | RCR | RCR приемник, счетчик | Сдвинуть вправо с переносом |
Битовые команды используются при исчислении логических выражений, а также в тех случаях, когда необходимо изменить отдельные разряды операнда. Логические команды AND, OR, XOR и NOT эквивалентны соответствующим операциям Турбо Паскаля в случае, когда операндами являются целочисленные выражения. Команда TEST выполняет целочисленную операцию поразрядного суммирования AND, но не изменяет значения операндов, а лишь устанавливает флаги в соответствии со значением результата сравнения: обнуляет CF и OF, изменяет PF, ZF, SF и не меняетAF (флаг ZF установится в 1 в том случае, когда оба операнда содержат по единице хотя бы в одном соответствующем разряде). Команды сдвига SHL/SHR эквивалентны одноименным операциям Турбо Паскаля и отличаются от команд циклического сдвига ROLIROR тем, что вытесненные в ходе их выполнения значащие разряды теряются, в то время как при циклическом сдвиге эти разряды появляются «с другой стороны». Например, если выполнить фрагмент mov al,1 {Загружаем в AL единицу} shr al,1 {Сдвигаем вправо ,на 1 разряд} регистр AL будет содержать 0 (вытесненная вправо единица будет помещена в CF), в то время как после замены команды SHR на ROR в нем будет значение $80=128 (вытесненная единица будет помещена в старший бит регистра). Заметим, что счетчиком в командах сдвига может быть цифра 1 или количество сдвигов, указываемое в регистре CL. Команды передачи управления Мнемоника | Формат | Комментарий | Безусловные переходы | CALL | CALL имя | Войти в процедуру | RET | RET [количество параметров] | Вернуться из процедуры | JUMP | JUMP имя | Перейти | Условные переходы | JA/JNBE |
|