Здравствуйте, 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:…