- •1. Предварительные сведения 6
- •2. Процессоры intel в реальном режиме 11
- •3. Директивы и операторы ассемблера 51
- •Введение
- •1. Предварительные сведения
- •1.1. Подготовка программ на языке ассемблера
- •1.2. Представление данных в компьютерах
- •1.2.1. Двоичная система счисления
- •1.2.2. Биты, байты и слова
- •1.2.3. Шестнадцатеричная система счисления
- •1.2.4. Числа со знаком
- •1.2.5. Логические операции
- •1.2.6. Коды символов
- •2. Процессоры intel в реальном режиме
- •2.1. Регистры процессора
- •2.1.1. Регистры общего назначения
- •2.1.2. Модели памяти и сегментные регистры
- •2.1.3. Стек
- •2.1.4. Регистр флагов
- •2.2.4. Косвенная адресация
- •2.2.5. Адресация по базе со смещением
- •2.2.6. Косвенная адресация с масштабированием
- •2.2.7. Адресация по базе с индексированием
- •2.2.8. Адресация по базе с индексированием и масштабированием
- •2.3. Основные непривилегированные команды
- •2.3.1. Пересылка данных
- •2.3.2. Двоичная арифметика
- •2.3.3. Десятичная арифметика
- •2.3.4. Логические операции
- •2.3.5. Сдвиговые операции
- •2.3.6. Операции над битами и байтами
- •2.3.7. Команды передачи управления
- •2.3.8. Строковые операции
- •2.3.9. Управление флагами
- •2.3.10. Загрузка сегментных регистров
- •2.3.11. Другие команды
- •3. Директивы и операторы ассемблера
- •3.1. Структура программы
- •3.2. Директивы распределения памяти
- •3.2.1. Псевдокоманды определения переменных
- •3.2.2. Структуры
- •3.3. Организация программы
- •3.3.1. Сегменты
- •3.3.2. Модели памяти и упрощенные директивы определения сегментов
- •3.3.4. Процедуры
- •3.3.5. Конец программы
- •3.3.6. Директивы задания набора допустимых команд
- •3.3.7. Директивы управления программным счетчиком
- •3.3.8. Глобальные объявления
- •3.3.9. Условное ассемблирование
- •3.4. Выражения
- •3.5. Макроопределения
- •3.5.1. Блоки повторений
- •3.5.2. Макрооператоры
- •3.5.3. Другие директивы, используемые в макроопределениях
- •3.6. Другие директивы
- •3.6.1. Управление файлами
- •3.6.2. Управление листингом
- •3.6.3. Комментарии
- •Литература
О десский национальный морской
университет
Кафедра информационных технологий
А. Д. Бодарев
Системное программирование
на языке ассемблера
Методическое пособие
по теме
«Архитектура реального режима процессора.
Директивы языка»
Одесса 2010
СОДЕРЖАНИЕ
ВВЕДЕНИЕ 4
1. Предварительные сведения 6
1.1. Подготовка программ на языке ассемблера 6
1.2. Представление данных в компьютерах 7
Остаток 7
Разряд 7
Таблица 3. Двоичные и шестнадцатеричные числа 9
Десятичное 9
2. Процессоры intel в реальном режиме 11
2.1. Регистры процессора 11
Рис. 3. Регистры общего назначения 12
Рис. 4. Стек 14
Рис. 5. Регистр флагов FLAGS 14
2.2. Способы адресации 15
Рис. 6. Полная форма адресации 18
2.3. Основные непривилегированные команды 18
Код команды 20
Рис. 7. Сдвиговые операции 32
Рис. 8. Сдвиги двойной точности 33
ROR 35
ROL 35
RCR 35
RCL 35
Рис. 9. Циклические сдвиги 35
IRETD 41
Рис. 10. Стековый кадр процедуры 43
3. Директивы и операторы ассемблера 51
3.1. Структура программы 52
3.2. Директивы распределения памяти 53
3.3. Организация программы 55
3.4. Выражения 62
3.5. Макроопределения 64
3.6. Другие директивы 67
ЛИТЕРАТУРА 69
Введение
Изучение системного программирования как предмета является необходимым этапом подготовки специалистов различных отраслей компьютерной науки. На этом этапе они осваиваются в среде и условиях, в которых ведется разработка системных программ, получают основные навыки и приемы работы с конкретной системой, накапливают ценный практический опыт. Программист на языке высокого уровня может в дальнейшем четко представлять иерархию, цели и задачи, а также возможности системных программ, предъявлять адекватные требования к ним и использовать эти возможности с наибольшей полнотой.
К системным программам обычно относят программы, разработанные с учетом специфики конкретного оборудования и выполняющие какие-либо сервисные функции. Это, в первую очередь, операционная система (включая базовую систему ввода-вывода), драйверы устройств, резидентные программы, обработчики программных прерываний, служебные сервисные подпрограммы, написанные для их последующего использования прикладными приложениями и пр. В отличие от прикладных высокоуровневых программ, решающих конкретные задачи пользователя, системные программы реализуют низкий уровень работы с вычислительной системой, обеспечивая определенный сервис для работы с устройствами, файловой системой и выполняя разнообразные рутинные операции. Качество и эффективность работы этого низкоуровневого слоя в очень большой степени определяют надежность и производительность вычислительной системы и, в конечном счете, скорость выполнения заданий пользователя. Большая часть системных программ используется очень интенсивно, поэтому к их разработке нужно подходить с особой тщательностью и ответственностью.
Традиционно средствами разработки системного программного обеспечения являются языки ассемблер и С. Они предоставляют программисту ряд средств для прямого обращения к ресурсам системы и обеспечивают определенную свободу в написании программных конструкций, обрабатывая лишь грубые ошибки. Эти условия создают предпосылки для создания эффективных программ, предъявляющих скромные требования к ресурсам. От программиста при этом требуется, по крайней мере, хорошее представление о механизмах функционирования определенной операционной системы, знание принципов и особенностей работы конкретной аппаратуры, в первую очередь, микропроцессора.
Язык ассемблера отличается от всех остальных языков программирования тем, что позволяет создавать программы непосредственно с помощью команд процессора, представляемых для удобства в мнемоническом виде. Вследствие этого программы на языке ассемблера оказываются принципиально непереносимыми: язык ассемблера для каждого процессора свой. Часто, однако, языки высокого уровня также не гарантируют переносимости, так как их компиляторы для разных систем предъявляют свои индивидуальные требования к написанию программ.
Применение в языке ассемблера команд микропроцессора дает возможность использовать предоставляемые им средства с максимальной полнотой. Написанные на ассемблере программы могут не зависеть ни от сред разработки, ни от библиотек подпрограмм, ни от операционной системы, ни даже от базовой системы ввода-вывода.
Перечисленные свойства определяют круг задач, для решения которых целесообразно применение ассемблера. Это критические и часто используемые участки программ, требующие максимальной скорости выполнения; программы, напрямую взаимодействующие с внешними устройствами, особенно нестандартными; программы, полностью использующие возможности процессора и операционной системы, в частности, переводящие процессор в защищенный режим, отладчики, антивирусы, защиты от несанкционированного доступа и многое другое. Кроме того, язык ассемблера является основным инструментом исследования программ, для которых нет исходных текстов, так как на сегодняшний день задача преобразования машинного кода в последовательность операторов языка высокого уровня является неразрешимой.
Кроме потребительских качеств, язык ассемблера имеет также значительную методическую ценность. Отражая архитектурные особенности компьютера, средства взаимодействия его отдельных компонентов и системного программного обеспечения, язык ассемблера позволяет детально изучить их возможности, ограничения, принципы работы и методы использования предоставляемых средств.
Разработка системных программ на языке ассемблера, независимо от предмета решаемых задач, предполагает знание архитектуры процессора, директив языка и правил оформления исходного кода. Данное методическое пособие призвано осветить именно эти вопросы, составляющие часть курса «Системное программирование». Здесь рассматриваются базовые элементы архитектуры семейства процессоров Intel (86- совместимых), в частности, машинное представление данных и используемые системы счисления, регистры, режимы адресации, группы и форматы команд; структура программы, директивы, операторы и выражения языка MASM.