A) Команды пересылки данных и загрузки адресов.
B) Арифметические команды и команды сравнения.
C) Логические команды.
D) Команды сдвига.
E) Команды работы со стеком.
F) Прочие команды.
Во всех нижеследующих обозначениях команд R обозначает регистр, М – ссылку на память (операнд с прямой адресацией), Im – непосредственный операнд, Ор1 и Ор2 – первый и второй операнды в команде.
Пересылка (Move) информации в направлении от второго операнда к первому. Допустимы следующие сочетания операндов:
MOV R, R
MOV R, M
MOV R, Im
MOV M, R
MOV M, Im
Примеры:
MOV AX, BX
; Директива определения переменной в памяти
MOV CX, 5
MOV DX, Data
……………
Data DW 50
Видно, что пересылки типа "память-память" недопустимы. Это особенность команды MOV для всех микропроцессоров фирмы Intel.
Пример:
Stroka DB 'test'
; Директива определения цепочки байтов в памяти
LEA DX, Stroka
; Загрузить начальный адрес цепочки байтов в регистр
Сложение двух операндов с записью результата (суммы) на место первого операнда (который при этом теряется). Команда влияет на флаги CF, ZF, PF, AF, SF, OF. Допустимы следующие сочетания операндов:
ADD R, R
ADD R, M
ADD R, Im
Пример:
MOV AX, 10
; В регистре АХ – сумма (10+20)
MOV BX, 20
ADD AX, BX
Вычитание второго операнда из первого. Результат (разность) размещается на месте первого операнда (иными словами, Ор1 Ор1-Ор2). Допустимые сочетания операндов и влияние на флаги – то же, что и в команде ADD.
Пример:
SUB AX, 15
Команда умножения. Манипулирует либо со словами, либо с байтами. В байтовом варианте команды множимое размещается в регистре AL, множитель задается операндом Ор. Результат (произведение) образуется в регистре АХ. В варианте работы со словами множимое располагается в АХ, множитель задается в помощью Ор, результат образуется как двойное слово в регистрах DX и AX. Допустимые операнды:
MUL R
MUL M
Влияние на флаги: OF=CF=1, если старшая половина произведения, находящаяся в регистрах AH или DX, отличается от нулевой (то есть разрядность результата превысила разрядность операндов). Состояния остальных флагов не определены.
Пример:
MOV AL, 3
; множимое
MOV BL, 5
; множитель
MUL BL
; производим умножение
OUT 0, AX
; результат выводим на индикатор в порту 0
HLT
В результате запуска этой программы мы увидим на индикаторе порта 0 число 15.
Команда деления. Как и предыдущая команда, может работать со словами или байтами:
Разрядность операнда | Делимое | Делитель | Частное | Остаток |
8 бит | AH…AL | Op | AL | AH |
16 бит | DX…AX | Op | AX | DX |
Допустимые операнды:
DIV R
DIV M
Состояния всех флагов не определены (произвольны). Если делитель равен нулю, то попытка выполнить команду приведет к возникновению прерывания номер 0.
INC R
Увеличить содержимое регистра на единицу.
DEC R
Уменьшить содержимое регистра на единицу.
Обе команды влияют на флаги ZF, PF, AF, SF, OF.
Команда сравнения. Выполняет, как и команда SUB, вычитание Op1-Op2, но результат вычитания фиксируется лишь в одном из внутренних регистров АЛУ; оба операнда команды СМР не изменяются. Результат действия команды проявляется в том, что она так же влияет на флаги, как и команда SUB. Допустимые сочетания операндов:
CMP R, R
CMP R, M
CMP R, Im
CMP M, R
CMP M, Im
AND Op1, Op2 – поразрядное логическое И
OR Op1, Op2 – поразрядное логическое ИЛИ
XOR Op1, Op2 – поразрядное логическое ИСКЛЮЧАЮЩЕЕ ИЛИ
Допустимые сочетания операндов:
-- R, R
-- R, M
-- R, Im
NOT Ор – поразрядное логическое отрицание (функция НЕ).
В учебной модели микропроцессора i486 здесь разрешается использовать только регистровую адресацию.
Все логические команды действуют на флаги SF, ZF, PF и, кроме того, сбрасывают в ноль флаги CF и OF.
SHR R, Im – арифметический сдвиг содержимого регистра вправо
SHL R, Im – арифметический сдвиг содержимого регистра влево
Количество сдвигов задается вторым операндом. Двоичный разряд, выдвигаемый за пределы слова (байта), заносится во флаг CF (и далее может быть использовано командами перехода типа JC или JNC).
Примеры:
SHL AX, 1
SHR BX, 2
Первая из этих команд записывает в стек (см. п. 2.2) содержимое указанного регистра; значение в указателе стека SP при этом уменьшается на два (стек растет в сторону младших адресов). Вторая команда извлекает операнд из стека и записывает его в указанный регистр; значение в указателе стека увеличивается на два. Отметим, что стек работает только со словами; записать туда или прочитать из стека один байт нельзя. Эти команды особенно часто применяются для того, чтобы временно сохранить значение какого-либо регистра (перед тем, как его изменить), а затем вновь восстановить.
Команда вывода содержимого регистра в порт. Номер порта (Im) указывается либо константой, либо с помощью регистра DX (этот последний способ в учебной модели МП i486 не реализован).
Примеры:
OUT 0, AX
OUT 1, CX
Существует также команда ввода данных из порта (IN port, R), в данном лабораторном практикуме не рассматриваемая.
LOOP LABEL (LABEL – это обозначение метки)
Очень важная в практическом программировании команда, реализующая цикл со счетчиком в регистре СХ. Работает она следующим образом: сначала содержимое СХ уменьшается на единицу, затем, если СХ не равен нулю, выполняется переход на метку. Далее цикл повторяется.
Пример:
MOV CX, 3
; Начальное значение
M1:
; Метка
MOV AX, CX
; Для вывода в порт нужен именно регистр АХ
OUT 0, AX
; Вывод (последовательно) числовых констант 3, 2, 1 в порт номер 0
LOOP M1
; Команда цикла
HLT
; Останов
Другой способ организовать различные циклы заключается в использовании команд условных переходов, не реализованных в учебной модели, но выполняемых реальным микропроцессором.
HLT – команда останова (прекращения работы).
Здесь эта команда используется лишь при работе с учебной программной моделью микропроцессора. Программа, написанная для реального компьютера, обычно завершается не командой HLT, а той или иной командой передачи управления операционной системе.
Назад | Содержание | Вперёд |