Сборник по задачам и примерам Assembler



         

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


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

 




Содержание  Назад  Вперед