
3к5с Архитектура информационных систем / МУ ПР 3
.pdfАПРОБАЦИЯ
Министерство образования и науки Российской Федерации
Саратовский государственный технический университет
Балаковский институт техники, технологии и управления
ОБЩИЕ ПРИНЦИПЫ ПОСТРОЕНИЯ ПРОГРАММ
НА ЯЗЫКЕ АССЕМБЛЕРА
Методические указания к выполнению лабораторной работы по дисциплине «Архитектура ЭВМ и систем» для студентов очного
обучения специальности 230201 и направления 230400.
Одобрено
редакционно-издательским советом
Балаковского института техники,
технологии и управления
Балаково 2011
Цель работы — ознакомление с общими принципами построения программ на языке ассемблера, трансляция и компоновка, ознакомление со структурой программы.
ОСНОВНЫЕ ПОНЯТИЯ
В 50-е гг. программисты стали использовать для программирования символический аналог машинного языка, который назвали языком ассем-
блера. Этот язык точно отражает все особенности машинного языка.
Именно поэтому, в отличие от языков высокого уровня, язык ассемблера для каждого типа компьютеров свой.
Самую эффективную программу можно написать только на ассем-
блере (при условии, что ее пишет квалифицированный программист), так как этот язык является «родным» для компьютера, но это очень трудоем-
кий и требующий большого внимания и практического опыта процесс. По-
этому реально на ассемблере пишут в основном программы, которые должны обеспечить эффективную работу с аппаратной частью компьюте-
ра.
На ассемблере возможно написание критичных ко времени выполне-
ния или расходованию памяти фрагментов программы. Впоследствии они оформляются в виде подпрограмм и совмещаются с кодом на языке высо-
кого уровня.
Машинный язык полностью отражает все архитектурные тонкости конкретного типа компьютеров. Следствием этого является его индивиду-
альность для каждого семейства ЭВМ. Чтобы эффективно использовать все возможности компьютера, применяют символический аналог машин-
ного языка — язык ассемблера.
Регистрами называются области высокоскоростной памяти, распо-
ложенные внутри процессора в непосредственной близости от его испол-
нительного ядра. Доступ к ним осуществляется несравнимо быстрее, чем к ячейкам оперативной памяти. Соответственно, машинные команды с опе-
2
рандами в регистрах выполняются максимально быстро, поэтому в про-
граммах на языке ассемблера регистры используются очень интенсивно.
Большинство регистров имеют определенное функциональное назначение. С точки зрения программиста, их можно разделить на две большие группы.
Первую группу образуют пользовательские регистры, к которым от-
носятся:
регистры общего назначения 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) содержат информацию о состоянии процессора, исполняемой программы и позволяют изменить это состояние.
Во вторую группу входят системные регистры, то есть регистры,
предназначенные для поддержания различных режимов работы, сер-
висных функций, а также регистры, специфичные для определенной модели процессора.
3
Системные регистры, поддерживаемые 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 применяется в командах, производящих некоторые повторяющиеся действия.
4
Использование регистра-счетчика зачастую скрыто в алгоритме
работы той или иной команды;
регистр данных (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 предназначен для организации произвольного доступа к данным внутри стека.
5
Процессоры Intel аппаратно поддерживают сегментную организацию программы. Это означает, что любая программа состоит из трех сегментов:
кода, данных и стека.
В программной модели IA-32 имеется шесть сегментных регистров служащих для доступа к четырем типам сегментов:
Сегмент кода содержит команды программы. Для доступа к это-
му сегменту служит регистр сегмента кода (Code Segment register) CS. Он содержит адрес сегмента с машинными команда-
ми, к которому имеет доступ процессор (эти команды загружают-
ся в конвейер процессора).
Сегмент данных содержит обрабатываемые программой данные.
Для доступа к этому сегменту служит регистр сегмента данных
(Data Segment register) DS, который хранит адрес сегмента дан-
ных текущей программы.
Сегмент стека представляет собой область памяти, называемую стеком. Работу со стеком процессор организует по следующему принципу: последний записанный в эту область элемент выбира-
ется первым. Для доступа к этой области служит регистр сегмен-
та стека (Stack Segment register) SS, содержащий адрес сегмента стека.
Если программе недостаточно одного сегмента данных, то она
имеет возможность задействовать еще три дополнительных сегмента данных. Адреса дополнительных сегментов данных должны содержаться в регистрах дополнительного сегмента дан-
ных (Extension Data Segment registers) ES, GS, FS.
В процессор включены два регистра, постоянно содержащие инфор-
мацию о состоянии как самого процессора, так и программы, команды ко-
торой он в данный момент обрабатывает:
регистр-указатель команд EIP/IP;
6
регистр флагов Е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).
Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами.
Программа может состоять из одного или нескольких таких блоков-
сегментов. Сегменты программы имеют определенное назначение, соот-
ветствующее типу сегментов: кода, данных и стека. Названия типов сег-
7
ментов отражают их назначение. Деление программы на сегменты отража-
ет сегментную организацию памяти процессоров Intel (архитектура IA-32).
Для языка ассемблера предложения, составляющие программу, мо-
гут представлять собой синтаксические конструкции четырех типов:
Команды (инструкции) представляют собой символические аналоги машинных команд. В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды системы команд процессора.
Макрокоманды — это оформляемые определенным образом предложения текста программы, замещаемые во время трансля-
ции другими предложениями.
Директивы являются указанием транслятору ассемблера на вы-
полнение некоторых действий. У директив нет аналогов в ма-
шинном представлении.
Комментарии содержат любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором.
ТЕХНОЛОГИЯ РАБОТЫ
ЗАДАНИЕ. ВСТАВКА АССЕМБЛЕРНОГО КОДА В ПРО-
ГРАММУ НА ЯЗЫКЕ СИ.
1.Создайте проект консольного приложения Win32 на языке Си.
2.Рассмотрите пример вставки ассемблерного кода в программу на языке Си:
1 |
#include "stdafx.h" |
2 |
#include <iostream> |
3 |
#include "conio.h" |
4 |
int _tmain(int argc, _TCHAR* argv[]) { |
5 |
int a=1; |
6 |
int b=2; |
7 |
int c; |
|
8 |
8 |
_asm { |
9 |
mov eax,a |
10 |
mov edx,b |
11 |
add eax,edx |
12 |
mov c,eax |
13 |
} |
14 |
printf("a+b=%i",c); |
15 |
getch(); |
16 |
} |
3.Объявите в программе 3 переменные целочисленного типа a=1, b=2 и c (строки кода 5-7).
4.Значение переменной с = a + b вычислите на языке ассемблера
(строки кода 8-13). Для вставки ассемблерного кода в программу на языке Си используйте оператор _asm { }.
5. Поместите в регистры eax и edx значения переменных a и b (стро-
ки кода 9-10).
6.Используя оператор сложения add, произведите сложение данных
врегистрах eax и edx, а результат поместите в регистр eax (строка кода 11).
7.Поместите в переменную с значение из регистра eax (строка кода
12).
8. Выведите на экран значение переменной с (строка кода 14).
ТРЕБОВАНИЯ БЕЗОПАСНОСТИ ТРУДА
При выполнении лабораторной работы необходимо соблюдать об-
щие правила техники безопасности:
использовать ПК только в соответствии с их назначением;
не размещать на корпусе ПК посторонние предметы (тетради,
книги, карандаши и т.п.);
оберегать ПК от толчков, ударов, сотрясений;
немедленно поставить в известность оператора ИВЦ об обна-
ружении задымления, загорания, пожара;
9
немедленно сообщить оператору ИВЦ обо всех неисправностях в работе ПК.
СОДЕРЖАНИЕ ОТЧЕТА
Отчѐт по лабораторной работе на листах формата А4, который дол-
жен содержать: цель работы и выполненные задания по лабораторной ра-
боте.
10