Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать

Технология sse. Блок xmm

Начиная с Intel Pentium 3 микропроцессоры снабдили новой технологией SSE (Stream SIMD Extension, потоковое SIMD-расширение) для одновременной обработки чисел с плавающей точкой.

SSE - это 8 новых 128-битных регистров: XMM0-XMM7, позволяющие вместить четыре 32-битных числа или два 64-битных числа с плавающей точкой.

Для целочисленных переменных это значит одновременную обработку: 16 однобайтных, 8 двухбайтных, 4 4-байтных или 2 8-байтных чисел.

Затем в Pentium 4 появилась SSE2, принёсшая новые инструкции. Далее последовали SSE3 и SSSE3 (SSE4), дающие некоторый прирост производительности.

Кроме инструкций с новым блоком XMM технология SSE включает и дополнительные целочисленные инструкции с регистрами MMX, а также инструкции управления кэшированием.

Особенности новых технологий:

  1. В большинстве случаев отсутствуют признаки, характеризующие результат выполнения операции, которые обычно хранятся в регистре флагов (EFLAGS). При работе с целыми числами невозможно контролировать переполнение результата и надо изменять алгоритм вычислений так, чтобы исключить переполнение.

  2. При сравнении целых или вещественных чисел разряды, занимаемые каждым числом в группе первого операнда (приемника) либо заполняются единицами, либо очищаются. Все единицы являются признаком выполнения указанного в команде условия для данной пары чисел, все нули означают, что для данной пары условие не выполнено.

  3. Имеются специальные команды сравнения двух вещественных чисел. После их выполнения формируются и помещаются в eflags признаки, характеризующие результат операции.

Регистры флагов

Регистр флагов (рис. 3.2) (регистр признаков) — EFLAGS состоит из одноразрядных флагов, отображающих в основном текущее состояние арифметико-логического устройства. Разрядность eflags/flags - 32/16 бит. Младшая часть этого регистра полностью аналогична регистру flags для i8086.

Рис. 3.2. Содержимое регистра eflags

Флаги регистра eflags/flags можно разделить на три группы.

  • 8 Флагов состояния. Эти флаги могут изменяться после выполнения машинных команд;

  • 1 флаг направления. Обозначается как df (Directory Flag). Используется цепочечными командами;

  • 8 системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086.******

Таблица 2.1. Флаги состояния

Мнемоника флага

Флаг в eflags

Номер бита

Содержание и назначение

Cf

Флаг переноса (Carry Flag)

0

1, если арифметическая операция произвела перенос из старшего бита результата. Старшим является 7-й, 15-й или 31-й бит в зависимости от размерности операнда; 0 - переноса не было

Pf

Флаг чётности (Parity Flag)

2

1, если 8 младших разрядов (этот флаг - только для 8 младших разрядов операнда любого размера) результата содержат четное число единиц; 0, если 8 младших разрядов результата содержат нечетное число единиц

af

Вспомогательный флаг переноса (Auxiliary carry Flag)

4

1, если в результате предыдущей операции произошёл перенос (или заём) из третьего бита в четвёртый. Используется командами двоично-десятичной коррекции

zf

Флаг нуля (Zero Flag)

6

1, если результат нулевой; 0, если результат ненулевой

sf

Флаг знака (Sign Flag)

7

1, если старший бит результата равен 1; 0, если старший бит результата равен 0

of

Флаг переполнения (Overflow Flag)

11

Флаг of используется для фиксирования факта потери значащего бита при арифметических операциях: 1, если в результате операции происходит перенос (заем) в (из) старшего, знакового бита результата (биты 7, 15 или 31 для 8-, 16- или 32-разрядных операндов, соответственно); 0, если в результате операции не происходит переноса (заема) в (из) старшего, знакового бита результата

iopl

Уровень привилегий ввода-вывода (Input/Output Privilege Level)

12, 13

Используется в защищенном режиме работы микропроцессора для контроля доступа к командам ввода-вывода

nt

Флаг вложен ности задачи (Nested Task)

14

Используется в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую

Таблица 2.2. Системные флаги

Мнемоника флага

Флаг в eflags

Номер бита

Содержание и назначение

tf

Флаг трассировки (Trace Flag)

8

Если 1 - микропроцессор генерирует прерывание с номером 1 после выполнения каждой машинной команды.

if

Флаг прерывания (Interrupt enable Flag)

9

Предназначен для разрешения или запрещения (маскирования) аппаратных прерываний. 1 - аппаратные прерывания разрешены; 0 - аппаратные прерывания запрещены

rf

Флаг возобновления (Resume Flag)

16

Используется при обработке прерываний от регистров отладки

vm

Флаг виртуального 8086 (Virtual 8086 Mode)

17

1 - процессор работает в режиме виртуального 8086; 0 - процессор работает в реальном или защищенном режиме

ac

Флаг контроля выравнивания (Alignment Check)

18

Предназначен для разрешения контроля выравнивания при обращениях к памяти. Pentium разрешает размещать команды и данные с любого адреса. Если требуется контролировать выравнивание данных и команд по адресам, кратным 2 или 4, то установка данных битов приведет к тому, что все обращения по некратным адресам будут возбуждать исключительную ситуацию.

Vif

Флаг виртуального прерывания (Virtual Interrupt Flag)

19

При определенных условиях (одно из которых - работа микропроцессора в V-режиме) является аналогом флага if. Флаг vif используется совместно с флагом vip. Флаг появился в микропроцессоре Pentium

vip

Флаг отложенного виртуального прерывания (Virtual Interrupt Pending flag)

20

Устанавливается в 1 для индикации отложенного прерывания. Используется при работе в V-режиме совместно с флагом vif. Флаг появился в микропроцессоре Pentium

Id

Флаг идентификации (Identification flag)

21

Используется для того, чтобы показать факт поддержки микропроцессором инструкции cpuid, с помощью которой можно "запросить" у процессора его идентификатор CPUID.

Данные в ассемблере

Секции .data, .data? и .const нужны для определения данных программы. Место под данные резервируется с помощью директив db, dw, dd, dq, dt.

db - 1 байт

dw - 2 байта - 1 слово

dd - 4 байта - 2 слова

dq - 8 байт - 4 слова

dt - 10 байт

Все данные из секции .data включаются в исполнимый файл. В секции .data? данные нельзя инициализировать. Все данные в этой секции не включаются в исполнимый файл. Секция .const предназначена только для чтения. При попытке изменить эти данные ошибок не возникает.

.data

Perem dd 0000FF11h 0000 0000 0000 0000 1111 1111 0001 0001

X1 dw 01235h 0001 0010 0011 0101

Binary db 00111010b 00111010

decimal dw 28d 0001 1100

large dq 01123456789ABCDEFh 0001 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

.data?

Perem1 dd ? 0000 0000 0000 0000 0000 0000 0000 0000

Perem2 dq ? 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

Perem5 dw ? 0000 0000 0000 0000

Dd ? 0000 0000 0000 0000 0000 0000 0000 0000

Dw ? 0000 0000 0000 0000

Perem4 db ? 0000 0000

.const

Const1 dd 012345678h 0001 0010 0011 0100 0101 0110 0111 1000

dw 768d 0000 0011 0000 0000

Строки.

В ассемблере можно задавать только ANSI строки, Unicode строки сложнее задавать и для их обработки существует целый ряд API функций.