Учебник по Pascal

Меню

 
Главная
Assembler
Turbo Pascal
C++ Builder
Delphi
Java
Скачать


Статистика

 

   


Реклама

 

 

 

 

Система команд

В приводимых ниже таблицах указывается мнемоника всех допустимых инструкций для МП 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