
АПРОБАЦИЯ
Министерство образования и науки Российской Федерации
Саратовский государственный технический университет
Балаковский институт техники, технологии и управления
ОБЩИЕ ПРИНЦИПЫ ПОСТРОЕНИЯ ПРОГРАММ
НА ЯЗЫКЕ АССЕМБЛЕРА
Методические указания к выполнению практической работы
по дисциплине «Архитектура ЭВМ и систем» для студентов очного обучения специальности 230201 и направления 230400.
Одобрено
редакционно-издательским советом
Балаковского института техники,
технологии и управления
Балаково 2011
Цель работы — ознакомление с общими принципами построения программ на языке ассемблера, трансляция и компоновка, ознакомление со структурой программы.
Основные понятия
В 50-е гг. программисты стали использовать для программирования символический аналог машинного языка, который назвали языком ассемблера. Этот язык точно отражает все особенности машинного языка. Именно поэтому, в отличие от языков высокого уровня, язык ассемблера для каждого типа компьютеров свой.
Самую эффективную программу можно написать только на ассемблере (при условии, что ее пишет квалифицированный программист), так как этот язык является «родным» для компьютера, но это очень трудоемкий и требующий большого внимания и практического опыта процесс. Поэтому реально на ассемблере пишут в основном программы, которые должны обеспечить эффективную работу с аппаратной частью компьютера.
На ассемблере возможно написание критичных ко времени выполнения или расходованию памяти фрагментов программы. Впоследствии они оформляются в виде подпрограмм и совмещаются с кодом на языке высокого уровня.
Машинный язык полностью отражает все архитектурные тонкости конкретного типа компьютеров. Следствием этого является его индивидуальность для каждого семейства ЭВМ. Чтобы эффективно использовать все возможности компьютера, применяют символический аналог машинного языка — язык ассемблера.
Регистрами называются области высокоскоростной памяти, расположенные внутри процессора в непосредственной близости от его исполнительного ядра. Доступ к ним осуществляется несравнимо быстрее, чем к ячейкам оперативной памяти. Соответственно, машинные команды с операндами в регистрах выполняются максимально быстро, поэтому в программах на языке ассемблера регистры используются очень интенсивно.
Большинство регистров имеют определенное функциональное назначение. С точки зрения программиста, их можно разделить на две большие группы.
Первую группу образуют пользовательские регистры, к которым относятся:
регистры общего назначения EAX/AX/AH/AL, EBX/BX/BH/BL, EDX/DX/DH/DL, ЕСХ/CX/CH/CL, ЕВР/ВР, ESI/SI, EDI/DI, ESP/SP предназначены для хранения данных и адресов, программист может их использовать (с определенными ограничениями) для реализации своих алгоритмов;
сегментные регистры CS, DS, SS, ES, FS, GS используются для хранения адресов сегментов в памяти;
регистры сопроцессора ST(0), ST(1), ST(2), ST(3), ST(4), ST(5), ST(6), ST(7) предназначены для написания программ, использующих тип данных с плавающей точкой;
целочисленные регистры MMX-расширения ММХ0, MMX1, MMX2, ММХЗ, ММХ4, ММХ5, ММХ6, ММХ7;
регистры MMX-расширения с плавающей точкой XMM0, XMM1, ХММ2, ХММЗ, ХММ4,ХММ5,ХММ6,ХММ7;
регистры состояния и управления (регистр флагов ЕFLAGS/FLAGS и региструказатель команды EIP/IP) содержат информацию о состоянии процессора, исполняемой программы и позволяют изменить это состояние.
Во вторую группу входят системные регистры, то есть регистры, предназначенные для поддержания различных режимов работы, сервисных функций, а также регистры, специфичные для определенной модели процессора.
Системные регистры, поддерживаемые IA-32:
управляющие регистры CR0 ... CR4 определяют режим работы процессора и характеристики текущей исполняемой задачи;
регистры управления памятью GDTR, IDTR, LDTR и TR используются в защищенном режиме работы процессора для локализации управляющих структур этого режима;
отладочные регистры DR0 ... DR7 предназначены для мониторинга и управления различными аспектами отладки;
регистры типов областей памяти MTRR используются для аппаратного управления кэшированием;
машинно-зависимые регистры MSR используются для управления процессором, контроля за его производительностью, получения информации об ошибках.
Регистры общего назначения используются в программах для хранения:
операндов логических и арифметических операций;
компонентов адреса;
указателей на ячейки памяти.
Регистры, относящиеся к группе регистров общего назначения, физически находятся в процессоре внутри арифметико-логического устройства (поэтому их еще называют регистрами АЛУ):
регистр-аккумулятор (Accumulator register) EAX/AX/AH/AL применяется для хранения промежуточных данных, в некоторых командах его использование обязательно;
базовый регистр (Base register) EBX/BX/BH/BL применяется для хранения базового адреса некоторого объекта в памяти;
регистр-счетчик (Count register) ECX/CX/CH/CL применяется в командах, производящих некоторые повторяющиеся действия. Использование регистра-счетчика зачастую скрыто в алгоритме работы той или иной команды;
регистр данных (Data register) EDX/DX/DH/DL, так же как и регистр ЕАХ/АХ/АН/AL, хранит промежуточные данные (в некоторых командах его явное использование обязательно, в других он используется неявно);
регистр индекса источника (Source Index register) ESI/SI в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике (под цепочкой понимается последовательность байт или слов в памяти, а цепочечной операцией называется операция, которая выполняется над каждым элементом цепочки);
регистр индекса приемника (Destination Index register) EDI/DI в цепочечных операциях содержит текущий адрес в цепочке-приемнике.
В архитектуре процессора на программно-аппаратном уровне поддерживается такая структура данных, как стек.
Стек – структура данных, в которой доступ к элементам организован по принципу LIFO (last in — first out, «последним пришёл — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.
Для работы со стеком в системе команд процессора есть специальные команды, а в программной модели процессора для этого существуют специальные регистры:
регистр указателя стека (Stack Pointer register) ESP/SP содержит указатель на вершину стека в текущем сегменте стека;
регистр указателя базы кадра стека (Base Pointer register) EBP/BP предназначен для организации произвольного доступа к данным внутри стека.
Процессоры Intel аппаратно поддерживают сегментную организацию программы. Это означает, что любая программа состоит из трех сегментов: кода, данных и стека.
В программной модели IA-32 имеется шесть сегментных регистров служащих для доступа к четырем типам сегментов:
Сегмент кода содержит команды программы. Для доступа к этому сегменту служит регистр сегмента кода (Code Segment register) CS. Он содержит адрес сегмента с машинными командами, к которому имеет доступ процессор (эти команды загружаются в конвейер процессора).
Сегмент данных содержит обрабатываемые программой данные. Для доступа к этому сегменту служит регистр сегмента данных (Data Segment register) DS, который хранит адрес сегмента данных текущей программы.
Сегмент стека представляет собой область памяти, называемую стеком. Работу со стеком процессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этой области служит регистр сегмента стека (Stack Segment register) SS, содержащий адрес сегмента стека.
Если программе недостаточно одного сегмента данных, то она имеет возможность задействовать еще три дополнительных сегмента данных. Адреса дополнительных сегментов данных должны содержаться в регистрах дополнительного сегмента данных (Extension Data Segment registers) ES, GS, FS.
В процессор включены два регистра, постоянно содержащие информацию о состоянии как самого процессора, так и программы, команды которой он в данный момент обрабатывает:
регистр-указатель команд EIP/IP;
регистр флагов ЕFLAGS/FLAGS.
С помощью этих регистров можно также ограниченным образом управлять состоянием процессора.
Регистр-указатель команд (Instruction Pointer register) EIP/IP имеет разрядность 32(16) бита и содержит смещение следующей подлежащей выполнению команды относительно содержимого регистра сегмента кода CS в текущем сегменте команд.
Разрядность регистра флагов (flag register) EFLAGS/FLAGS равна 32(16) битам. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами.
Команды процессоров архитектуры IA-32 считаются сложными. Максимальная длина машинной команды IA-32 составляет 15 байт. Реальная команда может содержать гораздо меньшее количество полей, вплоть до одного — только код операции.
Рассмотрим типичную команду языка ассемблера:
mov ebx, eax
Команда MOV производит копирование содержимого регистра ЕАХ в регистр ЕВХ.
Соответствующая машинная команда будет выглядеть так: 8B D8
Значение 8В — код операции. Еще один пример команды MOV:
mov ecx, 128
Данная команда инициализирует содержимое регистра ЕСХ десятичным значением 128. Соответствующая машинная команда выглядит так: 89 00000080 (значение поля с кодом операции — В9).
Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами.
Программа может состоять из одного или нескольких таких блоков-сегментов. Сегменты программы имеют определенное назначение, соответствующее типу сегментов: кода, данных и стека. Названия типов сегментов отражают их назначение. Деление программы на сегменты отражает сегментную организацию памяти процессоров Intel (архитектура IA-32).
Для языка ассемблера предложения, составляющие программу, могут представлять собой синтаксические конструкции четырех типов:
Команды (инструкции) представляют собой символические аналоги машинных команд. В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды системы команд процессора.
Макрокоманды — это оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями.
Директивы являются указанием транслятору ассемблера на выполнение некоторых действий. У директив нет аналогов в машинном представлении.
Комментарии содержат любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором.