Примеры использования команд ХММ-расширения
Умножение матрицы 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 дело обстоит несколько хуже.
Другие фирмы-разработчики трансляторов ассемблера мы не рассматриваем (не потому, что они хуже – просто обсуждение достоинств и недостатков трансляторов ассемблера не является предметом данной книги). Настало время, не меняя любимого транслятора, помочь ему понять неизвестные команды микропроцессора. Для этого в следующей части данного раздела мы выработаем соответствующую методику.