Добавил:
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. Регистры флагов. Данные в ассемблере. Операнды языка Ассемблер. Команды передачи управления.

Регистр флагов (рис. 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 функций.