- •Системное программное обеспечение
- •Isbn 978-5-8149-2441-4
- •Введение
- •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. Неарифметические операции над кодами
- •3.6. Архитектура amd64 процессоров в ассемблерных Linux программах
- •4. Использование неэлементарных способов адресации
- •4.1. Косвенно-регистровая адресация и ее использование
- •4.2. Использование индексной адресации данных
- •4.3. Базовая и индексно-базовая адресации
- •5. Взаимодействие программных компонентов
- •5.1. Многомодульная разработка программ
- •5.2. Организация стекового кадра подпрограммы
- •5.3. Программный доступ к системным функциям Win32
- •5.4. Использование свободно распространяемых утилит для Win32
- •5.5. Вызов функций из стандартных библиотек Linux
- •6. Библиотеки объектных модулей
- •6.1. Использование библиотек объектных модулей в Linux
- •6.2. Использование библиотек объектных модулей в Win32
- •7. Разделяемые библиотеки выполняемых программ
- •7.1. Понятие о статической и динамической компоновке
- •7.2. Конструкция библиотеки динамической компоновки
- •7.3. Компоновка времени загрузки с использованием GoLink
- •Контрольные вопросы
- •Заключение
- •Библиографический список
1.2. Понятие архитектуры компьютера
Системное программирование нижнего уровня требует знания всех деталей машинных кодов управления устройствами и «слов состояния устройств». Причем только для кодов управляющих слов процессора используется стандартная мнемоника (условные символические обозначения). Кроме того, для системного программирования необходимо понимание внутренних специальных процедур работы процессора, а именно: четкое представление действий над стеком и о программной стороне процесса прерывания, правилах формирования адреса, а также о правилах доступа через средства внутренней защиты процессора.
Из вышесказанного становится очевидным, что трудоемкость системного программирования и объем базовой информации для него значительно больше, чем в прикладном программировании. Ближе всего к самым тонким потребностям системного программирования подходит язык ассемблера, позволяющий в форме мнемокодов записывать двоичные коды машинных команд и задавать операнды в виде, ориентированном на машинное представление, в частности на регистры процессора.
Архитектура – это логическая структура и функционирование компьютера с точки зрения программиста. Иначе говоря, архитектура – это точное описание границы между аппаратурой и программным обеспечением. Для однопроцессорных компьютеров их архитектура определяется архитектурой процессора.
Архитектура процессора состоит:
1) из внутренних узлов хранения информации в процессоре, явно указываемых или используемых в машинных командах. Эти узлы называют регистрами программиста;
2) способов доступа к ячейкам внешней по отношению к процессору адресуемой памяти (так называемой основной памяти компьютера);
3) описания форматов и функций машинных команд;
4) описания системы прерываний в той степени, в которой она значима для программиста. Это описание состоит из изложения последовательности действий с информацией при выполнении процедуры прерывания, но не содержит описания аппаратных узлов и устройств, без понимания деталей функционирования которых может обойтись даже самый дотошный программист.
Описание способа доступа к ячейкам основной памяти включает информацию об используемом процессором диапазоне адресов (номеров) ячеек памяти и подробное изложение того, как на основе информации в отдельных командах определяются действительные адреса размещения операндов в основной памяти.
Одним из фундаментальных понятий современной вычислительной техники и системного программирования является понятие адреса. Адрес информационного объекта – это порядковый номер ячейки памяти, начиная с которой в основной памяти размещается эта информация. Понятие адреса относится как к данным, так и к командам (адрес команды). Для обеспечения большой гибкости процессоры, начиная с 60-х годов, используют в качестве элементарной адресуемой ячейки основной памяти байт (группу из 8 бит). Адресовать информацию размером менее одного байта в современных компьютерах невозможно. Большинство данных и команд состоит более чем из одного байта, в любом случае за адрес этих данных или команд принимается адрес самого младшего байта основной памяти, где хранится эта информация.
Для операндов, размещаемых в основной памяти, информация машинного кода команды определяет адрес, называемый обычно эффективным или исполнительным. В современных архитектурах компьютеров исполнительный адрес информации в памяти отличается от действительного адреса. Это сделано для возможности перемещения программ. Действительно, если бы такого отличия не было, то при необходимости перемес- тить исполняемую программу с другого реального места памяти потребовалось бы ее переделать: либо перетранслировать с учетом новой информации о размещении при выполнении, либо скорректировать те части машинных кодов, которые определяют исполнительный адрес. Решением явилось введение и использование специальных регистров, называемых обычно сегментными или, ранее, базовыми регистрами программы. Эти регистры предназначены для хранения информации, исходя из которой определяется действительный адрес начала программы в памяти – в общем случае части программы, называемой сегментом. Тогда при перемещении программы в памяти достаточно скорректировать лишь содержимое регистра сегмента (сегментов) программы. В настоящее время этот подход используется во всех архитектурах процессоров, исключая лишь простейшие микропроцессоры.