- •Содержание
- •Введение
- •Архитектура микропроцессоров Intel 8086
- •Общие принципы работы мп 8086 при выполнении прикладных программ
- •Регистры
- •Адресация
- •Непосредственная адресация
- •Прямая адресация
- •Регистровая адресация
- •Косвенная регистровая адресация
- •Адресация no базе
- •Индексная адресация
- •Индексная адресация со смещением
- •Система команд
- •Команды пересылки данных
- •Арифметические команды
- •Битовые команды
- •Строковые команды
- •Команды передачи управления
- •Команды перехода
- •Условные
- •Безусловные
- •Команды условного перехода
- •Команды управления циклом
- •Тело цикла
- •Команды прерываний
- •Структура программы на языке ассемблера
- •Основные понятия языка ассемблера
- •Написание сегмента данных
- •Написание сегмента стека
- •Написание сегмента кода
- •Написание головной подпрограммы
- •Подготовка программ к выполнению
- •Отладка программ в Turbo Debugger
- •Специфика встроенного ассемблера
- •Оператор asm
- •Синтаксис ассемблерных команд
- •Коды инструкций
- •Операнды
- •Константы
- •Выражения
- •Операции
- •Бинарная операция -
- •Побитовые операции not, and, or, xor
- •Директивы ассемблера
-
Синтаксис ассемблерных команд
Здесь и далее ассемблерными командами называются команды на языке встроенного ассемблера, вставляемые в тело ассемблерного оператора asm... end. Структура ассемблерной команды такова:
[Метка] [Префикс] [Код [Операнд [,Операнд]]]
В квадратных скобках указываются необязательные элементы структуры.
Метки
Любой команде ассемблерного оператора может предшествовать одна или сколько меток. В ассемблере используется два типа меток: глобальные и локальные. Глобальные метки - это обычные метки Турбо Паскаля. Они объявляются в разделе описаний после зарезервированного слова Label. С помощью глобальной метки мо передать управление в тело ассемблерного оператора оператором GOTO. Например:
Label
AltEnt;
Begin
.....
Goto
AltEnd;
.
. . . .
asm
.
. . .
AltEnd:
……
end;
{Сюда можно передать управление извне}
Локальные метки объявляются непосредственно в теле ассемблерного оператора. Эти метки обязаны начинаться символом «@». Поскольку этот символ нельзя использовать в именах Турбо Паскаля, он позволяет отличить локальную метку от глобальной. Локальная метка не известна нигде вне ассемблерного оператора, поэтому на нее нельзя передать управление оператором GOTO. По этой же причине в разных ассемблерных операторах можно использовать одноименные локальные метки.
Коды инструкций
Встроенный ассемблер поддерживает мнемонику всех команд, перечисленных выше. Кроме того, в ассемблерных командах может использоваться мнемоника конструкций процессора 8087, а также команды процессоров 80286/80287. Инструкции 8087 допустимы только при активном состоянии {$N+}, 80286 - при {$G+}; а 80287 - в случае {$G+,N+}.
Операнды
Операндами встроенного ассемблера могут быть выражения, состоящие из комбинации регистров, констант, имен и символов операций.
Константы
Ассемблер поддерживает строковые и числовые константы.
Строковые константы заключаются в апострофы или кавычки. Если константа объявлена с помощью кавычек, внутри нее символ апостроф рассматривается наравне с другими символами, т.е. не считается ограничителем константы, точно так же внутри константы, обрамленной апострофами, не считается ограничителем символ кавычки. Если внутри константы необходимо указать ограничивающий ее символ, он удваивается. Примеры:
'Строковая константа'
"Это - тоже строковая константа"
'Символ '' не считается ограничителем'
'внутри строки, обрамленной кавычками "..."'
Числовые константы могут быть только целыми и их значение не может превосходить емкости двойного слова, т.е. должно быть внутри диапазона
- 2 147 483 648 ... +4 294 967 295.
По умолчанию при записи числовых констант используется десятичная нотация, но ассемблер поддерживает также двоичные, восьмеричные и шестнадцатеричные константы. Двоичная константа составляется как комбинация единиц и нулей, заканчивающаяся символом В (от Binary - двоичный); при записи восьмеричной константы используются символы 0...7, а в ее конце ставится символ О (Octal - восьмеричный); шестнадцатеричная константа записывается по правилам Турбо Паскаля (начинается с символа #) либо по правилам Турбо Ассемблера: начинается с цифры, в конце ставится символ H (от Hexadecimal - шестнадцатеричный).
Имена
Локальные метки - это единственные имена, которые разрешается определять внутри ассемблерного оператора. Имена остальных объектов программы – констант, переменных, подпрограмм - должны определяться только с помощью средств Турбо Паскаля.
Область определения имен подчиняется тем же правилам, что и в Турбо Паскале - имена должны быть «видны» в том месте, где они используются, и они локализуются в пределах блока, в котором описаны.
Во встроенном ассемблере могут использоваться три предопределенных имени:
@@Code - текущий сегмент кода
@Data - начальный сегмент данных
@Result - ссылка внутри функции на ее результат
Имена @Code и @Data могут использоваться только в сочетании с директивой SEG для ссылки на нужный сегмент. Например:
asm
mov ax, SEG @Data
mov ds,ax
end;
Имя ©Result используется для присвоения результата функции. Например:
Function Min(X,У: Integer): Integer; {Эта функция сравнивает два целых числа и возвращает наименьшее из них}
begin
asm
{Помещаем
X
в АХ}
{X<Y
?}
{Да
- на выход}
{Нет
- помещаем У
в АХ}
{АХ
содержит результат}
cmp ax,Y
jl @
mov ах,У
@: mov @Result,ax
end
end;