- •Аппаратно-ориентированное программирование
- •Ббк 32.973.73
- •Удк 681.3 ббк 32.973.73ф 73
- •1. Основы программирования на ассемблере
- •1.1. Принципы построения ассемблерных программ
- •1.2. Понятие архитектуры компьютера
- •1.3. Регистры программиста в ia32
- •1.4. Описание сегментной структуры программы
- •2. Простейшие средства ассемблера
- •2.1. Средства описания данных
- •2.2. Обращения к функциям ос посредством прерываний
- •2.3. Средства преобразования в исполняемый файл
- •2.4. Управление строками при выводе и ввод данных
- •2.5. Простейшие способы адресации
- •3. Архитектурные элементы для построения программ
- •3.1. Организация условных переходов
- •3.2. Средства организации циклов
- •3.3. Особенности команд умножения и деления
- •3.4. Организация процедур
- •3.5. Неарифметические операции над кодами
- •4. Использование неэлементарных способов адресации
- •4.1. Косвенно-регистровая адресация
- •4.2. Использование индексной адресации данных
- •4.3. Базовая и индексно базовая адресации
- •4.4. Адресация с масштабированием
- •5. Взаимосвязи программных единиц
- •5.1. Многомодульная разработка программ
- •5.2. Использование библиотек объектных модулей
- •5.3. Организация стекового кадра подпрограммы
- •5.4. Программный доступ к системным функциям Win32
- •5.5. Особенности использования объектных файлов формата coff
- •5.6. Стандартный доступ к системным функциям Unix
- •6. Вспомогательные средства базовой архитектуры
- •6.1. Использование строковых команд пересылки
- •6.2. Применение строковых команд сравнения
- •7. Использование ассемблерных отладчиков
- •7.1. Особенности отладчика gdb для программ в Linux
- •7.2. Отладчики текстового режима для Windows
- •Библиографический список
- •Оглавление
1. Основы программирования на ассемблере
1.1. Принципы построения ассемблерных программ
Теоретически самым нижним уровнем программирования является программирование непосредственно в машинных кодах, задаваемых шестнадцатеричными или восьмеричными цифрами. На заре вычислительной техники такое программирование широко использовалось. Позже такой подход применялся лишь для программирования технических устройств на микропроцессорах. В то же время, ни один из языков программирования высокого уровня не содержит в качестве собственных языковых средств такие элементарные действия над процессором, как временный запрет прерываний, сброс или установку отдельных флажков - признаков во внутренних специальных регистрах процессора и многие другие. Не содержат либо по той причине, что эти возможности аппаратно зависимы, либо для отсечения пользователей таких языков от возможности очень глубокого воздействия на аппаратуру, разрешаемого только для внутренних средств операционной системы.
Следующим над уровнем машинных кодов является уровень мнемокодов, называемый по исторической традиции языком ассемблера. Это название, происходящее от английского слова to assemble - собирать, возникло из-за способности первых систем программирования машинных команд на мнемокоде собирать в общую программу набор подпрограмм и библиотечных программ. Практически на первых этапах ассемблеры готовили из мнемокодов программу, готовую к немедленному выполнению, некоторые из них в конце своей работы запускали выполнение разработанной с их помощью программы (работали по принципу: преобразовать-загрузить-выполнить). В сравнении с современными системами программирования выполняли функции и компилятора, и компоновщика (редактора связей). Позже под ассемблером стали понимать как язык символического программирования машинных кодов, так и соответствующий транслятор, преобразующий программу с языка ассемблера в промежуточную форму, удобную для ее объединения с другими частями программы - подпрограммами. Эта форма является двоично-символической и содержит как окончательно сформированную информацию для выполнения (абсолютные поля), так и перемещаемую. Перемещаемая информация промежуточной формы программы - это информация о том, какие поля надо настраивать на этапе компоновки получаемого двоичного кода или при загрузке в память исполняемой программы.
Под языком программирования ассемблер в настоящее время понимается язык программирования, задающий действия отдельных команд условными (мнемоническими) обозначениями и позволяющий использовать символические обозначения обрабатываемых данных. Характерным для него является соответствие: одна элементарная конструкция языка (команда ассемблера) - одна машинная команда, получаемая в результате трансляции. Естественно, что этот язык аппаратно зависим и аппаратно ориентирован.
В связи с аппаратурной зависимостью языка ассемблера, его синтаксис зависит от типа конкретного процессора, лежащего в основе компьютера. Тем ни менее, за время нескольких десятилетий развития ассемблеров сложились некоторые общие правила:
1. Каждое действие, описываемое ассемблером, записывается на отдельной строке. Не допускается продолжение базовых конструкций ассемблера со строки на строку, не может быть более одного действия, записанного на одной строке. Таким образом, формат записи на ассемблере не столь свободный, как на современном алгоритмическом языке высокого уровня.
2. Каждое действие процессора, задаваемое ассемблером на отдельной строке, называется командой (в некоторых ассемблерах - инструкцией).
3. Собственно действие команды задается мнемокодом (сокращенным удобным для запоминания наименованием) на английском языке (последнее сложилось исторически из-за лидерства англоязычных стран с конца 60-х в области компьютерной техники).
4. Сложилась префиксная форма записи команд, при которой в начале записи идет мнемоника действия, а затем после пробела через запятые перечисляются операнды. Связано это с тем, что код собственно операции в машинных кодах размещается всегда в начале этих кодов, последнее необходимо для организации автоматического цикла выборки команды аппаратурой процессора.
5. В одной команде ассемблера задается лишь одна операция преобразования (одно сложение, умножение, сдвиг двоичного кода и т.п.).
6. Для указания места перехода при выполнении операций управления ходом выполнения программы используются метки, в качестве которых применяются символические имена (идентификаторы) с последующим за ними символом «двоеточие».
7. Для удобства введения комментариев, в том числе и в начале строки, используется символ «точка с запятой». (Напомним, что в современных языках высокого уровня он применяется как разделитель операндов или признак конца операнда. Так как в ассемблере каждая команда занимает точно одну строку, то с этой целью в ассемблере подобный разделитель совершенно не нужен.)
8. На некоторых строках программы ассемблера задаются конструкции, являющиеся информацией для системной программы перевода, так называемые псевдокоманды. Значительная часть из них аналогична по семантике операторам раздела описания программ в языках высокого уровня.
9. В общем случае команда ассемблера имеет вид
метка мнемокод операнды комментарии
Число операндов в этой записи определяется их числом в соответствующей машинной команде. Может не быть ни одного операнда, присутствовать один операнд, два или три операнда. Метка и комментарии команды - необязательные ее части. Кроме собственно мнемокодов операции машинных команд в однострочной конструкции ассемблера могут указываться так называемые псевдооперации, не порождающие никаких машинных команд, а управляющие трансляцией, распределяющие память для программы, формирующими константы в памяти и т.п. Строку ассемблера с мнемокодом псевдооперации называют псевдокомандой, или директивой ассемблера.
