kпециальность 123 ±« dомпьютерная инженерия»; 01...

42
1 Презентация не содержит весь материал лекции. И, поэтому, не может заменить посещение лекции студентом Лекция № 7 Параллельная обработка целочисленных данных на ассемблере (ММХ команды) 1. Общие сведения о командах ММХ-расширения. 2. ММХ-команды. Лектор: к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич [email protected], http://blogs.kpi.kharkov.ua/v2/asm/ «Системное программирование» НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ “Харьковский политехнический институт” Кафедра “Вычислительная техника и программирование” Специальность 123 – «Компьютерная инженерия»; специализации: 123-01 «Компьютерные системы и сети»; 123-02 «Системное программирование»; 123-03 «Программирование компьютерных игр и мобильных приложений»; Специальность 125 – «Кибербезопасность» Литература: (вся информация на сайте http://blogs.kpi.kharkov.ua/v2/asm/knigi) 1. Рысованый АН. Системное программирование, Ч.1. Программирование в среде masm64 : учеб.-метод. пособие / А.Н. Рысованый. – Харьков : «Слово», 2017. – 108 с.– На рус. яз. 2. Рысованый А.Н. Системное программирование, Ч.2. Расширенные возможности программирования в среде masm64 : учеб.-метод. пособие / А.Н. Рысованый. – Харьков : «Слово», 2017. – 140 с. – На рус. яз. 3. http://blogs.kpi.kharkov.ua/v2/asm/knigi/ 4. masm32.com сайт Steve Hutchesson 5. wasm.in - сайт Mikl___

Upload: others

Post on 29-May-2020

24 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

111

Презентация не содержит весь

материал лекции. И, поэтому,

не может заменить посещение

лекции студентом

Лекция № 7

Параллельная обработка целочисленных данных на ассемблере(ММХ команды)

1. Общие сведения о командах ММХ-расширения.

2. ММХ-команды.

Лектор: к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

[email protected], http://blogs.kpi.kharkov.ua/v2/asm/

«Системное программирование»

НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

“Харьковский политехнический институт”

Кафедра “Вычислительная техника и программирование”Специальность 123 – «Компьютерная инженерия»;

специализации:

123-01 «Компьютерные системы и сети»;

123-02 «Системное программирование»;

123-03 «Программирование компьютерных игр и мобильных приложений»;

Специальность 125 – «Кибербезопасность»

Литература: (вся информация на сайте http://blogs.kpi.kharkov.ua/v2/asm/knigi)1. Рысованый АН. Системное программирование, Ч.1. Программирование в среде masm64 : учеб.-метод. пособие /

А.Н. Рысованый. – Харьков : «Слово», 2017. – 108 с.– На рус. яз.

2. Рысованый А.Н. Системное программирование, Ч.2. Расширенные возможности программирования в среде masm64

: учеб.-метод. пособие / А.Н. Рысованый. – Харьков : «Слово», 2017. – 140 с. – На рус. яз.

3. http://blogs.kpi.kharkov.ua/v2/asm/knigi/

4. masm32.com – сайт Steve Hutchesson

5. wasm.in - сайт Mikl___

Page 2: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

Команды ММХ - это команды параллельной обработки целых чисел для

использования в мультимедийных приложениях (расширениях) (Multimedia

extensions - мультимедийные расширения – обработка сигналов (видео),

распознавание речи, 3Dмоделирование…). Они предназначены для одновременной

обработки нескольких элементов данных за одну инструкцию.

Команды технологии ММХ работают с типами данных: 64-разрядными

целыми числами, а также с данными, упакованными в группы общей

длиной 64 бита. Такие данные могут находиться в памяти или в восьми

ММХ-регистрах, которые отражаются как ММ0 - ММ7. Эти регистры

являются частями регистров стека математического сопроцессора R0 - R7.

Команды MMX-расширения (технология ММХ) выполняются в том же

режиме процессора, что и команды с плавающей точкой.

1. Общие сведения о командах ММХ- расширения

2

MMX (Multimedia Extensions — мультимедийные расширения) — коммерческое название

дополнительного SIMD набора инструкций, разработанного компанией Intel и впервые представленного

в 1997 году одновременно с линией процессоров Pentium MMX. Набор инструкций был предназначен

для ускорения процессов кодирования/декодирования потоковых аудио и видеоданных. Является

развитием технологий, предложенных в микропроцессоре i860. Разработан в лаборатории Intel в Хайфе,

Израиль, в первой половине 1990-х.

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 3: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

Из 80-разрядных регистров стека сопроцессора используются

только 64 разряда, а стековая организация, которая нужна для

операций сопроцессора, не используется.

При общем использовании математического сопроцессора и

MMX-расширения последней выполняемой MMX- командой

должна быть команда emms – освобождение Рг сопроцессора.

Обработка данных MMX-расширения может выполняться одним из двух

способов: с использованием циклической арифметики (wraparound

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

Если команда использует циклическую арифметику и результат

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

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

допустимого числа этого результата.

Если команда использует арифметику с насыщением и результат

операции превышает максимальное мнимое значение, то в исходный

операнд записывается это максимальное значение (происходит

“насыщение”).

3

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 4: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

Первой буквой ММХ-команд является буква “p”, например paddb.

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

используемую арифметику:

us (unsigned saturation) - беззнаковое насыщение, при котором, если результат

операции превышает максимальное значение, в исходный операнд

записывается это максимальное значение (происходит “насыщение”). Если

результат операции оказался меньше нижнего предела допустимого диапазона,

то в исходный операнд записывается минимально возможное значение;

s или ss (signed saturation) - знаковое насыщение, при котором используется

арифметика с насыщением, данные со знаком;

если в суффиксе нет ни символа s, ни символов ss, то применяется

циклическая арифметика (wraparound). Если в этом случае результат операции

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

“лишние” старшие биты результата отбрасываются;

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

суффиксе есть две из этих букв, то первая из них отвечает входному операнду, а

вторая - выходному.

4

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 5: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

ММХ-команды условно можно разделить на группы:

- команды передачи данные между регистрами MMX и

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

- арифметические команды (сложение, вычитание, умножение и

комбинация умножения и сложения);

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

- команды сравнения на равенство или по величине;

- логические команды;

- команды сдвига (логического и арифметического) (арифметический

сдвиг - сохранение знака числа);

- команды управления состоянием (очистка ММХ - установление

признаков пустых регистров в слове тэгов).

Система команд ММХ:

5

2. ММХ-команды

См. http://www.codenet.ru/progr/optimize/mmx.php

http://osinavi.ru/my/Assembler.phpк.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 6: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

6

Краткий

список

ММХ-команд

Page 7: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

7

Page 8: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

8

Page 9: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

9

См. https://en.wikipedia.org/wiki/X86_instruction_listings#MMX_instructions_added_with_MMX+_and_SSE

Page 10: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

10

К командам передачи данных относятся:

movd – передача 32-разрядного числа;

movq - передача 64-разрядного числа.

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

MOVD mm, mm/m32/ir32 - команда копирует 32 бита из младших разрядов

MMX-регистра, либо из памяти, либо из целочисленного регистра в младшие

32 разряда MMX-регистра (старшие разряды заполняются нулями).

MOVD m32/ir32, mm - команда копирует 32 бита из младших разрядов

MMX-регистра в память либо в целочисленный регистр.

MOVQ mm, mm/m64 - команда пересылки данных в MMX-регистр.

MOVQ mm/m64, mm - команда пересылки данных из MMX-регистра.

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

MOVD mm, r/m32

MOVD r/m32, mm

MOVQ mm/m64, mm

MOVQ mm, mm/m64

MOVQ mm, r/m64

MOVQ r/m64, mm ; r???

https://en.wikipedia.org/wiki/X86_instruction_listings#MMX_instructions_added_with_MMX+_and_SSE

Page 11: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

11

Команды сложения paddb, paddw, paddd, paddq — циклическая арифметика;

paddsb, paddsw — знаковое насыщение;

paddusb, paddusw — беззнаковое насыщение.

Приемник – всегда ММХ-регистр,

источник — память или ММХ-регистр.

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

PADDB/W/D/Q mm, mm/m64 - команды складывают элементы данных (B/W/D/Q) входного и

выходного операнда. Если сумма выходит за границу допустимого диапазона, то по правилам

циклической арифметики избыток отсчитывается от другой границы диапазона. "Переноса"

единицы из одного элемента данных в другой не происходит.

PADDSB/W - команды складывают элементы данных (байты или слова) входного и выходного

операнда. Если сумма выходит за граничное значение допустимого диапазона, то результатом

считается это граничное значение.

PADDUSB mm, mm/m64; PADDUSW mm, mm/m64 - команды складывают элементы данных

(байты или слова) входного и выходного операнда. Если сумма выходит за граничное значение

допустимого диапазона, то результатом считается это граничное значение.

PADDB mm, mm/m64

PADDW mm, mm/m64

PADDD mm, mm/m64

PADDQ mm, mm/m64

PADDSB mm, mm/m64

PADDSW mm, mm/m64

PADDUSB mm, mm/m64

PADDUSW mm, mm/m64

Page 12: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

12

Команды вычитания

psubb, psubw, psubd — циклическая арифметика;

psubsb, psubsw — знаковое насыщение;

psubusb, psubusw — беззнаковое насыщение.

PSUBB/W/D/Q mm, mm/m64 - команды вычитают элементы данных входного операнда из

элементов данных выходного операнда. Если результат выходит за границу допустимого

диапазона, то по правилам циклической арифметики соответствующее число единиц

отсчитывается от другой границы диапазона. "Переноса" единицы из одного элемента данных в

другой не происходит.

PSUBSB/W mm, mm/m64 - команды вычитают элементы данных (байты или слова) входного

операнда из элементов данных выходного операнда. Если разность выходит за граничное значение

допустимого диапазона, то результатом считается это граничное значение.

PSUBUSB/W mm, mm/m64 - команды вычитают элементы данных входного операнда из

элементов данных выходного операнда. Если разность выходит за граничное значение

допустимого диапазона, то результатом считается это граничное значение.

PSUBB mm, mm/m64 - Subtract packed byte integers

PSUBW mm, mm/m64 - Subtract packed word integers

PSUBD mm, mm/m64 - Subtract packed doubleword integers

PSUBQ mm1, mm2/m64 - Subtract quadword integer

PSUBSB mm, mm/m64 - Subtract signed packed bytes with saturation

PSUBSW mm, mm/m64 - Subtract signed packed words with saturation

PSUBUSB mm, mm/m64 - Subtract unsigned packed bytes with saturation

PSUBUSW mm, mm/m64 - Subtract unsigned packed words with saturation

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 13: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

13

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

pmulhw — в результирующем регистре сохраняются старшие разряды

четырех 32-битных произведений;

pmullw — в результирующем регистре сохраняются младшие разряды

четырех 32-битных произведений;

pmaddwd — после получения четырех 32-разрядных произведений, первое

складывается со вторым, а третье с четвертым.

Команды деления отсутствуют

ММХ-команды попарно (параллельно) перемножают операнды. Все команды формируют

результат по принципу циклической арифметики.

PMADDWD mm, mm/m64 0F F5 /r Multiply packed words, add adjacent doubleword results

PMULHW mm, mm/m64 0F E5 /r Multiply packed signed word integers, store high 16 bits of results

PMULLW mm, mm/m64 0F D5 /r Multiply packed signed word integers, store low 16 bits of results

PMULUDQ mm1, mm2/m64 0F F4 /r Multiply unsigned doubleword integer

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 14: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

14

include \masm64\include64\masm64rt.inc ; .data mas1 db 1,2,3,4,5,6,7,8mas2 DB 9,8,7,6,5,4,3,2len1 equ ($-mas2)mas3 db len1 dup(?)mas4 db len1 dup(255)tit1 db "Сравнение времени обработки массива. masm64 ",0ifmt db "Время обработки командами общ. назначения: %d",10,10,"Время обработки MMX: %d",10,10,"Автор программы: Рысованый А.Н., каф. ВТП, НТУ ХПИ",0buf1 dq 0.code entry_point proclea rsi,mas1 ; загрузка адреса массива mas1lea rbx,mas2 ; загрузка адреса массива mas2lea rdi,mas3 ; загрузка адреса массива mas3lea r13,mas4 ;rdtsc ; edx,eaxshl rdx,32 ; смещение в свободную ст. частьadd rdx,rax ; ст. и мл. части в одном регистреmov r14,rdx ;

mov rcx,len1 ;@@: mov al,[rsi]

add al,byte ptr [rbx]mov byte ptr [r13],alinc rsi ; inc rbx ;inc r13 ;

loop @brdtsc ; edx,eaxshl rdx,32 ; смещение в свободную ст. частьadd rdx,rax ; ст. и мл. части в одном регистреsub rdx,r14 ;mov r14,rdx ;

rdtsc ; edx,eaxshl rdx,32 ; смещение в свободную ст. частьadd rdx,rax ; ст. и мл. части в одном регистреmov r15,rdx ;

movq mm0,qword ptr [rsi] ; занесение 8 байтов mas1paddb MM0,qword ptr [rbx] ; mas1 + mas2movq qword ptr [rdi],MM0 ; результат

rdtsc ; edx,eax

shl rdx,32 ; смещение в свободную ст. часть

add rdx,rax ; ст. и мл. части в одном регистре

sub rdx,r15 ;

mov r15,rdx ;

invoke wsprintf,ADDR buf1,ADDR ifmt,r14,r15

invoke MessageBox,0,addr buf1,addr tit1,

MB_ICONINFORMATION;

invoke ExitProcess,0

entry_point endp

end

Программа сравнения времени сложения двух массивов

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Правильное (и полное) получение числа тактов:rdtsc ; edx,eaxshl rdx,32 ; смещение в свободную ст. частьadd rdx,rax ; ст. и мл. части в одном регистреmov r14,rdx

Page 15: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

15

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 16: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

Рассмотрим результат сложения двух массивов :

1, 20000, 30000, 40000, 100, 50000, 3, 50000, 6000

2, 40000, 50000, 25538, 200, 40000, 1, 0, 60000

3, 60000, 14464, 2, 300, 24464, 4, 50000, 464

+

Команда сложения слов paddw формирует результат по принципу

циклического насыщения, что означает следующее: если сумма для формата

слова превышает предел максимально допустимого числа 65 536, то

результат получается как разница между полученным числом и этим

пределом.

Например,

30 000 + 50 000 = 80 000, 80 000 – 65 536 = 14 464.

Для того, чтобы посмотреть, как работает арифметическая команда с

циклическим насыщением, используем команду paddw сложения 16-

разрядных чисел.

16

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 17: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

Текст. Программа перевода больших букв в малые с помощью

команды циклического параллельного сложения байтов paddb :include \masm64\include64\masm64rt.inc ; библиотеки

.data

mas1 DB " STUDENTS OF THE UNIVERSITY"

len1 EQU $-mas1 ; вычисление количества байтов

mas2 DB len1 DUP (20h) ; резервирование со значением 20h

mas3 db len1 DUP(' '),10,10, ; массив сохранения

"Автор программы: Рысованый А.Н., каф. ВТП, НТУ ХПИ",0

titl1 db "Параллельное сложение массивов с помощью команд ММХ",0

.codeentry_point proc

mov EAX, len1 ; загрузка количества байтов

mov EBX, 8 ; максимальное количество слов

xor EDX, EDX ; инициализация перед делением

div EBX ; определение количества циклов по 8 байтов

mov ECX, EAX ; количество циклов для параллельной обработки

lea rsi, mas1 ; загрузка адреса массива mas1

lea rbx, mas2 ; загрузка адреса массива mas2

lea rdi, mas3 ; загрузка адреса массива mas317

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 18: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

m1:

movq MM0,qword ptr [rsi] ; занесение 8 байтов массива mas1 в ММ0

paddb MM0,qword ptr [rbx] ; mas1 + mas2

movq qword ptr [rdi], MM0 ; сохранение результата

add rsi,8 ; смещение на 64 разряда адреса данных массива

add rdi,8 ; смещение на 64 разряда адреса данных массива

add rbx,8 ; подготовка нового адреса данных массива

loop m1 ; перейти на m1, если ecx /= 0

cmp EDX,0 ; сравнение остатка

jz exit ; перейти на exit, если EDX = 0 (z = 1)

mov ECX,EDX ; количество циклов для последовательной обработки

m2: mov AL,byte ptr [rsi]

add AL,20h

mov byte ptr [rdi], AL

inc rsi ; rsi := rsi + 1

inc rdi ; rdi := rdi + 1

dec ECX ; ecx := ecx – 1

jnz m2 ; перейти на m2, если не нуль (есх /= 0)

exit:

invoke MessageBox,0,addr mas3,addr titl1,MB_ICONINFORMATIONinvoke ExitProcess,0entry_point endpend 18

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 19: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

19

http://www.industrialnets.ru/files/misc/ascii.pdf

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 20: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

20

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 21: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

Текст. Сложение двух массивов данных с помощью команды paddw:include \masm64\include64\masm64rt.inc ; библиотеки

.data ; директива определения данные

mas1 dw 1, 20000, 30000, 40000, 100, 40000, 3, 50000, 6000

mas2 dw 2, 40000, 50000, 25538, 200, 40000, 1, 0, 60000

len1 EQU ($-mas2)/ type mas2 ; вычисление количества двойных слов mas2

sum dw len1 DUP(0),0 ; резервирование байтов под переменную sum

sum2 dq len1 DUP(0),0 ; резервирование байтов под переменную sum

_title db "Результат параллельного сложения массивов. ММХ. masm64",0

buf dd len1 DUP(0),0 ; буфер вывода сообщения

ifmt db "Ответ =", len1 dup(" %I64d "),10,10,

"Автор программы: Рысованый А.Н., каф. ВТП, НТУ ХПИ",0

.code

entry_point proc

mov rax,len1 ; счетчик чисел в массиве

mov rbx,4 ; количество одновременно занесенных чисел в ММХ

xor rdx,rdx ; сложение по модулю 2 (обнуление)

div rbx ; eax := 4 – количество циклов edx := 1

mov rcx,rax ; загрузка счетчика

lea rsi,mas1 ; esi := addr mas1

lea rdi,mas2 ; edi := addr mas2

21

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Префикс I64 в (" %I64d ") для вывода

64-разрядных данных.

Page 22: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

22

m1: movq MM0,qword ptr [rsi] ;paddw MM0,qword ptr [rdi] ; параллельное циклическое сложениеmovq qword ptr [rbx],MM0add rsi,8 ; подготовка адреса mas1 к новому считываниюadd rdi,8 ; подготовка адреса mas2 к новому считываниюadd rbx,8 ; подготовка адреса sum к новому считываниюloop m1 ; ecx := ecx – 1 но переход, если ecx /= 0

cmp rdx,0 ; определение остатка необработанных элементов массивовjz exit ; если элементы закончились, то перейти на exitmov rcx,rdx ; занесение в счетчик количества необработанных чисел

m2: mov eax,dword ptr [rsi] ; занесение необработанного элемента из mas1add eax,dword ptr [rdi] ; сложение элементов двух массивовmov dword ptr [rbx],eax ; результатadd rsi,2 ; подготовка к выборке элемента из mas1add rdi,2 ; подготовка к выборке элемента из mas2add rbx,2 ; подготовка к записи результата в памятьloop m2 ; ecx := ecx – 1 и переход, если ecx /= 0exit:

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 23: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

23

movzx rsi,sum

movzx rdi,sum[2]

movzx r10,sum[4]

movzx r11,sum[6]

movzx r12,sum[8]

movzx r13,sum[10]

movzx r14,sum[12]

movzx r15,sum[14]

movzx rax,sum[16]

invoke wsprintf,ADDR buf,ADDR ifmt,rsi,rdi,r10,r11,r12,r13,r14,r15,rax

invoke MessageBox,0,addr buf,addr _title,MB_ICONINFORMATION

invoke ExitProcess,0

entry_point endp

end

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 24: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

24

Извлечение байта/слова/дв. слова/учетвер. слова

(V)PEXTRB, (V)PEXTRW, (V)PEXTRD, (V)PEXTRQ

PEXTRB reg32/reg64/m16, xmm, imm8

PEXTRW reg32/reg64, mmx, imm8

PEXTRW reg32/reg64, xmm, imm8

PEXTRW reg32/m16/m64, xmm, imm8

PEXTRD reg32/mem32, xmm, imm8

VPEXTRD reg32/mem32, xmm, imm8

PEXTRQ reg64/mem64, xmm, imm8

VPEXTRQ reg64/mem64, xmm, imm8

reg32 – целочисленный регистр;

m16 – 16-разрядный Рг косвенного адреса ячейки памяти;

imm8 – const.

Примеры:

PEXTRB ECX,XMM2,3

PEXTRB [SI],XMM2,3

PEXTRW ECX,MM2,3

PEXTRW ECX,XMM2,3

PEXTRW [SI],XMM2,3

PEXTRW RCX,XMM2,3

PEXTRW [RSI],XMM2,3

PEXTRW R9,XMM10,3

PEXTRD ECX,XMM2,3

PEXTRD [RSI],XMM2,3

PEXTRD [SI],XMM2,3

PEXTRQ RCX,XMM2,3

PEXTRQ [RSI],XMM2,3

PEXTRQ [R9D],XMM13,3

Page 25: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

25

Команда PEXTRW копирует слово (W),

заданное третьим операндом команды

(imm8), из операнда-источника (MMX-

регистр) в младшее слово операнда-

назначения (регистр общего назначения).

include \masm64\include64\masm64rt.inc ; библиотеки.data mas1 dw 10, 20,30,40 ; mas2 dw 100,200,300,400 ; res dd 2 dup(0),0titl1 db "ММХ-команда pextrw. masm64",0info1 db " Использование команды ММХ - pextrw.",10,10,"Задание: распаковать из чисел первого массива первое слово,",0Ah,0Dh,"а из второго массива второе слово, результат записать в новый массив.",10,10,"Автор программы: Рысованый А.Н., каф. ВТП, НТУ ХПИ",10,10,"Результирующий массив:"buf1 dd 128 dup (?),0fmt1 db " %d, %d",0 ; %X - hex, %d - dec.codeentry_point proclea rsi,mas1 ; адрес mas1lea rdi,mas2 ; адрес mas2lea rbx,res ; адрес результатовmovq MM0,qword ptr [rsi] ; занесение в ММ0 элемента mas1movq MM1,qword ptr [rdi] ; занесение в ММ1 элемента mas2

pextrw eax,MM0,0 ; из ММ0 первое слово в eaxmovsxd r14,eax ; результатpextrw eax,MM1,1 ; из ММ1 в eax

movsxd r15,eax ; результатinvoke wsprintf,ADDR buf1,ADDR fmt1,r14,r15;invoke MessageBox,0,ADDR info1,ADDR titl1,0invoke ExitProcess,0entry_point endpend

PEXTRB/W/D/Q

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 26: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

26

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 27: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

ММХ-команды упаковки и распаковки данных

ММХ-команды упаковки превращают длинные элементы

данных (16- и 32-разрядные слова) в короткие. Если начальное

значение не вмещается в коротком формате данных, то

происходит насыщение.

27

packsswb, packssdw — преобразуют 16-битные или 32-битные знаковые данные

в 8-битные и 16-битные соответственно

packuswb — преобразует 16-битные данные со знаком в 8-битные без знака

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 28: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

ММХ-команды сравненияММХ-команды сравнения делятся на две группы:

➢ команды обычного сравнения (равняется или не равняется);

➢ команды сравнения с величиной (больше или меньше).

movq MM0,qword ptr mas1;

pcmpeqb MM0,qword ptr mas2 ; попарное сравнение на равенство

movq qword ptr res,MM0 ; сохранение результата в памяти

mov r12,qword ptr res

movq MM1,qword ptr mas1

pcmpgtb MM1,qword ptr mas2 ; попарное сравнение на больше

movq qword ptr res+8,MM1

mov r14,qword ptr res+8

invoke wsprintf,ADDR buf1,ADDR fmt1,r12,r14

invoke MessageBox,0,ADDR buf1,ADDR titl1,0

invoke ExitProcess,0

entry_point endp

end

Текст. Программа параллельного

сравнения двух массивов целых чисел

размером в байт каждый:include

\masm64\include64\masm64rt.inc.datamas1 DB -1, -2, 3, 4, 0, 0, 12, -8mas2 DB -1, -2, 3, 4, 0, 1, 12, -8res DB 16 DUP (5)titl1 db "ММХ-команды сравнения.

masm64",0fmt1 db "r12=%016I64xh сравнение

на равенство",10,"r14=%016I64xh сравнение на

больше",0 buf1 dq 0,0.codeentry_point proc

28

Если элемент данных выходного операнда равен соответствующему

элементу входного, такой элемент выходного операнда заполняется

единицами. Если равенства нет, он заполняется нулями.

pcmpeqb, pcmpeqw, pcmpeqd — попарное сравнение. Если соответствующие части равны, то в регистре-

приемнике устанавливается 1, если не равны, то 0;

pcmpgtb, pcmpgtw, pcmpgtd — попарное сравнение. Если соответствующие части источника больше, то в

регистре-приемнике устанавливается 1, если не больше – 0

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

%016I64xh – 016 цифр для вывода;I64 – платформа х64;

х – 16-ричная система счисления

Page 29: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

29

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 30: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

Пример . Выполнить операцию параллельного сложения с помощью ММХ-команд над

массивами целых чисел. Если второе слово больше 55, то выполнить операцию

a – c/b – dc (-4,83), где a = 2,7; b = 8,05; c = 2,2; d = 3,3;

иначе – выполнить операцию a – c/b (2,43) .

include \masm64\include64\masm64rt.inc

fpuDiv macro _a,_c,_b ; макрос с именем fpuDiv

fld _c

fdiv _b

fld _a

fsubr

endm ;; окончание макроса.data

_a REAL4 2.8_b REAL4 8.05_c REAL4 2.2_d REAL4 3.3arr1 dw 1,2,3,4 ; массив чисел arr1 размером в словоlen1 equ ($-arr1)/type arr1 ; количество чисел массиваarr2 dw 5,6,7,5 ; массив чисел arr2 размером в словоlen2 equ ($-arr2)/type arr2 ; количество чисел массиваarr1_2 BYTE (len1+len2) dup(0) ; размер буфера для чисел массивовtit1 db "FPU-MMX Result",0 ; название окошкаsms1 dd 0 ; длЯ вывода сообщенияifmt db "Oтвет = %I64d ",0

.code 30

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 31: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

31

entry_point procmovq MM1,QWORD PTR arr1 ; загрузка массива чисел arr1movq MM2,QWORD PTR arr2 ; загрузка массива чисел arr2paddb MM1,MM2 ; параллельное циклическое сложениеmovq QWORD PTR arr1_2,MM1 ; сохранение результатаpextrw eax,MM1,1 ; копирование из ћћ0 слова в eax

emms ; последняя MMX-командаcmp eax,55jg @1 ; if >jmp @2@1: fpuDiv [_a],[_c],[_b] ; a-c/bfld _dfmul _cfsubfisttp sms1 ; сохранение целочисленного значения и округление в сторону нуля

jmp @3@2: fpuDiv [_a],[_c],[_b] ; a-c/bfisttp sms1 ; сохранение целочисленного значения и округление в сторону нуля@3:invoke wsprintf,ADDR buf1,ADDR ifmt,sms1invoke MessageBox,0,addr buf1,addr tit1,MB_ICONQUESTIONinvoke ExitProcess,0entry_point endpend

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 32: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

32

Предыдущий пример с выводом через MessageBoxIndirect и выводом в файл

Используются файлы:— MMX64-5-1.asm;— MMX64-5-1.rc;— smail6.ico;— makeit.bat;— MMX64-5-1.txt (должен быть получен).

Файл MMX64-5-1.rc:#define IDI_ICON 1001IDI_ICON ICON DISCARDABLE «smail6.ico»

Не забудьте переименовать командный файл makeitRC.bat. Надо использовать файл, который компилирует и ресурсы.

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Файл makeit.bat::: вывод выполняющихся строк на экран@echo off:: установка переменнойset appname=%1

\masm64\bin64\ml64.exe /c %appname%.asm\masm64\bin64\rc.exe %appname%.rc\masm64\bin64\link.exe /SUBSYSTEM:WINDOWS /ENTRY:entry_point /nologo/LARGEADDRESSAWARE %appname%.obj %appname%.res

:: вывод списка файлов dir %appname%.*

:: удаление файла *.objdel %appname%.objdel %appname%.respause

Page 33: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

33

include \masm64\include64\masm64rt.incIDI_ICON EQU 1001MSGBOXPARAMSA STRUCT

cbSize DWORD ?,?hwndOwner QWORD ?hInstance QWORD ?lpszText QWORD ?lpszCaption QWORD ?dwStyle DWORD ?,?lpszIcon QWORD ?dwContextHelpId QWORD ?lpfnMsgBoxCallback QWORD ?dwLanguageId DWORD ?,?

MSGBOXPARAMSA ENDSfpuDiv macro _a,_c,_b ; макрос с именем fpuDiv

fld _cfdiv _bfld _afsubr

endm ;; окончание макроса.data

params MSGBOXPARAMSA <> _a REAL4 2.8_b REAL4 8.05_c REAL4 2.2_d REAL4 3.3arr1 dw 1,2,3,4 ; массив чисел arr1 размером в словоlen1 equ ($-arr1)/type arr1 ; количество чисел массиваarr2 dw 5,6,7,5 ; массив чисел arr2 размером в словоlen2 equ ($-arr2)/type arr2 ; количество чисел массиваarr1_2 dw len1 dup(0) ; размер буфера для чисел массивовtit1 db "masm64. Oперации MMX-FPU",0 ; название окошкаst2 dd 0 ; буфер чисел длЯ вывода сообщенияbuf1 db 0,0

ifmt db "Параллельное сложение с помощью ММХ-команд над массивами целых чисел.",10,"Если второе слово больше 55, то выполнить операцию:",10,"a - c/b - dc (-4,83), где a = 2,7; b = 8,05; c = 2,2; d = 3,3;",10,"иначе - выполнить операцию a - c/b (2,43)",10,10,"Ответ = %d ",10,10,"Автор: Рысованый А.Н., каф. ВТП, фак. КИТ, НТУ ХПИ",10,9,"Сайт: http://blogs.kpi.kharkov.ua/v2/asm/",0len11 equ ($-ifmt)/type ifmt

.code entry_point proc

movq MM1,QWORD PTR arr1 ; загрузка массива чисел arr1movq MM2,QWORD PTR arr2 ; загрузка массива чисел arr2paddw MM1,MM2 ; параллельное циклическое сложениеmovq QWORD PTR arr1_2,MM1 ; сохранение результата

pextrw eax,MM1,1 ; копирование первого слова в eax

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Параллельное сложение с помощью ММХ-команд над массивами целых чисел

Page 34: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

34

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

cmp eax,55jg @1 ; if >jmp @2@1: emms ; последняя ммх-команда - освобождение сопроцессораfpuDiv [_a],[_c],[_b]fld _dfmul _cfsubfisttp st2; сохранение целочисленного значения и округление в сторону нуляinvoke wsprintf,ADDR buf1,ADDR ifmt,st2

mov params.cbSize,SIZEOF MSGBOXPARAMSA ; размер структурыmov params.hwndOwner,0 ; дескриптор окна владельца

invoke GetModuleHandle,0 ; получение дескриптора программыmov params.hInstance,rax ; сохранение дескриптора программы

lea rax, buf1 ; адрес сообщенияmov params.lpszText,rax

lea rax,tit1 ;Caption ; адрес заглавия окнаmov params.lpszCaption,raxmov params.dwStyle,MB_USERICON ; стиль окнаmov params.lpszIcon,IDI_ICON ; ресурс значкаmov params.dwContextHelpId,0 ; контекст справкиmov params.lpfnMsgBoxCallback,0 ;mov params.dwLanguageId,LANG_NEUTRAL ; язык сообщения

lea rcx,paramsinvoke MessageBoxIndirect; invoke MessageBox,0,addr buf1,addr tit1,MB_ICONINFORMATION

jmp @3@2: emms

fpuDiv [_a],[_c],[_b]fisttp st2 ; сохранение целочисленного значения и округление в сторону нуля

invoke wsprintf,ADDR buf1,ADDR ifmt,st2

Page 35: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

35

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

mov params.cbSize,SIZEOF MSGBOXPARAMSA ; размер структуры

mov params.hwndOwner,0 ; дескриптор окна владельца

invoke GetModuleHandle,0 ; получение дескриптора программы

mov params.hInstance,rax ; сохранение дескриптора программы

lea rax, buf1 ; адрес сообщения

mov params.lpszText,rax

lea rax,tit1 ;Caption ; адрес заглавиЯ окна

mov params.lpszCaption,rax

mov params.dwStyle,MB_USERICON ; стиль окна

mov params.lpszIcon,IDI_ICON ; ресурс значка

mov params.dwContextHelpId,0 ; контекст справки

mov params.lpfnMsgBoxCallback,0 ;

mov params.dwLanguageId,LANG_NEUTRAL ; язык сообщения

lea rcx,params

invoke MessageBoxIndirect

;invoke MessageBox,0,addr buf1,addr tit1,MB_ICONQUESTION

@3:

.data

fmt2 db 3 dup("%x "),0 ; строка форматирования

fName db "MMX64-5-1.txt",0

hFile dq ?

buf2 db 3 dup(0);

fHandle dq ? ;

cWritten dq ? ;

BSIZE equ 338

fName2 BYTE "notepad C:\masm64\bin64\MMX64-5-1.txt",0 ; имя файла

.code

invoke CreateFile,ADDR fName,GENERIC_WRITE,0,0,CREATE_ALWAYS,

FILE_ATTRIBUTE_ARCHIVE,0

mov hFile,rax

invoke WriteFile,hFile,ADDR buf1,BSIZE,ADDR cWritten,0

invoke CloseHandle,hFile

invoke WinExec,addr fName2,SW_SHOW

invoke ExitProcess,0

entry_point endp

end

Page 36: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

36

ММХ-команды сдвига делятся на:

Логические — при сдвиге освобождающиеся разряды заполняются нулями.

Арифметические — при сдвиге освобождающиеся разряды заполняются знаком

числа из старшего бита..

ММХ-команды сдвига:

psllw, pslld, psllq – логический сдвиг 16-битных, 32-битных или 64-битных

операндов влево, при этом освободившиеся младшие разряды заполняются

нулями;

psrlw, psrld, psrlq – логический сдвиг 16-битных, 32-битных или 64-битных

операндов вправо, при этом освободившиеся старшие разряды заполняются

нулями;

psraw, psrad – арифметический сдвиг 16-битных или 32-битных операндов

вправо, при этом освободившиеся старшие разряды заполняются нулями для

положительных и единицами для отрицательных чисел.

PSLLx - Параллельный логический сдвиг влево = Parallel Shift Left Logical)

PSRLx - Параллельный логический сдвиг вправо = Parallel Shift Right Logical

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 37: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

37

PSLLW mm1, imm8 0F 71 /6 ib Shift left words, shift in zeros

PSLLW mm, mm/m64 0F F1 /r Shift left words, shift in zeros

PSLLD mm, imm8 0F 72 /6 ib Shift left doublewords, shift in zeros

PSLLD mm, mm/m64 0F F2 /r Shift left doublewords, shift in zeros

PSLLQ mm, imm8 0F 73 /6 ib Shift left quadword, shift in zeros

PSLLQ mm, mm/m64 0F F3 /r Shift left quadword, shift in zeros

PSRAD mm, imm8 0F 72 /4 ib Shift right doublewords, shift in sign bits

PSRAD mm, mm/m64 0F E2 /r Shift right doublewords, shift in sign bits

PSRAW mm, imm8 0F 71 /4 ib Shift right words, shift in sign bits

PSRAW mm, mm/m64 0F E1 /r Shift right words, shift in sign bits

PSRLW mm, imm8 0F 71 /2 ib Shift right words, shift in zeros

PSRLW mm, mm/m64 0F D1 /r Shift right words, shift in zeros

PSRLD mm, imm8 0F 72 /2 ib Shift right doublewords, shift in zeros

PSRLD mm, mm/m64 0F D2 /r Shift right doublewords, shift in zeros

PSRLQ mm, imm8 0F 73 /2 ib Shift right quadword, shift in zeros

PSRLQ mm, mm/m64 0F D3 /r Shift right quadword, shift in zeros

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 38: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

38

include \masm64\include64\masm64rt.inc ; .data mas1 dw 1,2,3,4,5,6,7,8res2 dq 0tit1 db "masm64. Исследование сдвигов ",0fmt1 db "Команда MMX psrlw.",10,"Результат: %016I64xh",10,10,"Команда MMX psllq.",10,"Результат: %016I64xh",0buf1 dq 4 dup(0),0.code entry_point procmovq mm0,qword ptr[mas1] ; для проверки в отладчике movq mm1,qword ptr[mas1] ;psrlw mm1,1 ; сдвиг вправо на 1 разряд каждого словаmovq res2,mm1mov r10,res2 ;

movq mm3,qword ptr[mas1] ; для проверки в отладчике movq mm4,qword ptr[mas1] ;psllq mm4,1 ;movq res2,mm4mov r11,res2 ;

movd eax, mm4 ; для проверки в отладчике invoke wsprintf,ADDR buf1,ADDR fmt1,r10,r11;invoke MessageBox,0,addr buf1,addr tit1,MB_ICONINFORMATIONinvoke ExitProcess,0entry_point endpend

Исследование команд сдвигов

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

%016I64xh – 16 цифр для вывода;I64 – платформа х64;

х – 16-ричная система счисления

Page 39: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

39

Дополнительные ММХ-команды:

pmaxub, pmaxsb, pmaxuw, pmaxsw — извлекаются

максимальные элементы из знаковых или беззнаковых операндов

pminub, pminsb, pminuw, pminsw — извлекаются минимальные

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

pavgb, pavgw — усреднение беззнаковых байтов или слов

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

PMINSW mm, mm/m команда попарно сравнивает четыре слова со знаком в MMX-регистре с четырьмя

словами со знаком во входном операнде. Минимальные значения записываются в

выходной операнд.

PMAXSW mm, mm/m команда попарно сравнивает четыре слова со знаком в MMX-регистре с четырьмя

словами со знаком во входном операнде. Максимальные значения записываются в

выходной операнд.

PMINUB mm, mm/m команда попарно сравнивает восемь байтов без знака в MMX-регистре с восемью

байтами без знака во входном операнде. Минимальные значения записываются в

выходной операнд.

PMAXUB mm, mm/m команда попарно сравнивает восемь байтов без знака в MMX-регистре с восемью

байтами без знака во входном операнде. Максимальные значения записываются в

выходной операнд.

Page 40: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

40

include \masm64\include64\masm64rt.inc.datamas1 dw 1,5,7,98,52,12,36,45mas2 dw 2,3,89,5,14,23,6,58len1 EQU (LENGTHOF mas2) ; кол. элементов в mas2sum dw len1 DUP(0),0sum2 dw len1 DUP(0),0 tit1 db "Использование команды pminsw ", 0buf1 dq len1 DUP(0),0 ifmt db "Команда находит минимальный элемент",10,10," Ответ=", len1 dup(" %d "),0

.codeentry_point procmov rax,len1 ; счетчик чисел mov rbx,4 ; кол. чисел в 64 разрядахxor rdx,rdx ; подготовка к делениюdiv rbx ; определение кол. циклов и остаткаmov rcx,rax ; кол. циклов в счетчикеlea rsi,mas1 ; lea rdi,mas2 ;lea rbx,sum ; адрес хранения результата@@:movq MM0,qword ptr[rsi] ; загрузка чисел mas1movq MM1,qword ptr[rdi] ; загрузка чисел mas2pminsw MM0,MM1 ; movq qword ptr[rbx],MM0 ;add rsi,8 ; адр. начала следующего циклаadd rdi,8 ; add rbx,8 ;loop @b

cmp rdx,0 ; опред. остатка необработанных элементовjz exit ; если элементы закончились, то перейти на exitmov rcx,rdx ; счетчик количества необработанных чиселm2: mov ax,word ptr [rsi] ; занесение необработанного элемента из mas1add ax,word ptr [rdi] ; сложение элементов массивовmov word ptr [rbx],ax ; результатadd rsi,2 ; подготовка к выборке элемента из mas1add rdi,2 ; подготовка к выборке элемента из mas2add rbx,2 ; подготовка к записи результата в памятьloop m2 ; ecx := ecx – 1 и переход, если ecx /= 0exit:

movzx rsi,summovzx rdi,sum[2]movzx r10,sum[4]movzx r11,sum[6]movzx r12,sum[8]movzx r13,sum[10]movzx r14,sum[12]movzx r15,sum[14]

invoke wsprintf,ADDR buf1,ADDR ifmt,rsi,rdi,r10,r11,r12, r13, r14,r15invoke MessageBox,0,addr buf1,addr tit1,MB_ICONINFORMATIONinvoke ExitProcess,0entry_point endpend

Нахождение минимальных элементов массивов

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич

Page 41: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

41

Пример. Числа заданы массивами masA:={a,b,c,d} и masE :={е1,е2,е3,е4}. Загрузить эти массивы в регистры ММХ (SSE, AVX) и при дальнейших вычислениях использовать эти регистры как источники этих чисел (выгрузить или извлечь). Посчитать уравнение для 4-х чисел «е» (в цикле). Вывести функцией MessageBoxфамилию, группу, уравнение и результат.

include \masm64\include64\masm64rt.inc.datamas1 db 1,2,3,4 ; a,b,c,dmasE dq 7,10,3,8 ;len1 EQU (LENGTHOF masE) ; кол. элементов mas3 dq 4 dup(?)res0 dq ? ; хранение 1-го результатаres1 dq ? ; хранение 2-го результата

tit1 db "Задание: ae/b – ad;",0txt1 db "Результаты : ", len1 dup(" %d "),0buf1 dq ?,0.codeentry_point proclea rsi,mas1 ; адр. mas1lea rdi,masElea r8,mas3mov rcx,len1xor rdx,rdxmovq mm0,[rsi] ; загрузка mas1movq mm1,mm0 ; дублирование mas1pextrw r10d,MM1,0 ; извлечение 0-го словаand r10d,0ffh ; маска - выделение мл. байтаpextrw r11d,MM1,0 ; извлечение 0-го словаand r11d,0ff00h ; выделение ст. байтаsar r11d,8 ; сдвиг на место мл. байта

pextrw r12d,MM1,1 ; извлечение 1-го словаand r12d,0ffhpextrw r13d, MM1,1and r13d,0ff00hsar r13d,8

cycle:xor rbx,rbxmov bl,byte ptr [rdi]mov eax,r10d ; amul rbx ; aediv r11dmov r9,rax ; ae/bmov eax,r10d ; amul r13dsub r9,rax ;mov [r8],r9add r8,8add rdi,8loop cycle

mov rax,mas3[0]mov res0,rax ; 1-й результатmov rax,mas3[8]mov res1,rax ; 2-й результатmov r14,mas3[16] ; 3-й результатmov r15,mas3[24] ; 4-й результатinvoke wsprintf,ADDR buf1,ADDR txt1, res0,res1,r14,r15invoke MessageBox,0,addr buf1,addr tit1, MB_ICONINFORMATIONinvoke ExitProcess,0entry_point endpend

Page 42: Kпециальность 123 ±« Dомпьютерная инженерия»; 01 ...blogs.kpi.kharkov.ua/v2/asm/wp-content/uploads/sites/20/2019/11/L07-SP... · Презентация

424242424242

«Системное программирование»

к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич,

[email protected], [email protected]

личный сайт: http://blogs.kpi.kharkov.ua/v2/asm/

НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

“Харьковский политехнический институт”

Кафедра “Вычислительная техника и программирование”

Специальность 123 – «Компьютерная инженерия»;

специализации:

123-01 «Компьютерные системы и сети»;

123-02 «Системное программирование»;

123-03 «Программирование компьютерных игр и мобильных приложений»;

Специальность 125 – «Кибербезопасность»