Информация об изменениях

Сообщение Re[3]: особенности структурной обработки исключений в Win64 от 03.12.2016 17:47

Изменено 03.12.2016 17:48 ononim

O>>Думаю дело такое, что компилятор рассчитывает на определенное выравнивание стека при вызове функций. И рассчитывает он на это не просто так, а для того чтобы можно было использовать инструкции SSE при работе со стековыми переменными. Впрочем конечно можно было бы насильно подравнять стек, запомнив в нем же оригинальное "неровное" значение.
кт>По поводу выравнивания стека я и с автором и с Вами согласен. Охренели они все, простите мой французский. Зачем, например, во вшивой API InternetGetConnectedState использовать SSE2? Ответ: да не используется там такие команды, просто по дороге один чудила написал
кт>...
кт>movdqa xmmword ptr [rsp+20h],xmm0
кт>movdqa xmmword ptr [rsp+30h],xmm1
кт>movdqa xmmword ptr [rsp+40h],xmm2
кт>movdqa xmmword ptr [rsp+50h],xmm3
кт>mov rdx,rax
кт>lea rcx,[WININET!Ordinal103+0x43524
кт>call WININET!DispatchAPICall+0x3f0 (
кт>movdqa xmm0,xmmword ptr [rsp+20h]
кт>movdqa xmm1,xmmword ptr [rsp+30h]
кт>movdqa xmm2,xmmword ptr [rsp+40h]
кт>movdqa xmm3,xmmword ptr [rsp+50h]
Ну прежде чем делать какие либо выводы нужно бы заглянуть в WININET!DispatchAPICall+0x3f0

кт>т.е. запомнил и восстановил эти чертовы регистры. Ну, даже, если и нужно их внутри использовать – ну и выровни стек на 16 ВНУТРИ свой программы. Зачем ты заставляешь всех нарезать стек крупными ломтями?

Это часть соглашений о вызове.


O>>Технология придумана для "санкционированных" исключений, то есть брошенных руками. Работоспособность программы после какого нить illegal instruction или поломанной памяти на самом деле никому не интересна.

кт>Жизнь в программе после исключения вполне может быть
кт>Я часто видел в программах конструкции типа такой:
кт>On underflow begin; x=0; goto m1; end;
кт>…
кт>x=x/y;
кт>m1:…
Такое исключение не приведет к падению. 64 стек всегда аллоцируется кратным sizeof(void *) то есть 8. Добиться неровности можно только некорректным кодом, а не исключением в корректном коде, сгерененным компилятором с учетом известных ему правил. Если писать свой код на асме который делает add rsp, 3, а потом хвататься за свою голову остается только посочувтсовать. Как я уже сказал — меньше всего авторы соглашений колдогенерации в х64 позаботились о любителях теплого лампового ассемблера.
кт>По поводу выравнивания стека я и с автором и с Вами согласен. Охренели они все, простите мой французский. Зачем, например, во вшивой API InternetGetConnectedState использовать SSE2? Ответ: да не используется там такие команды, просто по дороге один чудила написал
кт>...
кт>movdqa xmmword ptr [rsp+20h],xmm0
кт>movdqa xmmword ptr [rsp+30h],xmm1
кт>movdqa xmmword ptr [rsp+40h],xmm2
кт>movdqa xmmword ptr [rsp+50h],xmm3
кт>mov rdx,rax
кт>lea rcx,[WININET!Ordinal103+0x43524
кт>call WININET!DispatchAPICall+0x3f0 (
кт>movdqa xmm0,xmmword ptr [rsp+20h]
кт>movdqa xmm1,xmmword ptr [rsp+30h]
кт>movdqa xmm2,xmmword ptr [rsp+40h]
кт>movdqa xmm3,xmmword ptr [rsp+50h]
Ну прежде чем делать какие либо выводы нужно бы заглянуть в WININET!DispatchAPICall+0x3f0

кт>т.е. запомнил и восстановил эти чертовы регистры. Ну, даже, если и нужно их внутри использовать – ну и выровни стек на 16 ВНУТРИ свой программы. Зачем ты заставляешь всех нарезать стек крупными ломтями?

Это часть соглашений о вызове.


кт>Жизнь в программе после исключения вполне может быть

кт>Я часто видел в программах конструкции типа такой:
кт>On underflow begin; x=0; goto m1; end;
кт>…
кт>x=x/y;
кт>m1:…
Такое исключение не приведет к падению. 64 стек всегда аллоцируется кратным sizeof(void *) то есть 8. Добиться неровности можно только некорректным кодом, а не исключением в корректном коде, сгерененным компилятором с учетом известных ему правил. Если писать свой код на асме который делает add rsp, 3, а потом хвататься за свою голову остается только посочувтсовать. Как я уже сказал — меньше всего авторы соглашений колдогенерации в х64 позаботились о любителях теплого лампового ассемблера.