Сложение структур данных с помощью SSE2-XMM

Тема в разделе "WASM.BEGINNERS", создана пользователем RDMess, 4 янв 2011.

  1. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Здравствуйте, этот код копирует и стека(LOCAL) структуру RECT в регистр XMM0, потом складывает структуру в этом регистри с структурой находящийся в стеке, подобная техника сложения структур с помощью обычных регистров работает, а вот эта хоть убей.
    Подскажите пожалуйста почему этот код вызывает исключение.

    Код (Text):
    1. TabChanged proc iTab:DWORD,appd:DWORD
    2.       LOCAL  rc:RECT;[ebp-10h]
    3.       LOCAL trc:RECT;[ebp-20h]
    4.         mov ebx,appd
    5.         assume ebx:ptr APPDATA
    6.           .....
    7.           .....
    8.         assume ebx:nothing
    9.         MOVDQU XMM0,[ebp-10h]
    10.         PADDD    XMM0,[ebp-20h] ; тут Access violation
    11.         MOVDQU [ebp-20h],XMM0
    12.          ......
    13.       ret
    14.     TabChanged endp
     
  2. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    А где переключение между FPU и MMX ? )
     
  3. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    В смысле EMMS ? поставил,результат тот же :dntknw:
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    RDMess
    EMMS тут не нужно, а падает потому что PADDD получается невыровненный операнд.
     
  5. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Понял, спасибо... будем читать.
     
  6. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Простите, есть какие нибудь стандартыне способы выравнивания памяти в стеке по 16-и байтной границе в MASM32 ?

    Я тут подытожил, пока знаю только 2 способа выравнивания
    1. (ebp%10h)-остаток от деления, и если округлить в большую то +10h
    2. ebp+10h, and ebp,0FFFFFFF0h

    Страшновато ebp редактировать.
     
  7. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Можно попробовать использовать ключ /Zp[n] Set structure alignment,
    но лучше используй ocновные регистры, а xmm.
     
  8. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Т.е. перемещать в регистры хмм и только потом складывать ?