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

       

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



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

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

:prgl0_05.asm - программа поворота изображения на месте :с использованием средств стандартного сопроцессора.

t :

:координаты квадрата (необходимо инициализировать) xO.yO.xl.yl.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

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

 

Содержание раздела