Re[2]: особенности структурной обработки исключений в Win64
От: кт  
Дата: 03.12.16 07:05
Оценка:
Здравствуйте, 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]
...
т.е. запомнил и восстановил эти чертовы регистры. Ну, даже, если и нужно их внутри использовать – ну и выровни стек на 16 ВНУТРИ свой программы. Зачем ты заставляешь всех нарезать стек крупными ломтями?

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


Жизнь в программе после исключения вполне может быть
Я часто видел в программах конструкции типа такой:

On underflow begin; x=0; goto m1; end;

x=x/y;
m1:…
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.