Курс лекций для студентов заочного факультета самара
Вид материала | Курс лекций |
Содержание3.Директивы и операторы ассемблера 3.1.Структура программы |
- Курс лекций для студентов заочного и очно-заочного образования рпк «Политехник», 941.31kb.
- Курс лекций для студентов очного и заочного отделения специальностей 1-25 01 10 коммерческая, 830.45kb.
- Курс лекций для студентов заочного обучения Бурмистрова Л. А., Финансы предприятий:, 1991.45kb.
- Методические указания для студентов 1 курса заочного отделения исторического факультета, 244.82kb.
- В. С. Юрчук философия права курс лекций, 1556.93kb.
- Планы семинарских занятий на 2011-2012 учебный год (6 часов) по предмету «Экономическая, 205.43kb.
- Курс лекций Санкт-Петербург 2007 удк 342. 9 Ббк 67. 401 Б83 Рецензенты, 6052.89kb.
- Тексты лекций для студентов заочной формы обучения всех специальностей москва 2001, 2466.08kb.
- Краткий конспект лекций по дисциплине «Основы лесоводства и лесной таксации» Для студентов, 923.35kb.
- Лекций для студентов 4 курса педиатрического факультета, переведенных на контролируемую, 18.72kb.
3.ДИРЕКТИВЫ И ОПЕРАТОРЫ АССЕМБЛЕРА
Каждая программа на языке ассемблера помимо команд процессора содержит еще и специальные инструкции, указывающие самому ассемблеру, как организовать специальные секции программы, где располагаются данные, а где команды, позволяющие выбирать тип системы команд, налаживать связи между процедурами и так далее. Разные ассемблеры используют разные наборы директив, но TASM и MASM (два самых популярных ассемблера для DOS и Windows) поддерживают общий набор директив. Все дальнейшие примеры директив приведены для этих ассемблеров (точнее, TASM поддерживает набор директив MASM наряду с собственным набором директив Ideal Mode).
3.1.Структура программы
Программа на языке ассемблера состоит из строк, имеющих следующий вид:
Метка команда/директива операнды; комментарий.
Все поля необязательны. Метка может быть любой комбинацией букв английского алфавита, цифр и символов: _, $, @, ?, но цифра не может быть первым символом метки, а символы $ и ? иногда имеют специальное значение и не рекомендуются к использованию.
Большие и маленькие буква по умолчанию не распознаются, но различие можно включить при помощи опций при вызове ассемблера. Во втором поле, поле команды, может располагаться команда процессора, которая транслируется в исполняемый код, или директива ассемблера, которая не приводит к генерации кода, а управляет работой самого ассемблера. В поле операндов располагаются требуемые командой или директивой операнды. В поле комментария, начало которого отмечается символом ; (точка с запятой), можно написать все что угодно.
Если метка располагается перед командой процессора, сразу после нее всегда ставится оператор : (двоеточие), который указывает ассемблеру, что надо создать переменную с этим именем, содержащую адрес текущей команды:
mov cx, 10; занести в cx число элементов массива mas
xor si, si; обнулить индексный регистр si
xor ax, ax; обнулить регистр ax, в котором будет сумма элементов массива слов mas
m1: add ax, mas[si]; сложить содержимое ax и очередной элемент массива
inc si; увеличить индекс элемента массива на 2,
inc si; так как элемент массива - слово
loop m1; вернуться на начало цикла, если cx>0.
Если метка стоит перед директивой ассемблера, то двоеточие не ставится, так как метка в этом случае является операндом директивы. Рассмотрим директивы, работающие напрямую с метками и их значениями, - LABEL, EQU и =.
метка LABEL тип.
Директива LABEL определяет метку и задает ее тип: BYTE (байт), WORD (слово), DWORD (двойное слово), FWORD (6 байт), QWORD (учетверенное слово), TBYTE (10 байт), NEAR (ближняя метка), FAR (дальняя метка). Метка получает значение, равное следующим за ней данным (для всех типов, кроме двух последних) или равное адресу следующей команды (для типов NEAR и FAR). С помощью директивы LABEL удобно организовывать доступ к одним и тем же данным, как к байтам, так и словам, определив перед ними две метки с разными типами. Метки типа NEAR или FAR можно использовать для вызова процедуры:
call метка.
Директива EQU присваивает метке значение, которое определяется как результат целочисленного выражения в правой части. Результатом этого выражения может быть целое число, адрес или любая строка символов:
one equ 1
mes1 equ ‘Ошибка $’
var2 equ 4[si]
cmp ax, one ; cmp ax, 1
db mes1 ; db ‘Ошибка $’
mov ax, var2 ; mov ax, 4[si].
Директива EQU используется для введения параметров, общих для всей программы.
Директива = эквивалентна EQU, но определяемая ею метка может принимать только целочисленные значения, кроме того, указанная этой директивой метка может быть переопределена. Существует предопределенная метка $, которая соответствует текущему адресу. Данную метку удобно использовать для определения длины строки текста или числа элементов в массиве:
.data
path1 db ‘D:\students\641\*.*’
length equ $ - path1; метка length будет иметь значение, равное числу символов в переменной path1.
Псевдокоманды определения данных
Псевдокоманда – это директива ассемблера, которая приводит к включению данных или кода в программу, хотя никакой команде процессора не соответствует. Псевдокоманды определения переменных указывают ассемблеру, что соответствующем месте программы располагается переменная, устанавливают ее тип (байт, слово, вещественное число и так далее) , задают начальное значение и ставят в соответствие переменной метку, которая будет использоваться для обращения к этим данным. Псевдокоманды определения данных записываются в общем виде следующим образом:
имя_переменной d* значение,
где d* - одна из псевдокоманд:
DB – определить байт;
DW – определить слово (2 байта);
DD – определить двойное слово (4 байта);
DF – определить 6 байт (адрес в формате 16-битный селектор; 32-битное смещение);
DQ – определить учетверенное слово (8 байта);
DT – определить 10 байт (80 –битные типы данных, используемые FPU).
Пример использования псевдокоманд определения переменных:
txt_str db ‘Hello, world!’
number dw ?
table db 10 dup(0)
float_n dd 3.1415.
Первая строка содержит 13 байт ASCII- кодов строки символов Hello, world! и переменная txt_str указывает на первую букву в этой строке. Во второй строке знак ? указывает на то, что переменная является неинициализированной и ее значение на момент запуска может оказаться любым. Для заполнения участка памяти повторяющимися данными используется оператор DUP, имеющий формат счетчик dup(значение). В третьей строке примера создается массив из 10 слов, инициализированных нулевым значением. Переменная table указывает на первый элемент массива. В качестве аргумента в операторе DUP могут выступать несколько значений, разделенных запятыми, и даже дополнительные вложенные операторы DUP.