
- •Лекция 1. Введение. Системное программное обеспечение. Состав системного программного обеспечения
- •Лекция 2. Принципы функционирования систем программирования
- •Этапы подготовки программы
- •Трансляторы и интерпретаторы – общая схема работы
- •Лекция 4. Назначение и функции компоновщика.
- •Раздельная компиляция
- •Переместимые коды и абсолютные коды
- •Редактирование связей с оверлеями
- •Связывание с динамически подсоединяемыми библиотеками (dll)
- •Лекция 5. Назначение и функции программы загрузчика
- •Виды загрузчиков. Загрузчики типа «компиляция-выполнение».
- •Абсолютный загрузчик
- •Настраивающий загрузчик
- •Непосредственно связывающий загрузчик
- •Динамический загрузчик
- •Программные отладчики и их эксплуатация
- •Лекция 6. Базовые понятия языка.
- •Лекция 7. Базовые понятия языка.
- •Лекция 8. Команды и алгоритмы языка.
- •Лекция 9.1. Сложные структуры данных.
- •Команда loop
- •Лекция 9.2. Сложные структуры данных. Структуры
- •Объединения
- •Лекция 2.4. Организация и использование подпрограмм
- •Передача параметров по значению
- •Передача параметров по ссылке
- •Передача параметров по возвращаемому значению
- •Передача параметров по результату
- •Передача параметров по имени
- •Передача параметров отложенным вычислением
- •Передача параметров в регистрах
- •Передача параметров в глобальных переменных
- •Передача параметров в стеке
- •Передача параметров в потоке кода
- •Передача параметров в блоке параметров
- •Лекция 2.5. Макросредства языка Ассемблер
- •Лекция 2.6. Работа с файлами, каталогами и дисками под управлением ms-dos
- •Лекция 3.1. Структура и программирование контроллера прерываний.
- •Лекция 4.1. Работа с консолью. Организация ввода/вывода информации.
- •Лекция 5.1. Системные средства управления памятью
- •Окружение dos
- •Лекция 6.1. Основы организации резидентных программ
- •7.1. Функции драйвера
- •7.2. Архитектура драйвера
- •Процесс загрузки драйверов
- •7.3 Команды драйвера
Лекция 6. Базовые понятия языка.
Основные понятия
Программировать на машинном языке неудобно и сложно. Ассемблер представляет собой символьную запись машинного языка. Вместо цифровых кодов операций указывают их словесные названия, вместо адресов - имена, а числа можно заносить в десятичной системе. Написанную в таком виде программу передают транслятору, который переводит ее в машинный язык.
Идентификаторы
Идентификаторы - символьные обозначения объектов программы: переменных, меток, названий операций и т.п. И. - последовательность из латинских букв (больших и малых), цифр и знаков ?.@_$. Ограничения на И.
длина может быть любой, но значащие - лишь первые 31 символ,
не должен начинаться с цифры
точка - только первым символом,
одноименные большие и малые буквы - эквивалентны.
Русские буквы не допустимы. Делятся на служебные (зарезервированные - reserved) слова и имена. Первые определены заранее и имеют определенный смысл, например обозначают регистры (ах, cs) названия команд (mov, xor), все остальные И. называются именами и ими можно пользоваться по усмотрению.
Запись целых чисел в ассемблере
Могут быть записаны в десятичной, двоичной, щестнадцатиричной и восьмиричной системах счисления. Десятичные числа записываются как обычно, или с добавлением буквы d. После двоичного числа добавляется b, после щестнадцатиричного - h, а после восьмеричного о или q. Если hex начинается с буквы (цифры, обозначаемой буквой), то перед ним обязательно должен стоять ноль.
Предложения
Программа на ассемблере состоит из предложений, каждое из которых записывается на отдельной строке. Переносить предложение на следующую строку или записывать два предложения на одной строке нельзя. Если более 131 символа, то 132-й и далее - игнорируются. Правила расстановки пробелов:
пробел обязателен между стоящими рядом идентификаторами и/или числами,
внутри идентификаторов и чисел пробелы недопустимы,
там где допустим один пробел, допустимо и несколько пробелов подряд.
Предложения в ассемблере делятся на три группы по смыслу: комментарии, команды, директивы (приказы ассемблеру).
Рассмотрим комментарии. Не отражаются на ходе выполнения программы, игнорируются компилятором и предназначены для людей. Могут быть любые символы. Комментарием считается любая строка, начинающаяся со знака ; или пустая строка. Возможен многострочный комментарий COMMENT <маркер> <текст>. В качестве комментария берется первый за словом COMMENT символ, отличный от пробела COMMENT.
Команды. Это символьная форма записи машинных команд.
[<метка>:] <мнемокод> [<операнды>] [;<комментарий>]
Метка с двоеточием, а также точка с запятой и комментарий могут отсутствовать. Метка синтаксически - имя команды, ее можно использовать в командах перехода на данную команду. Если метка есть то после нее обязательно нужно двоеточие для ссылок, например для перехода на эту команду. Мнемокод (мнемонический код) является обязательной частью команды и указывает ту операцию, которую должна выполнить команда. Записывается в символьной форме. Операнды, если они есть отделяются друг от друга запятыми. Комментарий - после знака ; не влияет на смысл команды, а лишь поясняет ее. Действителен для данной строки.
Регистры указываются своими именами, например:
MOV AX,SI ;оба операнда - регистры
Непосредственные операнды задаются константными выражениями (их значениями являются константы-числа), например:
MOV BH,5 ;5 - непосредственный операнд
MOV DI,SIZE X ;SIZE X (число байтов, занимаемых переменной X) - ;непосредственный операнд
Адреса описываются адресными выражениями (например, именами переменных), которые могут быть модифицированы по одному или двум регистрам; например, в следующих командах первые операнды задают адреса:
MOV X,AH
MOV X[BX][DI],5
MOV [BX],CL
Директивы языка Ассемблер
Помимо машинных команд в программе на ЯА надо указывать и другие вещи. Например, надо сообщать, какие константы и переменные используются в программе и какие имена мы им дали. Это делается с помощью предложений, называемых приказами ассемблеру или директивами.
Синтаксис директив следующий:
[<имя>] <название директивы> [<операнды>] [< ; комментарий>]
Пример: X DB 10, -5, 0FFh ; массив X
Как видно, формат директив в целом совпадает с форматом команд. Единственное отличие - в директиве после имени, если оно есть, не ставится двоеточие. Имя, указываемое в начале директивы, - это, как правило, имя константы или переменной, описываемой данной директивой. В нашем примере X - это имя переменной - массива из трех элементов. Названия директив, как и мнемокоды, - служебные слова. При этом заранее известно, какие служебные слова обозначают директивы, а какие - мнемокоды, и путаницы здесь нет. Названия директив будут указываться по мере знакомства с директивами. Остальные части директивы (операнды и комментарий) записываются также, как и в командах.
Директивы определения данных
Для того чтобы в программе на ASM зарезервировать ячейки памяти под константы и переменные, необходимо воспользоваться директивами определения данных - с названиями DB (описывает данные размером в байт), DW (размером в слово) и DD (размером в двойное слово). (Директивы, или команды ассемблеру, - это предложения программы, которыми ее автор сообщает какую-то информацию ассемблеру или просит что-то сделать дополнительно, помимо перевода символьных команд на машинный язык.)
В простейшем случае в директиве DB, DW или DD описывается одна константа, которой дается имя для последующих ссылок на нее. По этой директиве ассемблер формирует машинное представление константы (в частности, если надо, "переворачивает" ее) и записывает в очередную ячейку памяти. Адрес этой ячейки становится значением имени: все вхождения имени в программу ассемблер будет заменять на этот адрес. Имена, указанные в директивах DB, DW и DD, называются именами переменных (в отличие от меток - имен команд).
В ASM числа записываются в нормальном (неперевернутом) виде в системах счисления с основанием 10, 16, 8 или 2. Десятичные числа записываются как обычно, за шестнадцатеричным числом ставится буква h (если число начинается с "цифры" A, B, ..., F, то вначале обязателен 0), за восьмеричным числом - буква q или o, за двоичным числом - буква b.
Примеры:
A DB 162 ;описать константу-байт 162 и дать ей имя A
B DB 0A2h ;такая же константа, но с именем B
С DW -1 ;константа-слово -1 с именем С
D DW 0FFFFh ;такая же константа-слово, но с именем D
E DD -1 ;-1 как двойное слово
Константы-символы описываются в директиве DB двояко: указывается либо код символа (целое от 0 до 255), либо сам символ в кавычках (одинарных или двойных); в последнем случае ассемблер сам заменит символ на его код. Например, следующие директивы эквивалентны (2A - код звездочки в ASCII):
CH DB 02Ah
CH DB '*'
CH DB "*"
Константы-адреса, как правило, задаются именами. Так, по директиве ADR DW CH будет отведено слово памяти, которому дается имя ADR и в которое запишется адрес (смещение), соответствующий имени CH. Если такое же имя описать в директиве DD, то ассемблер автоматически добавит к смещению имени его сегмент и запишет смещение в первую половину двойного слова, а сегмент - во вторую половину.
По любой из директив DB, DW и DD можно описать переменную, т.е. отвести ячейку, не дав ей начального значения. В этом случае в правой части директивы указывается вопросительный знак:
F DW ? ;отвести слово и дать ему имя F, ничего в этот байт не записывать
В одной директиве можно описать сразу несколько констант и/или переменных одного и того же размера, для чего их надо перечислить через запятую. Они размещаются в соседних ячейках памяти. Пример:
G DB 200, -5, 10h, ?, 'F'
Имя, указанное в директиве, считается именующим первую из констант. Для ссылок на остальные в MASM используются выражения вида <имя>+<целое>; например, для доступа к байту с числом -5 надо указать выражение
G+1, для доступа к байту с 10h - выражение G+2 и т.д.
Если в директиве DB перечислены только символы, например:
S DB 'a','+','b'
тогда эту директиву можно записать короче, заключив все эти символы в одни кавычки:
S DB 'a+b'
И, наконец, если в директиве описывается несколько одинаковых констант (переменных), то можно воспользоваться конструкцией повторения k DUP(a,b,...,c), которая эквивалентна повторенной k раз последовательности a,b,...,c.
Например, директивы
V1 DB 0,0,0,0,0
V2 DW ?,?,?,?,?,?,?,?,?,'a',1,2,1,2,1,2,1,2
можно записать более коротко таким образом:
V1 DB 5 DUP(0)
V2 DW 9 DUP(?), 'a', 4 DUP(1,2)
Директивы присваивания и эквивалентности
Директива эквивалентности - EQU (Equal, равно), имеет синтаксис
<имя> equ <операнд> - обязательно имя и один операнд. Директива означает, что указанному операнду присваивается указанное имя и при вхождении этого имени в текст программы ассемблер заменяет его на этот операнд, например если есть
name equ ‘pers’ то ассемблер будет рассматривать предложение
nm db name как nm db ‘pers’.
Директива носит чисто информационный характер и при ее появлении ассемблер ничего не заносит в машинную программу.
Директива присваивания. <имя> = <константное выражение> определяет константу с именем, указанным в левой части и с числовым значением, равным выражению справа. В отличие от констант, определенных с помощью директивы equ данная константа может менять свое значение, обозначая в разных частях программы разные числа.
Нельзя q equ 1 q equ 2 |
Нельзя w equ 1 w=2 |
Нельзя e=1 e equ 2 |