Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Что может быть с процедурой?


dmk ©   (02.07.19 20:40

Всем привет!
Есть внеклассовая процедура на ассемблере, которая вызывает из себя код из другого класса. В процедуре имеются 3 переменных для сохранения регистров. после call  в другой класс 2 переменные восстанавливаются корректно, а одна из переменных рушится, что и привело меня сюда.


dmk ©   (02.07.19 20:57[1]

При входе в процедуру компилятор как обычно отматывает стек на 32 байта без отладки или на 40 байт в отладочном режиме, чтобы охранить RBP. Стек нигде по дороге не рушится и возвращается точно в точку перед call r10. После call переменные S0 и S2 корректно восстанавливаются, а переменная S1 содержит не корректный адрес, т.е. где-то происходит ее перезапись. Поскольку используется директива .NOFRAME, то для хранения используется общий стек программы [RSP+$18], [RSP+$10], [RSP+$8]. По этим адресам лежат переменные S0, S1, S2.
Вызываемая процедура тоже корректно отматывает стек и возвращает точный адрес до вызова. Стек нигде не рушится, а одна переменная где-то перезаписывается. Найти где - не удается. Единственный рабочий способ — это отмотать стек еще на размер этих переменных, т.е. sub rsp, 24. Мне такой способ не очень нравится, т.к. в режиме отладки и релизе могут быть расхождения.
Если есть опытные - подскажите пожалуйста в чем может быть еще проблема?

Собственно сама процедура:
procedure Mix03_CCW(ACL, APL: PPlane; PResult: Pointer);
var
 S0, S1, S2: QWord;

asm
 .NOFRAME

 //--------------------------------------------------
 // Треугольник A
 //--------------------------------------------------

 // FVA^.DC0 := D0^;
 // FVA^.DC1 := D1^;
 // FVA^.DC2 := Mix(D2^, D1^, FA.C.W);

 movaps xmm0, dqword ptr [ACL]
 movaps xmm1, dqword ptr [ACL + 16]
 movaps xmm2, dqword ptr [ACL + 32]

 movss xmm3, dword ptr [APL + FA_CW] //AOpacity #1
 movss xmm4, dword ptr [SingleOne] //1.0
 movss xmm8, xmm4 //Копируем 1.0
 subss xmm4, xmm3 //BOpacity #1

 shufps xmm3, xmm3, 00b //AOpacity #1
 shufps xmm4, xmm4, 00b //BOpacity #1

 //--------------------------------------------------
 // Mix D2-D1
 //--------------------------------------------------

 movaps xmm5, xmm2 //Копируем AColor
 movaps xmm6, xmm1 //Копируем BColor

 mulps xmm5, xmm3 //Умножаем AColor на AOpacity #1
 mulps xmm6, xmm4 //Умножаем BColor на BOpacity #1
 addps xmm5, xmm6 //AColor + BColor

 //--------------------------------------------------
 // Возвращаем смешанный пиксел
 //--------------------------------------------------

 movaps dqword ptr [PResult], xmm0
 movaps dqword ptr [PResult + 16], xmm1
 movaps dqword ptr [PResult + 32], xmm5

 //--------------------------------------------------
 // Рисуем треугольник A
 // Target.ZTriangle64(FProjectA^, FVA);
 //--------------------------------------------------

 mov S0, ACL //Сохраним RCX (Self), т.к. вызов идет из класса
 mov S1, APL
 mov S2, PResult

 mov r10, qword ptr [PResult + AT_CODE] //Target.Code
 mov rcx, qword ptr [PResult + AT_DATA] //Target.Data

 //1-й параметр
 mov rdx, PResult
 add rdx, AT_ProjectA

 //2-й параметр
 //FVA (Он же PResult) уже в r8

 //sub rsp, 24 <- такой способ работает

 call r10 //ZTriangle64

 //add rsp, 24

 mov ACL, S0 //Восстановим RCX (Восстанавливается корректно)
 mov APL, S1 //После call S1 содержит разрушенное значение!!!!!!
 mov PResult, S2 (Восстанавливается корректно)

 //--------------------------------------------------
 // Треугольник B
 //--------------------------------------------------

 // FVA^.DC0 := D0^;
 // FVA^.DC1 := Mix(D2^, D1^, FB.B.W);
 // FVA^.DC2 := Mix(D2^, D0^, FB.C.W);

 movaps xmm0, dqword ptr [ACL]
 movaps xmm1, dqword ptr [ACL + 16]
 movaps xmm2, dqword ptr [ACL + 32]

 movss xmm3, dword ptr [APL + FB_BW] //AOpacity #1
 movss xmm7, dword ptr [APL + FB_CW] //AOpacity #2

 movss xmm4, dword ptr [SingleOne] //1.0
 movss xmm8, xmm4 //Копируем 1.0
 subss xmm4, xmm3 //BOpacity #1
 subss xmm8, xmm7 //BOpacity #2

 shufps xmm3, xmm3, 00b //AOpacity #1
 shufps xmm4, xmm4, 00b //BOpacity #1
 shufps xmm7, xmm7, 00b //AOpacity #2
 shufps xmm8, xmm8, 00b //BOpacity #2

 //--------------------------------------------------
 // Mix D2-D1
 //--------------------------------------------------

 movaps xmm5, xmm2 //Копируем AColor
 movaps xmm6, xmm1 //Копируем BColor

 mulps xmm5, xmm3 //Умножаем AColor на AOpacity #1
 mulps xmm6, xmm4 //Умножаем BColor на BOpacity #1
 addps xmm5, xmm6 //AColor + BColor

 //--------------------------------------------------
 // Mix D2-D0
 //--------------------------------------------------

 movaps xmm3, xmm2 //Копируем AColor
 movaps xmm4, xmm0 //Копируем BColor

 mulps xmm3, xmm7 //Умножаем AColor на AOpacity #2
 mulps xmm4, xmm8 //Умножаем BColor на BOpacity #2
 addps xmm3, xmm4 //AColor + BColor

 //--------------------------------------------------
 // Возвращаем смешанный пиксел
 //--------------------------------------------------

 movaps dqword ptr [PResult], xmm0
 movaps dqword ptr [PResult + 16], xmm5
 movaps dqword ptr [PResult + 32], xmm3

 //--------------------------------------------------
 // Рисуем треугольник B
 // Target.ZTriangle64(FProjectB^, FVA);
 //--------------------------------------------------

 mov S0, ACL //Сохраним RCX (Self), т.к. вызов идет из класса
 mov S1, APL //rdx
 mov S2, PResult //r8

 mov r10, qword ptr [PResult + AT_CODE] //Target.Code
 mov rcx, qword ptr [PResult + AT_DATA] //Target.Data

 //1-й параметр
 mov rdx, PResult
 add rdx, AT_ProjectB

 //2-й параметр
 //FVA (Он же PResult) уже в r8

 call r10

 mov ACL, S0 //Восстановим RCX
 mov APL, S1
 mov PResult, S2
end;


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо