Описание упакованных и скалярных данных
Описание ХММ-данных в приложении обычно производится в одном из двух форматов:
- в массиве структур;
- в структуре, элементами которой являются массивы.
Описание точек изображения в трехмерном пространстве принято задавать в виде четырехмерного вектора (x.y.z.w). Это связано с тем, что проективные преобразования, необходимые для показа изображения с различных точек зрения, наиболее просто описываются матрицами 4x4.
Используя перечисленные выше форматы задания ХММ-данных, совокупность точек в трехмерном пространстве можно описать двумя способами:
Первый способ – для каждой точки определить свой экземпляр структуры:
point 3D struc х del 0.0 у dd 0.0 z dd 0.0 w dd 0.0 ends.data pi point_3D 4 dup (<>) ;описание пирамиды массивом структур. ;каждая из которых описывает одну из 4 вершин
Второй способ – все точки описать одной структурой, элементами которой являются массивы координат x,y,z,w:
pri sm_point_3Dstruc x dd 4 dup (0.0) у dd 4 dup (0.0) z dd 4 dup (0.0) w dd 4 dup (0.0) ends.data prism prism_point_3D<> структура, описывающая треугольную пирамиду (4 вершины)
Приведенные выше примеры описания пирамиды иллюстрирует рис. 10.1.
Рис. 10.1. Расположение в памяти описания вершин пирамиды
В большинстве приложений используется первый способ представления ХММ-данных, хотя он считается и менее эффективным. При необходимости можно произвести преобразование представления данных из одного способа в другой. Вариант такого преобразования показан в программе ниже.
;рrg10_01.asm – программа преобразования представления ХММ-данных :из одного способа представления в другой. prizm struc union struc структура, описывающая треугольную пирамиду (1 способ) xyzwl dd 0.0 xyzw2 dd 0.0 xyzw3 dd 0.0 xyzw4 dd 0.0 ends struc структура, описывающая треугольную пирамиду (2 способ) х dd 4 dup (0.0) у dd 4 dup (0.0) z dd 4 dup (0.0) w dd 4 dup (0.0) ends ends;конец объединения ends.data prizm_l prizm <>:экземпляр объединения.code преобразование представлений вершин пирамиды (на месте) lea si.prizm_l movlps rxmm0.[si];rxmm0=?? уО xO movhps rxmmO,[si+16];rxmm0= yl xl yO xO movlps rxmm2.[si+32];rxmm2"?? y2 x2 movhps rxmm2.[si+48];rxmm2= уЗ х3 у2 х2 movaps rxmml.rxmmO:rxmml= yl xl yO xO shufps rxmmO.rxmm2.88h:rxmm0= x3 x2 xl xO shufps rxmml.rxmm2.0ddh;rxmml= у3 у2 yl yO movlps rxmm2.[si+8];rxmm2=?? wO zO movhps rxmm2.[si+24]:rxmm2= wl zl wO zO movlps rxmm4.[si+40];rxmm4=?? w2 z2 movhps rxmm4,[si+56];rxmm4= w3 z3 w2 z2 movaps rxmm3.rxmm2;rxmm3= wl zl wO zO shufps rxmm2.rxmm4.88h:rxmm2= = z3 z2 zl zO shufps rxmm3.rxmm4.0ddh;rxmm3= w3 w2 wl wO. – на выходе получим следующее состояние ХММ-регистров: ;RXMM0= х3 х2 x1 x0. RXMM1= у3 у2 yl y0. RXMM2= ¦ z3 z2 zl zO. RXMM3= w3 w2 w1 w0 :теперь их необходимо сохранить в памяти: movups [si].rxmm0 movups [si+16].rxmml movups [si+32].rxmm2 movups [si+48].rxmm3 Описание скалярных данных намного проще – это обычные значения ; с плавающей точкой в коротком формате: .data seal real dd 1.0:пример описания скалярного ХММ-значения;