Для чего нужна технология ММХ



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

· данные имеют небольшое число разрядов;

· однотипные операции выполняются над многими данными;

· поток команд редко зависит от данных;

· нужна высокая производительность вычислений.

От применения технологии ММХ выигрывают именно такие программы. Особенности технологии ММХ

В основе технологии ММХ лежит расширение набора команд процессора с учетом потребностей современных мультимедиа-программ.

Команды технологии ММХ работают с новыми типами данных: 64-разрядными целочисленными данными, а также с данными, упакованными в группы (векторы) общей длиной 64 бита. Такие данные могут находиться в памяти или в восьми ММХ-регистрах. Эти регистры называются ммо, mmi, ..., мм7.

Одна команда - много данных

В технологии ММХ использована модель обработки данных SMD (single instruction, multiple data, т.е. одна команда - много данных). Это повышает производительность программ, поскольку одна команда обрабатывает несколько элементов данных одновременно. ММХ-команды обеспечивают параллельную обработку нескольких байтов, слов или двойных слов.

Пример, моделирующий работу двух графических программ. Если первая программа написана без ММХ-команд, то она обрабатывает лишь одну точку цветного изображения (8 бит) за одну команду. Во второй программе применена технология ММХ; ее команды способны обрабатывать 8 точек (64 бит) одновременно!

Типы данных

Команды технологии ММХ работают со следующими типами данных:

· упакованные байты (восемь байтов в одном 64-разрядном регистре)

· упакованные слова (четыре 16-разрядных слова в 64-разрядном регисте)

· упакованные двойные слова (два 32-разрядных слова в 64-разрядном регистре)

· 64-разрядные слова.

По-английски эти типы данных называются, соответственно, packed byte, packed word, packed doubleword и quadword.

Синтаксис команд

ММХ-команды имеют следующий синтаксис:

instruction [dest,src] Здесь instruction – имя команды,

dest обозначает выходной операнд, src - входной операнд.

Большинство команд имеют суффикс, который определяет тип данных и используемую арифметику:

us (unsigned saturation) - арифметика с насыщением, данные без знака.

s или ss (signed saturation) - арифметика с насыщением, данные со знаком. Если в суффиксе нет ни s, ни ss, используется циклическая арифметика (wraparound).

в, w, d, q указывают тип данных. Если в суффиксе есть две из этих букв, первая соответствует входному операнду, а вторая - выходному.

Например, ММХ-команда paddusw MM4,meml выполняет сложение слов без знака. Первые слагаемые находятся в ММХ-регистре MM4, вторые - в памяти по адресу meml. Суммы записываются в регистр MM4.

Результат вне допустимого диапазона

Большинство команд технологии ММХ обрабатывают данные в циклической арифметике, а некоторые команды используют арифметику с насыщением.

Циклическая арифметика. Если результат операции выходит за пределы допустимого диапазона, то "лишние" старшие биты результата отбрасываются. Например, сложение байтов 01Ьи FFh дает 00h.

Арифметика с насыщением. Если результат оказался вне допустимого диапазона, то он считается равным граничному значению диапазона. Например, при сложении байтов без знака сумма 01]и FFh считается равной FFh.

Данные со знаком и без знака

В арифметике с насыщением ММХ-команды сложения, вычитания и упаковки данных могут обрабатывать числа со знаком или без знака.

Данные со знаком и без знака имеют различный допустимый диапазон. Следовательно, если используется арифметика с насыщением, то при выходе результата операции за пределы допустимого диапазона в выходной операнд будут записаны различные значения в зависимости от типа данных. Например, если результат превысил 7FFFh, слово со знаком будет считаться равным 7FFFh, a слово без знака - нет.

Пример: при сложении слов со знаком 7F38h (32568) и 1707h (5895) слово-результат считается равным 7FFFh (32767). Математическая сумма оказалась больше предела 7FFFh, и произошло "насыщение". Если те же самые два значения сложить как слова без знака, то получится 963Fh (38463). В данном случае "насыщения" не происходит, так как результат меньше максимально возможного FFFFh.

Типы данных

ММХ-команды используют новые типы данных: упакованные байты (packed byte, суффикс команды Ь), упакованные слова (packed word, суффикс w), упакованные двойные слова (packed doubleword, суффикс d) и 64-разрядные слова (quadword, суффикс q).

Одни и те же 64 бита могут трактоваться одной ММХ-командой как 8 байт, другой командой - как 4 слова, и т.д. Тип данных определяется суффиксом команды.

Допустимый диапазон данных

тип данных минимальное значение максимальное значение
Байт со знаком 80h (-128) 7Fh (127)
Байт без знака 00h FFh (256)
Слово со знаком 8000h (-32768) 7FFFh (32767)
Слово без знака 0000h FFFFh (65535)

Двойное слово со знаком 80000000h (-2147483648) 7FFFFFFFh (2147483647)

Двойное слово без знака

00000000h FFFFFFFFh (4294967295)

 

Операнд

Большинство ММХ-команд имеет два операнда: выходной и входной. Обычно входная информация берется из обоих операндов; результат записывается в выходной операнд.

Пример: pand ММ2,ММ4

Здесь регистр мм2 - выходной операнд, регистр мм4 - входной. Эта команда вычисляет поразрядное логическое И между значениями в регистрах мм2 и мм4 и записывает результат в регистр мм2.

Арифметика с насыщением (saturation arithmetic)

Если команда использует арифметику с насыщением и результат операции превышает максимальное представимое значение, то в выходной операнд записывается это максимальное значение (происходит "насыщение").

Аналогично, если результат операции оказался меньше нижней границы допустимого диапазона, то в выходной операнд записывается минимально возможное значение. Например, если результат меньше 8000h, то 16-разрядное слово со знаком считается равным 8000h; если получилось больше 7FFFh, то слово со знаком считается равным 7FFFh.

Циклическая арифметика (wraparound arithmetic)

Если команда использует циклическую арифметику и результат операции выходит за двоичную разрядную сетку используемого типа данных, то "лишние" старшие биты результата отбрасываются. Иначе говоря, если результат превышает максимально возможное значение на n единиц, то результатом считается минимальное значение+n-l.

Примеры:

7FFFh + 0002h = 8001h

(32767 + 2 = -32767 или 32769)

FFFFh + 0002h = 0001h

(65535 +2=1 или -1+2=1)
Команда EMMS

Команда ЕММS присваивает значение 1 всем разрядам слова состояния регистров с плавающей запятой, что соответствует состоянию Empty. Это обеспечивает переход процессора из режима исполнения ММХ-команд в режим исполнения обычных команд с плавающей запятой.

Не забывайте ставить команду ЕММS в конце процедур, использующих ММХ-команды!

Команды сложения и вычитания

ММХ-команды сложения и вычитания работают с упакованными байтами, словами и двойными словами. Обрабатываются данные как со знаком, так и без знака.

Команды сложения Команды вычитанияpaddb/w/d

paddsb/w

paddusb/w

psubb/w/d

psubsb/w

psubusb/

 

Команды сдвига

ММХ-команды сдвига выполняют арифметический и логический сдвиг разрядов в элементах данных выходного операнда. При логическом сдвиге освободившиеся разряды заполняются нулями. При арифметическом сдвиге крайний из сдвигаемых битов "размножается" и заполняет все освободившиеся разряды.

 

Команды сдвига

psllw/d/q psraw/d psrlw/d/q

 

Логические команды

Эта группа ММХ-команд выполняет поразрядные логические операции над 64 битами данных.

Логические команды

pand  por

pandn pxor

 

Команды умножения

ММХ-команды умножения вычисляют произведения 16-разрядных слов своих операндов. Команда pmulhw записывает в каждое слово выходного операнда старшие 16 разрядов этих произведений, а команда pmullw - младшие 16 разрядов.

 

Команда pmaddwd попарно складывает произведения и записывает полученные суммы в 32-разрядные двойные слова выходного операнда.

Команды умножения

pmulhw pmullw pmaddwd

 

Команды сравнения

Эти ММХ-команды сравнивают элементы данных в операндах и генерируют маску в выходном операнде. ММХ-команды сравнения не устанавливают флагов (признаков).

 

Команды сравнения

pcmpeqb/w/d pcmpgtb/w/d

 

Команды упаковки и распаковки

ММХ-команды упаковки "укорачивают" элементы данных в своих операндах и записывают полученные короткие данные в выходной операнд. ММХ-команды распаковки составляют из элементов данных в своих операндах новые элементы данных удвоенной длины и записывают их в выходной операнд.

 

Команды упаковки Команды распаковки

packsswb/dw   punpckhbw/wd/dq

packuswd         punpcklbw/wd/dq

 

Команды передачи данных

ММХ-команды передачи данных выполняют копирование данных из одного ММХ- регистра в другой, а также пересылку между ММХ-регистрами, целочисленными регистрами и памятью.

 

Команды передачи данных

movd movq

Распаковка с "размножением" знака

Распаковка с "размножением" знакового бита часто требуется при преобразовании коротких типов данных к длинным.

 

Команда movq

Команда movq выполняет копирование 64 бит из одного ММХ-регистра в другой, а также из ММХ-регистра в память и обратно.

Команда pmaddwd

Команда pmaddwd попарно перемножает слова (со знаком) входного и выходного операнда, что дает четыре 32-разрядных произведения. Затем первое произведение складывается со вторым, а третье с четвертым. Полученные суммы записываются в 32- разрядные слова выходного операнда.

 

Команда paddd

Команда paddd складывает 32-разрядные слова входного операнда с 32-разрядными словами выходного операнда в

циклической арифметике.

 

Команда pcmpeqb

Команда pcmpeqb сравнивает байты входного операнда с соответствующими байтами выходного. Если байт выходного операнда равен байту входного, такой байт заполняется единицами, а если не равен, то он заполняется нулями.

 

Команда pand

Команда pand вычисляет поразрядное логическое И входного и выходного операнда. При выполнении этой команды значение 1 остается только в тех битах выходного операнда, для которых соответствующие биты обоих операндов на входе были равны 1.

 

Команда pandn

Команда pandn вычисляет обращение (поразрядное логическое НЕ) выходного операнда, а затем поразрядное логическое И между входным операндом и обращенным значением выходного.

 

Команда por

Команда por вычисляет поразрядное логическое ИЛИ входного и выходного операнда. При выполнении этой команды значение 1 записывается в те биты выходного операнда, для которых хотя бы один из соответствующих битов обоих операндов на входе был равен 1. В остальные биты записывается 0.

26. Функции DOS для вывода на экран - основные определения, особенности применения, обзор функций DOS для работы с клавиатурой.

Функции MS DOS для вывода данных на экран

 

 Для вывода данных на экран можно использовать два вида функций: универсальную функцию 40h (вывод в файл) и группу специализированных функций MS DOS вывода на экран.

 Использование функции 40h уже рассматривалось в разделе, посвященном работе с файлами. Материал, представленный ниже, посвящен второй группе функций — функциям MS DOS для вывода символов на экран. В группу входят три функции. Рассмотрим их.

 

 Вывод символа на экран (02h int 21h)

 

 Функция 02h позволяет вывести один символ на экран. Вход: АН » 02h — вывод символа; DL = символ для вывода.

 Функция 02h проверяет наличие в клавиатурном буфере символов нажатия комбинации Ctrl+C (Ctrl+Break), при обнаружении которых производится вызов прерывания int 23h. В процессе вывода функция реагирует на управляющие символы, такие как 0dh (возврат каретки), 0ah (перевод строки), 08h (курсор назад на один символ), 07h (звуковой сигнал) и т. д.

 Для того чтобы вывести строку, необходимо использовать цикл.

 

;выводим строку string на экран

 mov ex.len_string :длину строки

 lea si.string ;адрес строки

 mov ah. 02h ml: mov dl.byte ptr [si]

 int 21h

 inc si

 loop ml

 

 Прямой вывод символа на экран (06h int 21h)

 

 Функция 06h выводит один символ на экран. Эта функция универсальна, так как "используется и для ввода (см. выше), и для вывода символа.

 Вход: АН = 06h — вывод символа на экран; DL = символ для вывода (за исключением 0ffn).

 Функция 06h не проверяет наличие в буфере символов нажатия комбинации Ctrl+C (Ctrl+Break). Порядок использования данной функции аналогичен порядку использования функции 02h.

 

 Вывод строки на экран (09h int 21h)

 

 Функция 09h выводит строку символов на экран. Строка должна обязательно заканчиваться символом $. Данную функцию удобно использовать для вывода на экран различных диагностических сообщений. Если требуется организовать вывод строк, длина которых формируется динамически, то лучше либо использовать упомянутую выше функцию 40h, либо выводить их в цикле, тело которого содержит одну из функций 02h или 06h.

 Вход: АН = 09h — вывод строки на экран; DS: DX — адрес строки для вывода с завершающим символом $.

 Функция 09h проверяет наличие в клавиатурном буфере символов нажатия комбинации Ctrl+C (Ctrl+Break), при обнаружении которых производится вызов прерывания int 23h. В процессе вывода функция реагирует на управляющие символы, такие как 0dh (возврат каретки), 0ah (перевод строки), 08h (курсор назад на один символ), 07h (звуковой сигнал) и т. д.

 Приведенный ниже фрагмент показывает порядок применения функции 09h.

 

 :prg05_09.asm - программа вывода строки на экран функцией 09h int 21h

 .data

 string db "Строка для вывода функцией 09h $"

 adr_string dd string

 .code

 :выводим строку string на экран

 Ids dx.adr_string ;адрес строки в DS:DX

 mov ah.09h

 

Функции DOS для работы с клавиатурой

Функция 01h (Считать символ из STDIN с эхом, ожиданием и проверкой на Ctrl+Break)

Функция 02h (Вывести символ на STDOUT с проверкой на Ctrl+Break)

Функция 06h (Записать символ в STDOUT без проверки на Ctrl+Break)

Функция 07h (Считать символ из STDIN без эха, с ожиданием и без проверки на Ctrl+Break)

Функция 08h (Считать символ из STDIN без эха, с ожиданием и проверкой на Ctrl+Break)

Функция 09h (Записать строку в STDOUT с проверкой на Ctrl+Break)

Функция 0Аh (Считать строку символов из STDIN в буфер)

Функция 0Вh (Проверить состояние клавиатуры)

Функция 0Сh (Очистить буфер и считать символ)

Функция 0Eh (Установить текущий диск DOS)

Функция 19h (Получить текущий диск DOS)

Функция 1Bh (Получить информацию FAT (текущий диск))

Функция 1Сh (Получить информацию FAT (любой диск))

Функция 2Аh (Получить системную дату)

Функция 2Вh (Установить системную дату)

Функция 2Ch (Получить время)

Функция 2Dh (Установить время)

Функция 39h (Создать директорию)

Функция 3Аh (Удалить директорию)

Функция 3Вh (Сменить директорию)

Функция 3Ch (Создать файл)

Функция 3Dh (Открыть существующий файл)

Функция 3Eh (Закрыть файл)

Функция 3Fh (Чтение из файла или устройства)

Функция 40h (Записать в файл или устройство)

Функция 41h (Удалить файл)

Функция 47h (Определить текущую директорию)

 

Большинство функций DOS вызываются с помощью прерывания INT 21h. Перед вызовом прерывания нужно в регистр АН записать номер функции, которую нужно выполнить. Ниже приводятся основные функции DOS и рассмотрены некоторые примеры применения этих функций. После слова "Вход" следует список регистров и информации, которая должна быть записана в эти регистры перед вызовом прерывания. После слова "Выход" следует список регистров и информация, которая будет находиться в этих регистрах после выполнения прерывания.

Функция 02h (Вывести символ на STDOUT с проверкой на Ctrl+Break)

Вход: АН     02h

DL     символ, выводимый на устройство стандартного вывода

Выход: Нет    ---

 

 

 Эта функция посылает символ из регистра DL на устройство стандартного вывода. В DL можно записать как ASCII-код символа, так сам символ. В последнем случае символ заключается в одинарные кавычки. Если при выполнении этой функции была нажата комбинация клавиш Ctrl+Break, то выполняется прерывание INT 23h, которое по умолчанию осуществляет выход из программы.

 

 Данная функция обрабатывает некоторые управляющие символы:

Выводимый символ     Действие

BEL (07h)        появляется звуковой сигнал

BS (08h)           курсор перемещается на одну позицию влево

НТ (09h)          используется для замены на несколько пробелов

LF (0Ah)           перевод курсора на одну позицию вниз

CR (0Dh)          переход на начало текущей строки

 

 

Пример:

;========================================================================

;Эта программа выводит на экран подряд два символа "А" (латинские)

;------------------------------------------------------------------------

           .model tiny

           .code

           ORG  100h                  ;начало СОМ-файла

               

start:  MOV AH,    2         ;АН = 2

           MOV DL,    41h    ;DL = 41h (код символа А)

           INT    21h                    ;вызываем функцию DOS 02h

           MOV AH,    2         ;АН = 2

           MOV DL,    'A'       ;DL = 41h (код символа А)

           INT    21h                    ;вызываем функцию DOS 02h

               

           RET                                   ;Завершение программы

   END          start

;========================================================================

 

 Функция 06h (Записать символ в STDOUT без проверки на Ctrl+Break)

Вход: АН     06h

DL     ASCII-код символа (кроме 0FFh)

Выход: Нет    ---

 

 

 Эта функция не обрабатывает управляющие символы (символы CR, LF, HT и BS выполняют свои функции при выводе на экран, но сохраняются при перенаправлении вывода в файл) и не проверяет нажатие Ctrl+Break.

 

 Если DL = FFh, то эта функция считывает символ из STDIN без эха, без ожидания и без проверки на Ctrl+Break. При этом после выполнения прерывания ZF = 1 и AL = 0, если НЕ была нажата клавиша; ZF = 0 и AL = код символа, если клавиша была нажата.

 

Функция 09h (Записать строку в STDOUT с проверкой на Ctrl+Break)

Вход: АН     09h

DS:DX адрес строки

Выход: Нет    ---

 

 

 Эта функция выводит на стандартное устройство вывода (например, на монитор) строку символов. Адрес строки (первого символа строки) должен быть предварительно записан в DS:DX. Строка должна ОБЯЗАТЕЛЬНО заканчиваться символом $ (24h), который не будет выведен в STDOUT.

 

Пример:

;========================================================================

;Эта программа выводит на экран строку "Hello, World!!!"

;------------------------------------------------------------------------

           .model tiny

           .code

           ORG  100h                                  ;начало СОМ-файла       

start:  MOV AH,    9                         ;Номер функции 9

           MOV DX,    offset stroka    ;Адрес строки записываем в DX

           INT    21h

           RET                                                   ;завершение СОМ-файла               

stroka DB     'Hello, World!!!$' ;Строка для вывода         

   END          start

 

 


Дата добавления: 2018-04-04; просмотров: 548; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!