Нет, скрытой индикации нет.
Это типичная стратегия для генерации инструкций 80x86, используемых во многих реализациях компилятора, C
и других.Например, компилятор Intel Fortran-77 1980-х годов, когда была включена оптимизация, делал то же самое.
То есть использует eax
и ecx
преимущественно, вероятно, является артефактом отказа от использования esi
и edi
, поскольку эти регистры нельзя напрямую использовать для загрузки байтовых операндов.
Почему бы не ebx
и edx
?Что ж, многие генераторы кода предпочитают использовать промежуточные указатели при оценке сложных структурных вычислений, то есть причин не так много.Компилятор только что искал два доступных регистра для использования и перезаписал их для буферизации значений.
Почему бы не использовать eax
вот так?
push esi
mov eax,dword ptr [esp+2Ch]
push eax
mov eax,dword ptr [esp+8]
push eax
mov eax,dword ptr [esp+4]
push eax
Потому что это приводит к остановке конвейера в ожиданииeax
, чтобы завершить предыдущие циклы памяти, в 80x86 с 80586 (может быть, 80486 - это слишком давно, чтобы быть уверенным в головах).
Архитектура x86 - странный зверь.Каждый регистр, хотя Intel и называет его «универсальным», имеет свои причуды (cx
/ ecx
связан, например, с инструкцией loop
, а eax:edx
связан с инструкцией умножения).Это в сочетании с особыми способами оптимизации выполнения во избежание промахов кэша и остановок конвейера часто приводит к непостижимому генерируемому коду с помощью генератора кода, который учитывает все это.