- •Содержание
- •Введение
- •Архитектура микропроцессоров Intel 8086
- •Общие принципы работы мп 8086 при выполнении прикладных программ
- •Регистры
- •Адресация
- •Непосредственная адресация
- •Прямая адресация
- •Регистровая адресация
- •Косвенная регистровая адресация
- •Адресация no базе
- •Индексная адресация
- •Индексная адресация со смещением
- •Система команд
- •Команды пересылки данных
- •Арифметические команды
- •Битовые команды
- •Строковые команды
- •Команды передачи управления
- •Команды перехода
- •Условные
- •Безусловные
- •Команды условного перехода
- •Команды управления циклом
- •Тело цикла
- •Команды прерываний
- •Структура программы на языке ассемблера
- •Основные понятия языка ассемблера
- •Написание сегмента данных
- •Написание сегмента стека
- •Написание сегмента кода
- •Написание головной подпрограммы
- •Подготовка программ к выполнению
- •Отладка программ в Turbo Debugger
- •Специфика встроенного ассемблера
- •Оператор asm
- •Синтаксис ассемблерных команд
- •Коды инструкций
- •Операнды
- •Константы
- •Выражения
- •Операции
- •Бинарная операция -
- •Побитовые операции not, and, or, xor
- •Директивы ассемблера
-
Арифметические команды
Мнемоника |
Формат |
Комментарии |
|
Команды сложения |
|
ADD |
ADD приемник, источник |
Сложить |
ADC |
ADC приемник, источник |
Сложить, добавить перенос |
INC |
INC приемник |
Увеличить на единицу |
Команды вычитания |
||
SUB |
SUB приемник, источник |
Вычесть |
SBB |
SBB приемник, источник |
Вычесть с заемом |
DEC |
DEC приемник |
Уменьшить на единицу |
NEG |
NEG приемник |
Обратить знак |
СМР |
СМР приемник, источник |
Сравнить |
Команды умножения |
||
MUL |
MUL источник |
Умножить без знака |
IMUL |
IMUL источник |
Умножить со знаком |
Команды деления |
||
DIV |
DIV источник |
Делить без знака |
IDIV |
IDIV источник |
Делить со знаком |
Команды расширения знака |
||
CBW |
CBW |
Преобразовать байт в слово |
CWD |
CWD |
Преобразовать слово в двойное слово |
При использовании арифметических команд следует помнить о том, что МП может обрабатывать знаковые числа, числа без знака, а также двоично-десятичные числа. В беззнаковых числах для представления значения используются все биты, т.е. они эквивалентны типам Byte и Word, в то время как знаковые числа в старшем разряде хранят знак числа и эквивалентны типам Shortint и Integer.
-
Битовые команды
Мнемоника |
Формат |
Комментарий |
Логические команды |
||
AND |
AND приемник, источник |
Выполнить AND - |
OR |
OR приемник, источник |
Выполнить OR - |
XOR |
XOR приемник, источник |
Выполнить XOR ~~— |
NOT |
NOT приемник |
Выполнить NOT — |
Сдвиговые команды |
||
SAL/SHL |
SAL приемник, счетчик |
Сдвинуть влево |
SAR/SHR |
SAR приемник, счетчик |
Сдвинуть вправо |
Битовые команды используются при исчислении логических выражений, а также в тех случаях, когда необходимо изменить отдельные разряды операнда.
-
Строковые команды
Мнемоника |
Формат |
Комментарий |
Пересылка строк |
||
M0VSB |
MOVS |
Пересылать байты |
MOVSW |
MOVSW |
Пересылать слова |
Сравнение строк |
||
CMPSB |
CMPSB |
Сравнивать байты |
CMFSW |
CMPSW |
Сравнивать слова |
Сканирование |
||
SCASB |
SCASB |
Искать байт |
SCASW |
SCASW |
Искать слово |
Загрузка и сохранение |
||
LODSB |
LODSB |
Загружать байты |
LODSW |
LODSW |
Загружать слова |
ST0SB |
STOSB |
Сохранять байты |
STOSW |
STOSW |
Сохранять слова |
Строковые команды рассчитаны на обработку строк. Термин «строка» отнюдь не эквивалентен аналогичному термину Турбо Паскаля и означает произвольную цепочку байт или слов длиной до 64 Кбайт. Эти команды оперируют пятью примитивами, каждый из которых обрабатывает лишь один байт или одно слово за раз. Перед примитивом обычно указывается префикс повторения REP/REPE/REPNE, заставляющий выполняться примитив до тех пор, пока не обнулится счетчик повторений СХ или не будет нарушено соответствующее условие.
При использовании строковых команд важно помнить два обстоятельства.
Во-первых, эти команды всегда берут адрес строки-источника из пары DS:SI, а строки-приемника - из пары ES:DI. Таким образом, перед исполнением строковой команды необходимо инициировать сегментные регистры нужным образом.
Во-вторых, строковые команды используют индексную адресацию с автоматическим изменением смещения в SI/DI после однократного исполнения примитива. Содержимое этих регистров изменяется на 1 при обработке байтов и на 2 при обработке слов, причем наращивается, если флаг направления DF сброшен, и уменьшается, если он равен 1.
Вот как можно осуществить пересылку массива А в массив В:
var
А,В: array [1..250] of Integer;
asm
lea
si, A
push
ds
pop
es
lea
di,B
mov
сx,250
сld
rep
movsw
end;
{Смещение А - в SI (источник))
{Инициируем ES := DS}
(Смещение В - в DI (приемник)}
{Счетчик переноса)
{Направление переноса - наращивать)
{Переносим 500 байт)
В программе на Турбо Паскале регистр DS всегда содержит сегмент данных, поэтому инициировать его необязательно. Что касается регистра дополнительного сегмента ES, такого правила нет, и хотя в большинстве случаев он также ссылается на сегмент данных, рекомендуется проводить его инициацию перед использованием строковой команды (см. выше команды push ds, pop es).