ВВЕДЕНИЕ В АРХИТЕКТУРУ х86/х86-64

Цели практической работы

  • 1. Знакомство с программной архитектурой х86/х86-64.
  • 2. Анализ ассемблерного листинга программы для архитектуры х86/х86-64.

Краткое описание архитектуры х86

Архитектура х86 в настоящий момент является самой распространенной программной архитектурой настольных и серверных вычислительных систем. Она используется с 1978 года, когда был выпущен 16- разрядный процессор i8086. Впоследствии архитектура была естественным образом расширена до 32-разрядной (IA-32), а затем и до 64- разрядной (х64, AMD64, х86-64, IA-32e, ЕМ64Т, Intel 64). При каждом очередном расширении сохранялась программная совместимость с предыдущим поколением архитектуры. При этом набор команд расширялся, а новые регистры большего размера включали в качестве своих частей регистры предыдущего поколения архитектуры.

Регистры. Программисту доступны следующие группы регистров:

  • • регистры общего назначения;
  • • регистры сопроцессора;
  • • регистры векторных расширений;
  • • регистр флагов;
  • • счетчик команд.

Регистры общего назначения используются для хранения произвольных целочисленных данных. В большинстве команд в качестве операндов эти регистры полностью взаимозаменяемы. На рис. П3.1 представлены регистры общего назначения архитектур х86 и х86-64. У каждого регистра отдельно доступна младшая часть размером 8, 16 или 32 бита. Например, младшая часть регистров Rx доступна по именам RxD (32 бита), RxW (16 бит) и RxB (8 бит), где х - число от 8 до 15.

П3.1. Регистры общего назначения

Рис. П3.1. Регистры общего назначения: а - регистры в архитектуре х86, б - регистры в архитектуре х86-64

Сопроцессор. Сопроцессор (FPU - Floating Point Unit) предназначен для выполнения операций над вещественными числами. С программной точки зрения сопроцессор содержит несколько управляющих регистров, а также блок из восьми регистров данных разрядностью 80 бит, организованных в стек (рис. П3.2). Номер регистра, являющегося текущей вершиной стека, хранится в специальном поле регистра состояния (указателе вершины стека). Операция push уменьшает значение указателя на единицу и помещает данные в регистр, являющийся новой вершиной стека. Операция pop записывает данные с вершины стека в память или регистр и увеличивает указатель на единицу.

Инструкции сопроцессора адресуют регистры либо явно, либо неявно. Неявная адресация (без указания конкретного регистра) подразумевает использование регистров, находящихся на вершине стека. Явная адресация подразумевает указание смещения регистра относительно вершины стека. Например: st(0) регистр на вершине стека, st( 1) — следующий за ним и т. д.

Векторные расширения. Векторные расширения реализуют технологию SIMD-вычислений. На рис. П3.2 показаны регистры сопроцессора, ММХ и 3DNow! Характеристики основных векторных расширений архитектуры х86/х86-64 представлены в табл. П3.1.

П3.2. Регистры сопроцессора, MMX и 3DNow!

Рис. П3.2. Регистры сопроцессора, MMX и 3DNow!

Название

Размер

регистра,

бит

Число

регистров

Имена

регистров

Типы элементов данных, размер в битах

ММХ

64

8

mm0-mm7

цел.: 8,16,32,64

3DNow!

64

8

mm0-mm7

вещ.: 32

SSE, ...

128

8/16

xmm0-xmml5

цел.: 8,16,32,64, вещ.: 32, 64

AVX

256

16

ymm0-ymml5

цел.: 8,16,32,64, вещ.: 32, 64

Задание к практической работе

  • 1. Изучить программную архитектуру х86/х86-64:
    • • набор регистров;
    • • основные арифметико-логические команды;
    • • способы адресации памяти;
    • • способы передачи управления;
    • • работу со стеком;
    • • вызов подпрограмм;
    • • передачу параметров в подпрограммы и возврат результатов;
    • • работу с арифметическим сопроцессором;
    • • работу с векторными расширениями.
  • 2. Для программы на языке Си (см. варианты в приложении 1) сгенерировать ассемблерные листинги для архитектуры х86 и архитектуры х86-64, используя следующие уровни комплексной оптимизации компилятора: без оптимизации, минимальный уровень оптимизации, максимальный уровень оптимизации.
  • 3. Проанализировать полученные листинги и сделать следующее.
  • • Сопоставить команды языка Си с машинными командами.
  • • Определить размещение переменных языка Си в программах на ассемблере (в каких регистрах, в каких ячейках памяти).
  • • Описать и объяснить оптимизационные преобразования, выполненные компилятором.
  • • Продемонстрировать использование ключевых особенностей архитектур х86 и х86-64 на конкретных участках ассемблерного кода.
  • • Сравнить различия в программах для архитектуры х86 и архитектуры х86-64.
  • 4. Выполнить полученную программу под управлением отладчика GDB в режиме машинных кодов.
  • • Запустить программу в режиме отладки.
  • • Установить точку останова на начало вычислительного цикла.
  • • Выполнить по шагам несколько итераций вычислительного цикла (внутреннего, если имеются вложенные циклы).
  • • Распечатать и включить в отчет распечатку стека вызовов функций для произвольной команды внутри вычислительного цикла.
  • 5. Составить отчет по практической работе. Отчет должен содержать:
    • • титульный лист;
    • • цель практической работы;
    • • полный компилируемый листинг реализованной программы и команды для ее компиляции;
    • • листинг программы на ассемблере, сгенерированный компилятором;
    • • список оптимизационных преобразований, выполненных компилятором, со ссылками на соответствующие места в ассемблерных листингах;
    • • стек вызовов функций для произвольной команды внутри вычислительного цикла;
    • • вывод по результатам практической работы.

Варианты заданий

Варианты заданий взять из практической работы «Определение времени работы прикладных программ».

Контрольные вопросы

  • 1. Назовите различия архитектур х86 и х86-64.
  • 2. Что означает обратная совместимость архитектуры х86-64 с архитектурой х86?
  • 3. Почему в программах следует избегать лишних обращений в память?
  • 4. Как зависимости между командами влияют на процесс выполнения программы? Как компилятор и процессор борются с ними?
 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >