Иллюстрированный самоучитель по задачам и примерам Assembler

Примеры использования команд ХММ-расширения

Умножение матрицы 4x4 на четырехмерный вектор (стандартный сопроцессор)

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

:prgl0_05.asm – программа поворота изображения на месте
:с использованием средств стандартного сопроцессора.
:координаты квадрата (необходимо инициализировать) x0.y0.x1.y1.x2.y2.x3.y3 mas_xy dd 8 dup (0.0)
a dd 0.0:угсл (необходимо инициализировать).code
lea si.mas_xy
mov ex.4:цикл 4 раза – по количеству вершин
firm;вычисляем sin а и cos a;
fid a;включаем а стек угол
fsin вычисляем sin a
fxch;меняем st(0)< › st(l)
fcos;вычисляем cos a
fxch;меняем st(0)< › st(l)
fstp a:выталкиваем а:поворот изображения cycl: fild word ptr [si]
:включить в стек координату х элемента
fild word ptr [si+2]:включить в стек координату у элемента
fid St(l);дублируем их
fid st(l)
fmul st.st(5) вычислить y*sin
fxch:меняем st(0)< › st(l)
fmul St.st(4) вычислить x'cos
fadd:новая координата х
fistp word ptr[si]:передать новую координату х в память
fmul st.st(2) вычислить y*cos
fxch ';меняем st(0)< › st(l)
fmul St.StO).-вычислить x*sin
fsubr.новая координата у
fistp word ptr[si*4];передать ее в память
add si.8;продвинуть указатель массива mas_xy
loop cycl повторить еще 3 раза:в mas_.ху преобразованные для поворота координаты квадрата

Поворот изображения (ХММ-расширение)

:prgl0_06.asm – программа поворота изображения на месте
:с использованием средств ХММ-расширения.
.data
:ALIGN 16
:координаты квадрата (необходимо инициализировать) х0,у0,х1.у1.х2.у2.х3.уЗ
mas_xy dd 8 dup (0.0)
a dd 0.0:угол (необходимо инициализировать)
sin_a dd 0.0
cos_a dd 0.0
null dd 0.0
 .code
:………
lea esi.raas_xy
mov ecx.4:цикл 4 раза – no количеству вершин
finit вычисляем sin а и cos a;
fid a:включаем в стек угол
fsin вычисляем sin a
fxch;меняем st(Q)< › st(l)
fcos;вычисляем cos a
fxch;меняем st(0)< › st(l;
fstp a;выталкиваем а
fstp cos_a; выталкиваем cos__a
fstp sin_a;выталкиваем sin_a
;поворот изображения
;готовим xmm-регистр RXMM2 со значениями углов movlps rxmm2.sin_a
movhps rxmm2,sin_a;RXMM2= cos_a sin_a cos_a sin__a
movss rxmm2.nul1
siibss rxmm2.sin_a;RXMM2= cos_a sin_a cos_a – sin_a
cycl: movlps rxmmO.Lesi]:RXMM0=?? yi xi movhps rxnwO.Cesi];RXMM0= yi xi yi xi
shufps rxmmO.rxmmO.ObOh:RXMM0= xi yi yi xi
mulps rxmmO.rxnm2;RXMM0-RXMM0*RXMM2= xi*cos_a yi*sin_a yi* cos_a xi*(-sin_a)
shufps rxmml.rxmmO.31h;RXMM1=? xi*cos_a? yi* cos_a
addps rxmmO.rxmml:RXMM0=? (xi*cos_a+yi*sin_a)? (yi* cos_a+xi*(-sin_a))
shufps rxmmO.rxmmO.2;RXMM0=-?? (yi* cos_a+xi*(-sin_a)) (xi*cos_a+yi*sin_a) сохраняем результат
: movlps [esi].rxnim0;готовимся к вычислению нового положения для следующей координаты
add esi,8 1oop cycl

На этом мы закончим рассмотрение примеров программирования ХММ-расширения. При разработке приведенных выше программ мы считали, что используемый нами транслятор ассемблера поддерживает любые команды микропроцессора Intel, в том числе и ХММ-команды. Реально ситуация далека от этой идеальной картины. Мы уже упоминали, что если транслятор MASM (фирмы Microsoft) пытается поспевать за процессом развития системы команд, то для TASM дело обстоит несколько хуже.

Другие фирмы-разработчики трансляторов ассемблера мы не рассматриваем (не потому, что они хуже – просто обсуждение достоинств и недостатков трансляторов ассемблера не является предметом данной книги). Настало время, не меняя любимого транслятора, помочь ему понять неизвестные команды микропроцессора. Для этого в следующей части данного раздела мы выработаем соответствующую методику.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.