- •Магомедов и. А. Микропроцессорные системы. Аппаратные и программные средства.
- •Глава 1. Микропроцессоры
- •Глава II. Программирование микропроцессоров
- •Глава III. Лабораторный практикум по программированию мп i80х86
- •Глава 1. Микропроцессоры
- •1.1. Назначение микропроцессоров
- •1.2. Универсальные микропроцессоры
- •1.2.2. Микропроцессоры компании amd
- •1.2.3. Микропроцессоры компании Cyrix
- •1.2.4. Микропроцессоры с архитектурой Alpha
- •1.2.5. Микропроцессоры с архитектурой sparc
- •1.2.6. Микропроцессоры Hewlett-Packard ра-8000
- •1.3. Микропроцессоры обработки сигналов
- •1.3.1. Сигнальные микропроцессоры компании
- •1.3.2. Сигнальные микропроцессоры компании Motorola
- •1.3.3. Микропроцессоры семейства dsp 560хх
- •1.4. Медийные микропроцессоры
- •1.5. Транспьютероподобные микропроцессоры
- •1.6. Нейропроцессоры
- •Глава II. Программирование микропроцессоров
- •2.1. Программная модель 32-разрядных процессоров
- •2.1.2. Типы данных
- •2.1.3. Регистры процессора
- •2.2. Форматы команд
- •2.3. Выбор операнда
- •2.4. Режимы адресации
- •Вопросы для самоконтроля к главе 2
- •Глава III. Лабораторный практикум по программированию мп i86
- •Обобщенная структурная схема микропроцессора х86
- •Организация основной памяти и средства аппаратной поддержки управления памятью
- •Выполнение программы
- •Формат операторов ассемблера
- •Определение полей памяти для размещения данных.
- •3.2. Операнды команд ассемблера
- •Команда пересылки данных
- •Команда загрузки исполнительного адреса
- •Команды загрузки указателя.
- •Команда записи в стек
- •Команда обмен данными
- •Команды сложения/ Команды вычитания
- •Команда изменения знака
- •Команда добавления /вычитания единицы
- •Команда сравнения
- •Команды умножения/ деления
- •Команда преобразования байта в слово, а слова - в двойное слово.
- •Команды передачи управления
- •Команды условного перехода
- •Команды организации циклической обработки
- •Команда перехода по обнуленному счетчику
- •Команды организации цикла с условием
- •Команды вызова подпрограмм
- •Команда возврата управления
- •Команды обработки строк
- •Логические команды
- •2. Программирование циклических процессов.
- •3. Моделирование одномерных массивов
- •4. Моделирование матриц
- •5. Преобразования ввода-вывода.
- •3.4. Основные команды отладчика afd
- •Fspec определяет имя файла, наименованного в соответствии с соглашениями dos. Для команды l расширением по умолчанию является “exe”;
- •String задает список значений или ascii строк (строка заключена в кавычки) разделенных пробелами или запятой.
- •Например: 1234 bx, ‘tromb’ ff.
- •Лабораторная работа № 1 Создание выполнимого файла, работа в отладчике, изучение оператора пересылки mov
- •Оператор mov
- •Индивидуальные задания
- •Лабораторная работа № 2 Сегментация памяти, директивы ассемблера
- •Прямая адресация
- •Косвенная адресация
- •Директива assume
- •Индивидуальные задания
- •Лабораторная работа №.3 Директивы equ, label, команды сложения и вычитания Директива equ
- •Директива label
- •Команды сложения и вычитания
- •Индивидуальные задания Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.
- •Вариант 6.
- •Вариант 7.
- •Вариант 8.
- •Вариант 9.
- •Вариант 10.
- •Вариант 11.
- •Вариант 12.
- •Лабораторная работа № 4 Изучение операторов обмена xchg и xlat
- •Индивидуальные задания Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.
- •Вариант 6.
- •Вариант 7.
- •Вариант 8.
- •Вариант 9.
- •Вариант 10.
- •Вариант 11.
- •Вариант 12.
- •Система команд процессораi486
- •П1. Команды пересылки данных
- •П2. Арифметические команды
- •П3. Логические команды
- •П4. Команды переходов
- •П5. Команды процессора i486
2.1.3. Регистры процессора
Процессоры х86 имеют регистры, подразделяющиеся на следующие категории [1,31-34]:
• регистры общего назначения;
• указатели инструкций;
• регистр флагов;
• регистры сегментов;
• системные адресные регистры;
• управляющие регистры;
• регистры отладки;
• регистры тестирования;
• модельно-специфические (зависящие от конкретной модели процессора) регистры.
Регистры общего назначения относятся к видимой для прикладных программ части архитектуры х86 и представляют собой расширение набора регистров 16-разрядных процессоров 8086/8088 и 80286 [33, 35, 36]. У 16-разрядных процессоров регистры общего назначения AX, BX, CX, DX состоят из двух 8-битных половинок, к которым можно независимо обращаться по символическим именам АН, ВН, СН, DH (старшие байты - High) и AL, BL, CL, DL (младшие байты - Low). Регистры-указатели SP (Stack Pointer - указатель стека), ВР (Base Pointer - базовый регистр) и индексные регистры SI (Source Index - индекс источника), DI (Destination Index - индекс назначения) допускают только 16-битное обращение. Адрес текущей инструкции хранится в 16-битном указателе команд IP (Instruction Pointer). Регистры в командах могут адресоваться явно. В ряде команд подразумевается неявное использование регистров:
• AX - умножение, деление, ввод и вывод слова;
• AL - умножение, деление, ввод и вывод байта; десятичная арифметика, трансляция (XLAT);
• АН - умножение и деление байта;
• BX - трансляция;
• CX - счетчик циклов и указатель длины строковых операций;
• CL - сдвиги с указанием переменной;
• DX - умножение и деление слова, ввод и вывод с косвенной адресацией;
• SP - операции со стеком;
• SI, DI - строковые операции.
В
процессорах IA-32
все эти регистры расширены до 32 бит и к
прежнему обозначению их имен добавилась
приставка Е (Extended
- расширенный). Отсутствие приставки в
имени означает ссылку на младшие 16 бит
расширенных регистров. Существуют
понятия разрядности
адреса и данных. Разрядность адреса
определяет, сколько бит (16 или 32)
используется в регистрах, формирующих
адрес данных или инструкций,
расположенных в памяти. Разрядность
данных
определяет, сколько бит (16 или 32)
используется в инструкциях, оперирующих
словами (инструкции с байтами всегда
оперируют с 8 битами). В
реальном режиме
по умолчанию разрядность адреса и
данных - 16 бит. В
защищенном режиме
разрядность адреса и данных по умолчанию
определяется дескриптором кодового
сегмента. Инструкции, которые прежде
адресовались к 16-разрядным регистрам,
теперь могут адресоваться и к 32-разрядным
расширенным при том же коде операции.
Что именно подразумевается в данный
момент, определяется текущим значением
разрядности слова операнда по
умолчанию (16 или 32 бит) и может быть
изменено на противоположное значение
с п
омощью
префикса SIZ.
Как и в 8086, возможно независимое
обращение к младшему и старшему байтам
регистров АХ, ВХ, СХ и DX.
Процессор содержит 16 регистров, которые могут использоваться прикладными программами. Как показано на рис. 2.1, эти регистры могут быть сгруппированы следующим образом [1, 31-34].
1. Регистры общего назначения. Эти восемь 32-битовых регистра доступны для использования программистами.
Регистрами общего назначения (РОН) являются 32-битовые регистры EAX, EBX, ECX, EDX, EBP, ESI и EDI. Данные регистры используются для хранения 8, 16 и 32 операндов (рис. 2.1). Они также могут использоваться для хранения операндов при вычислении адресов, за исключением регистра ESP, который не может быть использован для хранения индекса. Все РОН могут использоваться для вычисления адреса и формирования большинства арифметических и логических операций. Однако некоторые команды используют отдельные регистры для хранения операндов. Например, команды обработки строк используют содержимое регистров ECX, ESI, EDI в качестве операндов. Использование указанных регистров для этих целей позволяет более компактно кодировать команды. Следующие команды используют фиксированные регистры: умножения и деления с двойной точностью, ввода-вывода, обработки строк, перекодирования, циклического сдвига, операции со стеком.
2. Сегментные регистры. Данные регистры хранят селекторы сегментов, соответствующих различным формам доступа к памяти [33, 34]. Например, существуют отдельные сегментные регистры для доступа к программной области и стеку. Эти шесть сегментных регистров (рис. 2.2) определяют сегменты памяти, доступные в каждый момент времени.
Сегментирование обеспечивает разработчикам системы гибкость при выборе различных моделей организации памяти. Сегментние регистры содержат 16-битные селекторы сегментов, адресующих таблицы в памяти, в которых хранятся базовые адреса каждого сегмента и другая информация, определяющая доступ к памяти. При использовании несегментированной модели все сегменты отображаются в единое адресное пространство в физической памяти (рис. 2.2).
В
любой момент времени до шести сегментов
памяти непосредственно доступны
программе. Сегментные регистры CS,
DS,
SS,
ES,
FS
и GS
хранят селекторы сегментов для этих
шести сегментов. Каждый регистр
ассоциируется с доступом к одному из
возможных сегментов (кода, данных или
стеку). Каждый регистр указывает на
конкретный сегмент, используемый
программой и имеющий определенный тип
доступа (рис. 2.3). Остальные сегменты
могут быть использованы путем загрузки
их селекторов в сегментные регистры.
Сегмент, содержащий выполняемые команды, называется сегментом кода, и его селектор находится в регистре CS. Процессор выбирает команды кодового сегмента, используя содержимое указателя команд EIP как смещение внутри сегмента. Регистр CS загружается в результате выполнения прерываний, особых случаев и команд передачи управления между сегментами (например, команды CALL, IRET, JMP). Перед вызовом процедуры должна быть выделена область памяти под стек. В стеке хранятся адрес возврата, параметры вызываемой процедуры и временные переменные.
Все операции со стеком используют регистр SS при обращении к сегменту стека. В отличие от регистра CS регистр SS может быть загружен явно, что позволяет прикладным программам определять стеки.
Р
егистры
DS,
ES,
FS,
GS
являются регистрами сегментов данных
и позволяют организовать эффективный
и безопасный доступ к различным структурам
данных. Например, раздельные сегменты
данных могут быть созданы для структур
данных текущего программного модуля,
данных, полученных из модуля более
высокого уровня динамически создаваемых
структур данных и данных, разделяемых
с другой программой. Механизм сегментации
позволяет ограничить влияние от
некорректно выполняемых программ
вследствие появления ошибок только в
сегментах, которые используются этими
программами.
В зависимости от структуры данных и распределения их по сегментам программа может получить доступ более чем к четырем сегментам данных. Для доступа к дополнительным сегментам регистры DS, ES, FS, GS могут быть загружены из прикладной программы во время ее выполнения. Единственным требованием является то, что инициализация соответствующего сегментного регистра должна быть выполнена до обращения к данным сегмента.
Базовый адрес хранится для каждого сегмента. Для адресации данных внутри сегмента 32-битовое смещение прибавляется к базовому адресу сегмента. Операнд в сегменте адресуется посредством задания смещения в команде или в регистре общего назначения. Специальные правила определяют, какой сегментный регистр используется для адресации сегмента.
Регистры состояния и управления. Данные регистры отображают и позволяют модифицировать состояние процессора [33, 34]..
Регистр флагов EFLAGS является расширением регистра FLAGS до 32 бит. Биты 0-15, определенные для 8086 и 80286, имеют прежнее назначение [34]. Флаги состояния OF, SF, ZF, AF, PF и CF хранят признаки результатов выполнения арифметических и логических операций над операндами, расположенными в регистрах общего назначения и в памяти (исполнение инструкций блоками FPU, ММХ и ХММ держится особняком). Операции пересылки данных на флаги состояния влияния не оказывают. Значение этих флагов анализируется при исполнении условных инструкций. Кроме флагов состояния в регистре имеются управляющие и системные флаги, влияющие на поведение процессора, в том числе на обработку маскируемых аппаратных прерываний (IF) и на направление движения в строковых операциях (DF). По сравнению с 80286, появились биты VM и RF, ряд флагов добавился с появлением процессоров 4-го и 5-го поколений. Содержимое регистра флагов (FLAGS или EFLAGS) может быть сохранено в стеке и восстановлено из него, но ряд системных флагов в защищенном режиме управляем и наблюдаем не на всех уровнях привилегий. Флаги состояния могут быть скопированы в регистр АН и, наоборот, загружены из него. Кроме того, флаги состояния могут быть загружены из блока FPU, и тогда результаты выполнения инструкций в FPU можно использовать в условных инструкциях.
Назначение бит регистра EFLAGS описано ниже [33, 34].
ID (Id Flag) - флаг доступности команды идентификации CPUID (P5 и выше, а также некоторые 486).
VIP (Virtual Interrupt Pending) - виртуальный запрос прерывания (P5 и выше).
VIF (Virtual Interrupt Flag) - виртуальная версия флага IF (разрешения прерывания) для многозадачных систем (P5 и выше).
AC (Alignment Check) - флаг контроля выравнивания. При исполнении программ с уровнем привилегий 3 в случае обращения к операнду, который не выровнен по соответствующей границе (2, 4, 8 байт), и при установленном флаге АС произойдет исключение #АС с нулевым кодом ошибки (о мнемониках исключений см. п. 2.5). На уровнях привилегий 0, 1, 2 контроль выравнивания не производится (486 и выше).
VM (Virtual 8086 Mode) - в защищенном режиме включает режим виртуального процессора 8086. Попытка использования привилегированных инструкций в этом режиме вызовет исключение #GP. Бит может устанавливаться только в защищенном режиме: инструкцией IRET на нулевом уровне привилегий или переключением задач на любом уровне привилегий. На бит не действует инструкция POPF, а инструкция PUSHF в этот бит всегда заносит 0. Его единичное значение может сохраниться только в образе EFLAGS, сохраняемом при прерывании, переключении задач или переходе в режим SMM.
RF (Resume Flag) - флаг возобновления, используется совместно с регистрами точек останова.
IOPL (Input/Output Privilege Level) - уровень привилегий ввода-вывода.
NT (Nested Task Flag) - флаг вложенной задачи.
OF (Overflow Flag) - флаг переполнения. Устанавливается, если результат арифметической операции не умещается в операнде назначения.
DF (Direction Flag) - флаг управления направлением в строковых операциях. При единичном значении индексные регистры, участвующие в строковых операциях, автоматически декрементируются на количество байт операнда, при нулевом - инкрементируются. Флаг управляется программно, инструкциями CLD и STD.
IF (Interrrupt-enable Flag) - флаг управления прерываниями. При единичном значении разрешается выполнение маскируемых аппаратных прерываний. На этот флаг можно воздействовать программно, явными инструкциями (CLI и STI) и неявными инструкциями восстановления регистра флагов; процессор манипулирует флагом и автоматически, при обработке прерываний.
TF (Trap Flag) - флаг трассировки (пошагового режима). При его установке после выполнения каждой команды вызывается внутреннее прерывание типа 1 (INT 1).
SF (Sign Flag) - флаг знака. Указывает на единичное значение старшего бита результата - признак отрицательного числа.
ZF (Zero Flag) - флаг нулевого результата.
AF (Auxiliary Flag) - флаг дополнительного переноса (заема) в тетраде для десятичной арифметики.
PF (Parity Flag) - флаг паритета, устанавливается при четном числе единиц результата.
CF (Carry Flag) - флаг переноса (заема) старшего бита в арифметических операциях. Этот флаг может быть программно установлен или сброшен специальными инструкциями (STC, CLC, CMC), благодаря этому свойству его широко используют для сигнализации условия завершения процедур (например, сигнализации об ошибках).
Указатель команд. Указатель команд EIP содержит смещение в текущем сегменте кода. Он непосредственно недоступен программисту и управляется явно командами передачи управления (переходы, возвраты и т. Д.), прерываниями и особыми случаями. Так как используется предвыборка команд в процессор, то значение EIP указывает на загружаемую в процессор команду, а не на выполняемую команду в процессоре.
