Выравнивание стека в Windows 10 или сумрачный индусский гений
От: кт  
Дата: 09.10.17 15:09
Оценка: -3
При переходе с 7 на 10 несколько раз налетал на то, что «десятка», т.е. вызов ее API гораздо строже к требованию кратности стека 16.
И решил разобраться, а откуда вообще идет это ограничение?
Оказалось, что внутри ряда API (не у всех, но больше, чем у Windows7) стоят команды запоминания, а затем, естественно, восстановления регистров XMM.
Здесь и разработчики процессоров тоже дали маху: эти 16-байтовые регистры должны запоминаться в памяти по адресам, обязательно кратным 16. Хотя можно было бы поддержать раннюю традицию Х86 – если что-то не выровнено, то все равно работает, но медленнее. Но это ладно.
А вот внутри API какой-то чудак, видимо из Калькутты, решил запомнить XMM в стеке, не задумываясь, что сначала лучше было бы стек подготовить.
Ведь что получается: запускается программа. Стек у нее выровнен – как надо выровнен.
Например, далее вызывается подпрограмма без параметров, а внутри подпрограммы уже вызывается API. При выполнении инструкции CALL стек автоматически меняется (сюрприз) на 8 байт и становится НЕ выровнен на 16. Т.е. при вызове API идет все время геморрой насчет кратности 16 и автоматически вам его нужной кратности никто не обеспечивает.
Неужели это чудило под гордой вывеской Микрософта не догадалось, что:
1) XMM регистры надо запоминать, когда они действительно будут использоваться. Никто меня не убедит, что вызов какой-нибудь InternetGetConnectedState нуждается в использовании этих регистров. Данная функция прекрасно работала, когда не было не то, что XMM, а даже MMX. Поскольку она всего лишь достает статусное слово из внутренней структуры и ей два Float в одном регистре нужны как рыбе зонтик. Но даже это ладно.
2) Если приспичило сохранять XMM, то выровни ты стек ВНУТРИ API, а не заставляй это делать в тысячах мест вызовов API, неужели это не очевидно? В тысячах программ, в тысячах мест стоит это дурацкое выравнивание стека на 16 потому, что «здесь так принято».
Мне кажется, в Микрософте очень мало или совсем нет людей, кто оценивает эффективность кода в целом, т.е. приложение+операционная система.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.