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

Описание упакованных и скалярных данных



Описание упакованных и скалярных данных

Описание ХММ-данных в приложении обычно производится в одном из двух форматов:

  • в массиве структур;
  • в структуре, элементами которой являются массивы.
  • Описание точек изображения в трехмерном пространстве принято задавать в виде четырехмерного вектора (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= уЗ хЗ у2 х2

    movaps rxmml.rxmmO :rxmml= yl xl yO xO

    shufps rxmmO.rxmm2.88h :rxmm0= x3 x2 xl xO

    shufps rxmml.rxmm2.0ddh ;rxmml= уЗ у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= хЗ х2 xl xO. RXMM1= уЗ у2 yl yO. RXMM2= ¦ z3 z2 zl zO. RXMM3= w3 w2 wl wO :теперь их необходимо сохранить в памяти:

    movups [si].rxmm0

    movups [si+16].rxmml

    movups [si+32].rxmm2

    movups [si+48].rxmm3
    Описание скалярных данных намного проще - это обычные значения с плавающей точкой в коротком формате:
    .data

    seal real dd 1.0 :пример описания скалярного ХММ-значения;

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