
- •Юрий Магда Ассемблер для процессоров Intel Pentium
- •Аннотация
- •Юрий Магда Ассемблер для процессоров Intel Pentium Введение
- •Структура книги
- •От издательства
- •Глава 1 Базовая архитектура процессоров Intel x86
- •Глава 2 Основы создания приложений на языке ассемблера
- •2.1. Ассемблирование исходного текста
- •2.2. Компоновка программ
- •Глава 3 Синтаксис языка ассемблера
- •3.1. Представление данных в компьютере
- •3.2. Первичные элементы языка ассемблера
- •3.3. Программная модель процессора Intel Pentium
- •Глава 4 Структура программы на языке ассемблера
- •4.1. Организация сегментов
- •4.2. Директивы управления сегментами и моделями памяти макроассемблера masm
- •4.3. Структура программ на ассемблере masm
- •Глава 5 Организация вычислительных циклов
- •5.1. Условные переходы и ветвления
- •5.2. Команда безусловного перехода jmp
- •5.3. Организация циклов
- •5.4. Оптимизация кода в процессорах Intel Pentium
- •Конец ознакомительного фрагмента.
От издательства
Ваши замечания, предложения и вопросы отправляйте по адресу электронной почты: comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
Все исходные тексты, приведенные в книге, вы можете найти по адресу http:// www. piter.com/download.
Подробную информацию о наших книгах вы найдете на веб‑сайте издательства: http://www.piter.com.
Глава 1 Базовая архитектура процессоров Intel x86
Успешное применение языка ассемблера невозможно без знания архитектуры процессоров Intel. Процессоры Intel в настоящее время доминируют на рынке, и многие архитектурные решения, на основе которых они построены, в той или иной степени используются и другими производителями процессоров. Поскольку все современные процессоры Intel базируются на архитектуре 8086, то обычно говорят об архитектуре Intel x86.
Вкратце рассмотрим эволюцию процессоров фирмы Intel. В 1979 г. фирма Intel первой выпустила 16‑разрядный микропроцессор 8086, возможности которого были близки к возможностям процессоров мини‑компьютеров 70‑х годов. Микропроцессор 8086 стал базовым для целого семейства процессоров, которое называют семейством 80x86 или х86.
Чуть позже появился процессор 8088, архитектурно совместимый с процессором 8086 и имеющий 16‑разрядные регистры, но оперирующий с внешними данными размером в 8 бит. В 1981 г. появились процессоры 80186/80188, наследующие базовую архитектуру процессоров 8086, но обладающие дополнительными возможностями. Это поколение включало дополнительные аппаратно‑программные компоненты: контроллер прямого доступа к памяти, счетчик/таймер и контроллер прерываний. Кроме того, система команд этих процессоров была расширена. Несмотря на это, широкого распространения данные процессоры не получили.
Следующим этапом в разработке новых идей стал процессор 80286. В этой модели были использованы новые подходы, которые применялись в микрокомпьютерах и больших компьютерах. Процессор 80286 мог работать в двух режимах: в режиме реальных адресов (эмуляция процессора 8086) и в защищенном режиме виртуальных адресов (protected virtual address mode), который предоставлял новые возможности для программистов. В этом режиме можно было работать с расширенным адресным пространством памяти размером в 16 Мбайт, также поддерживались виртуальная память и мультизадачность.
Новый 32‑разрядный процессор 80386 позволил успешно решить две основные задачи: он обеспечивал совместимость с предыдущими поколениями процессоров и одновременно повышал производительность выполнения программ. Совместимость с процессорами 8086 достигалась за счет включения в аппаратно‑программную архитектуру режима реальной адресации (real address mode).
В этом режиме процессор 80386 мог выполнять 16‑разрядный программный код процессора 80286 без каких‑либо ограничений. В этом же режиме он мог запускать 32‑разрядные программы, что повышало производительность системы. В 32‑разрядном режиме были реализованы новые возможности процессора 80386: масштабированная индексная адресация памяти, ортогональное использование регистров общего назначения, новые команды и средства отладки. Адресное пространство памяти позволяло работать с 4 Гбайт данных.
По сравнению с предыдущими поколениями процессоров процессор 80386 обеспечивал большее быстродействие (3‑4 миллиона операций в секунду) и возможность работы со страничной виртуальной памятью.
В 1989 г. фирма Intel выпустила процессор i486, содержащий более миллиона транзисторов в чипе. Являясь полностью программно совместимым с процессорами 386, он предоставлял новые возможности по обеспечению многозадачности систем и многоуровневого кэширования. Встроенная система тестирования позволяла проверять работоспособность аппаратной логики, кэш‑памяти и аппаратного постраничного преобразования адресов памяти. Отладочные средства обеспечивали установку ловушек контрольных точек в исполняемом коде и во время доступа к данным. Процессор i486 имел встроенный аппаратный кэш для хранения 8 Кбайт команд и данных, что увеличивало быстродействие системы, одновременно уменьшая степень использования процессором внешней шины.
Следующим шагом в повышении производительности компьютерных систем стало появление процессоров Intel Pentium. По сравнению с процессором i486 был добавлен второй конвейер команд, что дало более высокую скорость выполнения команд. Оба конвейера команд, обозначаемые и и v, при совместной работе обеспечивают выполнение двух инструкций процессора за один машинный цикл.
Размер встроенного кэша первого уровня увеличен в два раза, при этом для команд и данных используется по 8 Кбайт памяти. В процессоре применяются более эффективные по сравнению с i486 алгоритмы прямой (write‑through) и обратной записи (write‑back).
В процессорах Intel Pentium впервые был использован так называемый алгоритм прогнозирования программных ветвлений и циклов (branch prediction). С помощью такого алгоритма обеспечивается более эффективное управление потоком команд программы. Адреса прогнозируемых переходов хранятся в аппаратно реализованной таблице ветвлений. Кроме этого, в Intel Pentium были внесены аппаратные расширения, позволяющие более эффективно работать в режиме виртуального процессора 8086 с адресным пространством в 4 Мбайт и размером страницы 4 Кбайт.
Основные регистры процессора остались 32‑разрядными, но были добавлены внутренние шины передачи данных размерностью в 128 и 256 бит, что обеспечивает более быстрый обмен данными внутри процессора. Кроме того, внешняя шина данных в процессоре позволяет работать с 64‑разрядными данными.
В процессоре Intel Pentium сочетаются высокая производительность, совместимость, интеграция данных и наращиваемость. Это достигается за счет того, что процессор обладает:
– суперскалярной архитектурой;
– раздельным кэшированием программного кода и данных;
– блоком прогнозирования адреса перехода;
– высокопроизводительным блоком операций с плавающей точкой;
– расширенной 64‑разрядной шиной данных;
– поддержкой многопроцессорного режима работы;
– средствами задания размера страницы памяти;
– средствами обнаружения ошибок и функциональной избыточности;
– возможностями для управления производительностью.
Совместимая только с Intel суперскалярная двухконвейерная промышленная архитектура процессора Intel Pentium позволяет ему достичь нового уровня производительности посредством выполнения более чем одной команды за один такт. Термин «суперскалярная» обозначает процессорную архитектуру, которая содержит более одного вычислительного блока. Все эти вычислительные блоки, или конвейеры, являются узлами, где происходят все основные процессы обработки данных и команд. Они позволяют выполнить значительно большее число команд за одно и то же процессорное время по сравнению с предыдущими поколениями процессоров.
Появление суперскалярной архитектуры процессора Intel Pentium представляет собой естественное развитие предыдущего семейства процессоров с 32‑разрядной архитектурой фирмы Intel. Например, процессор i486 способен выполнять несколько своих команд за один такт, в то время как предыдущие семейства процессоров фирмы Intel требовали множества циклов тактовой частоты для выполнения одной команды.
Другим важным усовершенствованием, реализованным в процессорах Pentium, является раздельное кэширование. Кэширование повышает производительность посредством активизации места временного хранения часто используемых программного кода и данных, получаемых из быстрой памяти, заменяя по возможности обращение к внешней системной памяти для некоторых команд.
Раздельное кэширование позволяет выполнять несколько команд одновременно. Кэш‑память программного кода и данных процессора Pentium содержит по 8 Кбайт информации и организована как набор двухканального ассоциативного кэша. Такая кэш‑память предназначена для записи только предварительно просмотренного 32‑байтового сегмента, причем работает быстрее, чем внешний кэш. Все это потребовало использования 64‑разрядной внутренней шины данных, которая обеспечивает возможность двойного кэширования и суперскалярной конвейерной обработки одновременно с загрузкой последующих данных.
Кэш данных имеет два интерфейса, по одному для каждого из конвейеров, что позволяет ему обеспечивать данными две отдельные инструкции в течение одного машинного цикла. После того как данные извлекаются из кэша, они записываются в основную память в режиме обратной записи. Подобная техника кэширования дает лучшую производительность по сравнению с простым кэшированием с непосредственной записью, при котором процессор записывает данные одновременно в кэш и в основную память. Тем не менее процессор Intel Pentium способен динамически конфигурироваться для поддержки кэширования с непосредственной записью.
Блок прогнозирования адреса перехода позволяет повысить производительность, предварительно определив правильный набор выполняемых команд и полностью заполнив ими конвейеры.
Процессор Intel Pentium дает возможность выполнять математические вычисления на более высоком уровне благодаря использованию усовершенствованного встроенного блока операций с плавающей точкой, который включает в себя 8‑тактовый конвейер и аппаратную реализацию основных математических функций. 4‑тактовые конвейерные команды для операций с плавающей точкой дополняют 4‑тактовую целочисленную конвейеризацию. Большая часть команд, оперирующих данными с плавающей точкой, может выполняться в одном целочисленном конвейере, после чего помещается в конвейер операций с плавающей точкой. Обычные операции с плавающей точкой, такие, как сложение, умножение и деление, реализованы аппаратно для ускорения процесса вычислений.
В результате этих усовершенствований процессор Intel Pentium выполняет команды для операций с плавающей точкой в пять раз быстрее, чем работающий на частоте 33 МГц процессор i486, оптимизируя их для высокоскоростных вычислений в мультимедийных приложениях, а также в 3D– и CAD/CAM‑прило‑жениях.
К числу аппаратных нововведений следует отнести и более совершенный программируемый контроллер прерываний (Advanced Programmable Interrupt Controller, APIC), позволяющий создавать системы с несколькими процессорами Intel Pentium. Но самым радикальным усовершенствованием процессоров Intel Pentium стало внедрение технологии ММХ (MultiMedia extensions – мультимедийные расширения). В технологии ММХ для организации параллельных вычислений над упакованными 64‑разрядными целыми числами используется модель SIMD (Single Instruction, Multiple Data – одна команда, много данных). Параллельная обработка целочисленных данных не требует дополнительных регистров процессора – задействуются регистры математического сопроцессора. Технология ММХ позволила существенно повысить производительность мультимедийных приложений, программ обработки звука и изображений, программ криптографии и сжатия данных.
Для аппаратуры компьютера процессор Intel Pentium представляет собой 32‑разрядное устройство. Внешняя шина данных к памяти является 64‑разрядной, что обеспечивает передачу удвоенного объема данных за один цикл шины. Процессор поддерживает несколько типов циклов, включая цикл пакетного режима, в течение которого в кэш данных передается 256‑разрядный пакет данных.
Шина данных является главной магистралью, которая передает информацию между процессором и подсистемой памяти. Благодаря 64‑разрядной шине данных процессор Intel Pentium существенно повысил скорость передачи – до 528 Мбайт/с для 66 МГц по сравнению со 160 Мбайт/с для 50 МГц процессора i486. Эта расширенная шина данных поддерживает высокоскоростные вычисления за счет одновременной загрузки командами и данными процессорного блока, благодаря чему достигается еще большая общая производительность процессора Intel Pentium по сравнению с процессором i486.
Первые модели процессора Intel Pentium работали на частоте 60 и 66 МГц и обменивались данными с внешней кэш‑памятью второго уровня по 64‑разрядной шине данных, работающей на тактовой частоте процессорного ядра. Однако здесь есть некоторые сложности. При возрастании скорости процессора Intel Pentium все сложнее становится и дороже обходится его согласование с электронным интерфейсом на материнской плате.
По этой причине быстрые процессоры Intel Pentium используют делитель частоты для синхронизации внешней шины путем задания меньшей частоты. Например, у процессора Intel Pentium с частотой 100 МГц внешняя шина работает на частоте 66 МГц, а у процессора с частотой 90 МГц – на частоте 60 МГц. Процессор задействует одну и ту же шину для доступа к основной памяти и к периферийным подсистемам, таким, как шина PCI.
Дальнейшим усовершенствованием процессоров Intel Pentium стала модель Р6, выпущенная в 1995 г. Это поколение процессоров базировалось на суперскалярной архитектуре, что позволило без перехода на другую технологию изготовления кристалла значительно повысить производительность. Первым процессором семейства Р6 стал Intel Pentium Pro. Далее были разработаны более совершенные процессоры этой линейки, известные как Intel Pentium II, Intel Pentium II Xeon, Intel Celeron, Intel Pentium III и Intel Pentium III Xeon.
Появление процессора Pentium Pro ознаменовало собой значительный шаг вперед по сравнению с Intel Pentium. Несмотря на то что в процессоре Intel Pentium впервые была реализована суперскалярная форма архитектуры х86, она имела определенные ограничения. В этой архитектуре имеется всего два целочисленных конвейера, которые могут обрабатывать две команды параллельно, но только если они следуют друг за другом – здесь отсутствует алгоритм, позволяющий предсказывать ветвления в программе.
В процессоре Pentium Pro реализована новая модель суперскалярной архитектуры, позволяющая одновременно выполнять пять команд. Внедрение такой архитектуры позволило достичь высокой пропускной способности, но одновременно потребовало значительного улучшения схемы кэширования. По сравнению с обычным процессором Intel Pentium, в Pentium Pro пришлось расширить файл регистров, повысить глубину очереди упреждающей выборки и условного выполнения команд, усовершенствовать алгоритм прогнозирования адресов перехода и реализовать обработку данных не в порядке их поступления, а по мере их готовности.
Суперскалярная архитектура процессора Pentium Pro позволяет выполнять максимум три машинные команды в течение одного цикла. Кроме того, в процессоре используется концепция динамического выполнения команд (изменение порядка выполнения команд, улучшенный алгоритм прогнозирования ветвлений и опережающего выполнения команд). Суперскалярная архитектура реализована с помощью трех блоков декодирования команд, работающих параллельно. Команды разбиваются на так называемые микрооперации, которые выполняются параллельно в пяти исполнительных модулях: двух целочисленных, двух FPU (Floating‑Point Unit) и одном модуле интерфейса памяти.
В программно‑аппаратную архитектуру процессора входит и специальный модуль отложенных операций (retirement unit), позволяющий выполнять последовательность микроопераций в нужном порядке даже при наличии ветвлений.
По сравнению с процессором Intel Pentium, в Pentium Pro был увеличен размер кэша второго уровня (2nd‑level cache) до 256 Кбайт. Процессор Pentium Pro имеет 36‑разрядную адресную шину, позволяющую расширить пространство физических адресов до 64 Гбайт.
В процессоры Pentium Pro встроена вторичная кэш‑память, соединенная с центральным процессором отдельной шиной. Эта кэш‑память, представляющая собой статическое (static) оперативное запоминающее устройство (Random Access Memory, RAM) емкостью 256 или 512 Кбайт, значительно повышает производительность вычислительных систем на основе Pentium Pro.
В процессоры Intel Pentium II семейства Р6 была включена поддержка технологии ММХ. Что касается процессоров Pentium II Xeon, то в них были сконцентрированы все преимущества предыдущих поколений процессоров Intel. Это поколение процессоров было разработано с 4– и 8‑кратной масштабируемостью, а также с кэшем второго уровня, имеющим размер 2 Мбайт. Этот процессор предназначается в основном для высокопроизводительных серверов и рабочих станций.
Еще один представитель линейки – процессор Intel Celeron – базируется на архитектуре IA‑32 и предназначен для применения в настольных компьютерах. К особенностям этого процессора следует отнести наличие встроенного кэша второго уровня размером 128 Кбайт, а также низкую стоимость.
Значительный шаг вперед был сделан при разработке процессора Intel Pentium III, в котором была реализована технология SSE (Streaming SIMD Extensions – потоковые SIMD‑расширения). Эта технология является дальнейшим развитием технологии ММХ. В ней используются 128‑разрядные регистры для выполнения параллельных операций с упакованными числами с плавающей точкой. Кроме того, в процессорах Pentium III Xeon для повышения производительности имеется улучшенный кэш передачи данных (advanced transfer cache).
Процессор Intel Pentium 4 является последним в линейке процессоров фирмы Intel, базирующихся на архитектуре IA‑32, причем здесь была использована микроархитектура NetBurst. В основе этой микроархитектуры лежит оригинальная разработка Intel, позволяющая процессору функционировать на более высокой тактовой частоте, что значительно повышает производительность Pentium 4 по сравнению с предыдущими поколениями процессоров. Микроархитектура NetBurst имеет следующие особенности:
– улучшенное схемотехническое и конструктивное исполнение, обеспечивающее высокую производительность операций (rapid execution engine);
– поддержка технологии Hyper Pipelined;
– поддержка технологии Advanced Dynamic Execution;
– принципиально новая система кэширования команд‑данных;
– поддержка технологии SSE2 (Streaming SIMD Extensions 2), которая обеспечивает расширение возможностей технологий ММХ и SSE фирмы Intel за счет включения в систему команд 128‑разрядной целочисленной арифметики и 128‑разрядной арифметики чисел с плавающей точкой двойной точности;
– гибкая система управления кэшированием данных и памятью.
Аппаратно микроархитектура NetBurst реализована в виде быстродействующей (400 МГц) системной шины, обладающей впечатляющими возможностями по обработке данных:
– производительность операций – до 3,2 Гбайт/с, что более чем в 3 раза превышает производительность Pentium III;
– тактовая частота шины – 100 МГц с возможностью учетверения скорости (400 МГц);
– высокая степень конвейеризации транзакций;
– возможность доступа к 128‑разрядным данным посредством 64‑разрядных элементов;
– совместимость с существующим программным обеспечением и операционными системами, разработанными для архитектуры IA‑32.