Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/2256: Рейтинг темы: голосов - 2256, средняя оценка - 4.63
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16374 / 7686 / 1080
Регистрация: 11.11.2010
Сообщений: 13,761
14.11.2013, 10:29  [ТС]
ГЛАВА 10
АРИФМЕТИЧЕСКИЕ КОМАНДЫ
(часть 3/7)


Команды сложения и вычитания упакованных чисел
Для работы с мультимедиа-приложениями микропроцессор IA32/64 использует параллельную обработку массива однородных данных.
ММХ, SSE и SSE2 используют следующие типы данных:
  • двойное учетверенное слово – простое 128-битное число;
  • учетверенное слово – простое 64-битное число;
  • упакованные учетверенные слова – два 64-битных двойных слова, упакованные в 128-битный тип данных. Учетверенное слово 1 занимает биты 127–64, и учетверенное слово 0 занимает биты 63–0;
  • упакованные двойные слова – два или четыре 32-битных двойных слова, упакованные в 64- или в 128-битный тип данных. Двойное слово 3 занимает биты 127–96, двойное слово 0 занимает биты 31–0;
  • упакованные слова – четыре или восемь 16-битных слова, упакованные в 64- или в 128-битный тип данных. Слово 7 занимает биты 127–111, слово 0 занимает биты 15–0;
  • упакованные байты – восемь или шестнадцать байт, упакованных в 64- или в 128-битный тип данных. Байт 15 занимает биты 127–119, байт 0 занимает биты 7–0.
Команды ММХ, SSE и SSE2 перемещают упакованные данные в память или в обычные регистры как целое, но выполняют арифметические и логические операции над каждым элементом по отдельности.
Арифметические операции в ММХ, SSE и SSE2 могут использовать специальный способ обработки переполнений и антипереполнений – насыщение. Если результат операции больше, чем максимальное значение для его типа данных (+127 для байта со знаком), то результат считают равным этому максимальному значению. Если он меньше минимального значения – соответственно его полагают равным минимально допустимому значению.
Подробнее об арифметических операциях ММХ
MMX-команды используют восемь 64-разрядных регистров. К регистрам обеспечивается прямой доступ по именам: MM0..MM7. Никакие другие команды не могут обращаться к этим регистрам. Физически регистры MMX размещены в мантиссах регистров FPU (биты 0-63). Таким образом, при записи любого значения в MMX-регистр это значение попадает в один из регистров FPU.
При выполнении MMX-команд:
  • все биты порядка и знаковый бит в соответствующем регистре FPU заполняются единицами (это биты 64-79);
  • все слово состояния регистров FPU заполняется нулями.
При исполнении всех MMX-команд (кроме EMMS) «портится» слово состояния регистров FPU. Поэтому, при совместном использовании команд FPU и MMX, не забывайте перед применением блока команд MMX сохранять контекст сопроцессора, а после использования блока команд MMX ставить команду EMMS и восстанавливать контекст FPU. Если этого не делать, то
  • операции с плавающей запятой будут давать неверные результаты;
  • иногда в результате операций с плавающей запятой будут генерироваться исключения типа Stack overflow.
Арифметические MMX-команды работают с упакованными байтами и словами со знаком и без знака, а также с упакованными двойными словами со знаком. Они могут использовать как циклическую арифметику, так и арифметику с насыщением.
Команда EMMS
Команда EMMS присваивает значение 1 всем разрядам слова состояния регистров с плавающей запятой, что соответствует состоянию Empty. Это обеспечивает переход процессора из режима исполнения MMX-команд в режим исполнения команд FPU.
Циклическая арифметика (wraparound arithmetic)
Если команда использует циклическую арифметику и результат операции выходит за двоичную разрядную сетку используемого типа данных, то «лишние» старшие биты результата отбрасываются. Иначе говоря, если результат превышает максимально возможное значение на n единиц, то результатом считается минимальное значение + n – 1.
Примеры:
Code
1
2
3
4
7FFFh + 0002h = 8001h
(32767 + 2 = -32767 или 32769)
0FFFFh + 0002h = 0001h
(65535 + 2 = 1 или -1 + 2 = 1)
Арифметика с насыщением (saturation arithmetic)
Если команда использует арифметику с насыщением и результат операции превышает максимальное представимое значение, то в выходной операнд записывается это максимальное значение (происходит «насыщение»). Подробности смотри в таблице 10.3.1.
Аналогично, если результат операции оказался меньше нижней границы допустимого диапазона, то в выходной операнд записывается минимально возможное значение.
Например, если результат меньше 8000h, то 16-разрядное слово со знаком считается равным 8000h; если получилось больше 7FFFh, то слово со знаком считается равным 7FFFh.

Допустимый диапазон данных
ТипМинимальное значение Максимальное значение
данныхhex dec hex dec
Байт со знаком 80h –128 7Fh 127
Байт без знака 00h 0 0FFh 256
Слово со знаком 8000h –32768 7FFFh 32767
Слово без знака 0000h 0 0FFFFh 65535
Двойное слово со знаком 80000000h –2147483648 7FFFFFFFh 2147483647
Двойное слово без знака 00000000h 0 0FFFFFFFFh 4294967295
Таблица 10.3.1
Команды сложения циклической арифметики
PADDB/PADDW/PADDD/PADDQ

(Сложение = «PACKED ADDITION BYTES/WORDS/
DOUBLE WORDS/QUAD WORDS)»
Синтаксис команд:
PADDx <DEST>,<SRC>
Возможные варианты команды PADDx:
padd(b/w/d/q) mmx,mmx/m64
padd(b/w/d/q) xmm,xmm/m128

 P PII K6 3D! 3Mx+ SSE SSE2 A64 SSE3 E64T
PADDx ? ? ? ? ? ? ? ? ?
PADDQ      ? ? ? ?
Семантика команды PADDx: команда PADDx складывает отдельные элементы данных (байт – для PADDB, слов – для PADDW, двойных слов – для PADDD, учетверенных слов – для PADDQ) операнда DEST и соответствующие элементы операнда SRC и записывает результат сложения в операнд DEST. Если при сложении возникает перенос, он не влияет ни на следующие элементы, ни на флаг переноса, а просто игнорируется (так например, для PADDB –128+(–1)=+127, если это числа со знаком, или 255+1=0, если без знака).
Псевдокод команды PADDx :
https://www.cyberforum.ru/cgi-bin/latex.cgi?DEST \leftarrow DEST + SRC
 31...24 23...16 15...08 07...00
mm0 5Fh(95) 0E7h(231) 83h(131) 0Bh(11)
mm1 55h(85) 25h(37) 67h(103) 0BBh(187)
paddb mm0,mm1 5Fh(95)
+55h(85)
0B4h(180)
0E7h(231)
+25h(37)
[1]0Ch(268–256=12)
83h(131)
+67h(103)
0EAh(134)
0Bh(11)
+0BBh (187)
0C6h(198)

Команды сложения данных со знаком
и данных без знака (арифметика насыщения)
PADDSB/PADDSW/PADDUSB/PADDUSW

(Сложение байтов/слов со знаком/без знака с насыщением =
«Packed ADDition Bytes/Word with Signed/ Unsigned Saturation»)
Синтаксис команд:
PADDSx <DEST>,<SRC>
Возможные варианты команды PADDx:
padds(b/w) mmx,mmx/m64
paddus(b/w) mmx,mmx/m64
padds(b/w) xmm,xmm/m128
paddus(b/w) xmm,xmm/m128

 P PII K6 3D! 3Mx+ SSE SSE2 A64 SSE3 E64T
PADDSx ? ? ? ? ? ? ? ? ?
PADDUSx ?? ? ? ? ? ? ? ?
Семантика команды PADDSx: команда PADDSx складывает отдельные элементы данных (байт – для PADDSB, слов – для PADDSW) операнда DEST и соответствующие элементы операнда SRC и записывает результат сложения в операнд DEST. Если результат сложения выходит за пределы байта со знаком для PADDSB (больше +127 или меньше –128) или слова со знаком для PADDSW (больше +32767 или меньше –32768), в качестве результата используется соответствующее максимальное или минимальное число, так что, например, для PADDSB –128+(–1)= –128.
 31...24 23...16 15...08 07...00
mm0 5Fh(95) 0E7h(–25) 83h(–125) 0Bh(11)
mm1 55h(85) 25h(37) 67h(103) 0BBh(–69)
paddsb mm0,mm1 5Fh(95)
+55h(85)
07Fh(180)
0E7h(–25)
+25h(37)
0Ch(12)
83h(–125)
+67h(103)
0EAh(–22)
0Bh(11)+
0BBh(–69)
0C6h(–58)
Семантика команды PADDUSx: команда PADDUSx складывает отдельные элементы данных (байт – для PADDSUB, слов – для PADDUSW) операнда DEST и соответствующие элементы операнда SRC и записывает результат сложения в операнд DEST. Если результат сложения выходит за пределы байта без знака для PADDUSB (больше 255 или меньше 0) или слова без знака для PADDUSW (больше 65535 или меньше 0), в качестве результата используется соответствующее максимальное или минимальное число, так что, например, для PADDUSB 255+1=255.
 31...24 23...16 15...08 07...00
mm0 5Fh(95) 0E7h(231) 83h(131) 0Bh(11)
mm1 55h(85) 25h(37) 67h(103) 0BBh(187)
paddusb mm0,mm1 5Fh(95)
+55h(85)
0B4h(180)
0E7h(231)
+25h(37)
0FFh(255)
83h(131)
+67h(103)
0EAh(234)
0Bh(187)
+0BBh(11)
0C6h(198)
Команды вычитания циклической арифметики
PSUBB/PSUBW/PSUBD/PSUBQ

(Вычитание упакованных байтов/слов/двойных/учетверенных слов =
Packed SUBTRUCT Bytes/Words/Double words/Quad words”)
Синтаксис команд:
PSUBx <DEST>,<SRC>
Возможные варианты команды PSUBx:
psub(b/w/d/q) mmx,mmx/m64
psub(b/w/d/q) xmm,xmm/m128


 P PII K6 3D! 3Mx+ SSE SSE2 A64 SSE3 E64T
PSUBx ? ? ? ? ? ? ? ? ?
PSUBQ      ? ? ? ?
Семантика команды PSUBx: Команда PSUBx вычитает отдельные элементы данных (байт – для PSUBB, слов – для PSUBW, двойных слов – для PSUBD, учетверенных слов – для PSUBQ) операнда DEST и соответствующие элементы операнда SRC и записывает результат вычитания в операнд DEST. Если при вычитании возникает заем, он не влияет ни на следующие элементы, ни на флаг переноса, а просто игнорируется (так, например, для PSUBB 0–1=255, если это числа без знака, или –128–1=+127, если со знаком).
Псевдокод команды PSUBx :
https://www.cyberforum.ru/cgi-bin/latex.cgi?DEST \leftarrow DEST - SRC
 31...24 23...16 15...08 07...00
mm0 5Fh(95) 0E7h(231) 83h(131) 0Bh(11)
mm1 55h(85) 25h(37) 67h(103) 0BBh(187)
psubb mm0,mm15Fh(95)
55h(85)
0Ah(10)
0E7h(231)
25h(37)
0C2h(12)
83h(131)
67h(103)
1Ch(28)
[1]0Bh(11)
0BBh(187)
50h(256–176=80)
Команды вычитания упакованных данных со знаком
и данных без знака (арифметика насыщения)
PSUBSB/PSUBSW/PSUBUSB/PSUBUSW

(Вычитание байтов/слов со знаком/без знака с насыщением =
SUBSTRACT Packed Bytes/Words with Signed/Unsigned Saturation”)
Синтаксис команд:
PSUBx <DEST>,<SRC>
Возможные варианты команды PSUBx:
psubs(b/w) mmx,mmx/m64
psubus(b/w) mmx,mmx/m64
psubs(b/w) xmm,xmm/m128
psubus(b/w) xmm,xmm/m128

 P PII K6 3D! 3Mx+ SSE SSE2 A64 SSE3 E64T
PSUBSx  ? ? ? ? ? ? ? ? ?
PSUBUSx  ? ? ? ? ? ? ? ? ?
Семантика команды PSUBSx: команда PSUBSx вычитает отдельные элементы данных (байт – для PSUBSB, слов – для PSUBSW) операнда DEST и соответствующие элементы операнда SRC и записывает результат вычитания в операнд DEST. Если результат вычитания выходит за пределы байта со знаком для PSUBSB (больше +127 или меньше –128) или слова со знаком для PSUBSW (больше +32767 или меньше –32768), в качестве результата используется соответствующее максимальное или минимальное число, так что, например, для PSUBSB –128–100= –128.
 31...24 23...16 15...08 07...00
mm0 5Fh(95) 0E7h(–25) 83h(–125) 0Bh(11)
mm1 55h(85) 25h(37) 67h(103) 0BBh(–69)
psubsb mm0,mm1 5Fh(95)
55h(85)
0Ah(10)
0E7h(–25)
25h(37)
0C2h(–62)
83h(–125)
67h(103)
80h(–128)
0Bh(11)
0BBh(–69)
50h(80)
Семантика команды PSUBUSx: команда PSUBUSx вычитает отдельные элементы данных (байт – для PSUBSUB, слов – для PSUBUSW) операнда DEST и соответствующие элементы операнда SRC и записывает результат вычитания в операнд DEST. Если результат вычитания выходит за пределы байта без знака для PSUBUSB (больше 255 или меньше 0) или слова без знака для PSUBUSW (больше 65535 или меньше 0), в качестве результата используется соответствующее максимальное или минимальное число, так что, например, для PSUBUSB 0–1=0.
 31...24 23...16 15...08 07...00
mm0 5Fh(95) 0E7h(231) 83h(131) 0Bh(11)
mm1 55h(85) 25h(37) 67h(103) 0BBh(187)
psubsub mm0,mm15Fh(95)
55h(85)
0Ah(10)
0E7h(231)
25h(37)
0C2h(194)
83h(131)
67h(103)
1Ch(28)
0Bh(11)
0BBh(187)
00h(00)


Продолжение
Миниатюры
Электронный учебник   Электронный учебник   Электронный учебник  

Электронный учебник   Электронный учебник   Электронный учебник  

Электронный учебник   Электронный учебник   Электронный учебник  

Электронный учебник   Электронный учебник   Электронный учебник  

Электронный учебник  
Изображения
  
0
Закрытая тема Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru