
- •Аппаратно-ориентированное программирование
- •Ббк 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.2. Понятие архитектуры компьютера
Системное программирование нижнего уровня требует знания всех деталей машинных кодов управления устройствами и слов состояния устройств. Причем только для кодов управляющих слов процессора используется стандартная мнемоника (условные символические обозначения). Кроме того, для него необходимо понимание внутренних специальных процедур работы процессора, а именно четкое представление действий над стеком, программной стороной процесса прерывания, правил формирования адреса, а также правил доступа через средства внутренней защиты процессора.
Из вышесказанного становится очевидным, что трудоемкость системного программирования и объем базовой информации для него значительно больше, чем в прикладном программировании. Ближе всего к самым тонким потребностям системного программирования подходит язык ассемблера, позволяющий в форме мнемокодов записывать двоичные коды машинных команд и задавать операнды в виде, ориентированном на машинное представление, в частности на регистры процессора.
Архитектура - это логическая структура и функционирование компьютера с точки зрения программиста. Иначе говоря, архитектура - это точное описание границы между аппаратурой и программным обеспечением. Для однопроцессорных компьютеров их архитектура определяется архитектурой процессора.
Архитектура процессора состоит из следующих компонентов:
1. Внутренних узлов хранения информации в процессоре, явно указываемых или используемых в машинных командах. Эти узлы называют регистрами программиста.
2. Способов доступа к ячейкам внешней по отношению к процессору адресуемой памяти (так называемой основной памяти компьютера).
3. Описания форматов и функций машинных команд.
4. Описания системы прерываний в той степени, в которой она значима для программиста. Оно состоит из изложения последовательности действий с информацией при выполнении процедуры прерывания, но не содержит описания аппаратных узлов и устройств, без понимания деталей функционирования которых самый дотошный программист может обойтись.
Описание способа доступа к ячейкам основной памяти включает информацию об используемом процессором диапазоне адресов (номеров) ячеек памяти и подробное изложение как на основе информации в отдельных командах определяются действительные адреса размещения операндов в основной памяти.
Одним из фундаментальных понятий современной вычислительной техники и системного программирования является понятие адреса. Адрес информационного объекта - это порядковый номер ячейки памяти, начиная с которой размещается в основной памяти эта информация. Понятие адреса относится как к данным, так и к командам (адрес команды). Для обеспечения большой гибкости процессоры, начиная с 60-х годов, в качестве элементарной адресуемой ячейки основной памяти используют байт (группу из 8 бит). Адресовать информацию размером менее байта в современных компьютерах невозможно. Большинство данных и команд состоит более чем из одного байта, в любом случае за адрес этих данных или команд принимается адрес самого младшего байта основной памяти, где хранится их информация.
Для операндов, размещаемых в основной памяти, информация машинного кода команды определяет адрес, называемый обычно эффективным, или исполнительным. В современных архитектурах компьютеров исполнительный адрес отличается от действительного адреса информации в памяти. Сделано это для возможности перемещения программ. Действительно, если бы такого отличия не было, то при необходимости разместить исполняемую программу с другого реального места памяти потребовалось бы ее переделать: либо перетранслировать с учетом новой информации о размещении при выполнении, либо скорректировать те части машинных кодов, которые определяют исполнительный адрес. Решением явилось введение и использование специальных регистров, называемых обычно сегментными или, ранее, базовыми регистрами программы. Эти регистры предназначены для хранения информации, исходя из которой определяется действительный адрес начала программы в памяти - в общем случае части программы, называемой сегментом. Тогда при перемещении программы в памяти достаточно скорректировать лишь содержимое регистра сегмента (сегментов) программы. В настоящее время этот подход используется во всех архитектурах процессоров, исключая лишь простейшие микропроцессоры.