lea ecx,[esp+0x4] ; I assume this is for getting the adress of the first argument of the main...why ?
and esp,0xfffffff0 ; ??? is the compiler trying to align the stack pointer on 16 bytes ???
push DWORD PTR [ecx-0x4] ; I understand the assembler is pushing the return adress....why ?
push ebp
mov ebp,esp
push ecx ;why is ecx pushed too ??
Даже если каждая инструкция работает без потери скорости, несмотря на произвольно выровненные операнды, выравнивание все равно повысит производительность. Представьте себе цикл, ссылающийся на 16-байтовое количество, которое просто перекрывает две строки кэша. Теперь, чтобы загрузить этот маленький wchar в кеш, нужно удалить две целые строки кеша, а что, если они вам нужны в одном цикле? Кэш-память настолько огромна, как оперативная память, поэтому производительность кеша всегда критична.
Кроме того, обычно есть штраф скорости, чтобы сдвинуть смещенные операнды в регистры.
Учитывая, что стек перестраивается, мы, естественно, должны сохранить старое выравнивание, чтобы обойти кадры стека для параметров и возврата.
ecx - это временный регистр, поэтому его необходимо сохранить. Кроме того, в зависимости от уровня оптимизации некоторые операции связывания фреймов, которые не кажутся строго необходимыми для запуска программы, вполне могут быть важны для создания цепочки фреймов, готовых к трассировке.