Всем привет Недавно наткнулся на следующий код: вот это смущает Не подскажет ли кто нибудь как это будет выглядеть на си? Тоесть мне интересна конструкция (или директива), используя которую автор сделал подобный маневр. Или же он так ручками? %)
Clyde Это не авторский "манёвр", а компилятора. Стандартный пролог процедуры плюс обычное выравнивание стека на восьмибайтовую границу (AND ESP,FFFFFFF8) и выделение памяти для локальных переменных (SUB ESP,5C). Зачем именно там выравнивание, может зависеть от дальнейших действий.
Clerk А... там разве шла речь, о том, в каких случаях должно быть выравнивание именно на восемь байт? Про четырёхбайтное и так ясно, но смысла делать его специально нет, т.к. при входе в процедуру подразумевается, что стек уже выравнен на четыре байта. Clyde На восемь байт выравнивание может потребоваться, например, в качестве повышения производительности, если в локальных переменных хранятся числа с плавающей запятой, а процедура работает с FPU.
l_inc А.. это выравнивание вручную поставлено и оно нужно ? Вроде ты сказал что это компилятор сделал.. И почему именно 8, может мне понадобится на границу страницы стек выравнить, например для манипуляций с атрибутами его страницы.
Clerk Я так решил чисто исходя из содержимого первого поста. Т.е. вероятно, топикстартер рассматривал чужой код под Olly, предварительно проверив каким-нибудь peid, чем был скомпилирован код. Эм... ну потому что AND ESP,FFFFFFF8 выравнивает именно на восемь байт. А для чего это сделано, я ж написал, что без знания дальнейших действий в процедуре, трудно сказать (пост 2, предложение 3). Ну и скорее всего автор решил закрыть тему раньше, чем понял, что не получил ответ на свой вопрос, поэтому я поторопился в посте 8 сделать предположение о том, что, возможно, процедура работает с FPU.
Как вариант - в процедуре может использоваться MMX, SSE, SSE2 и т.д. Они требуют выравнивания операндов, для MMX как раз 8 байт выравнивание надо. В противном случае в зависимости от команды будет либо штраф в плане производительности, либо вообще исключение. Гадать можно долго...