push %ebp push %esp, %ebp push edi push esi push ebx
(32-битная Linux x86)
Почему эти регистры помещаются в стек? Мигрировали по какой-то причине ...? Но почему толкаются только «edi», «esi», «ebx»?
Это деталь реализации gcc для генератора кода x86.Удивительно трудно найти хорошие документы для этого, я нашел эту страницу , что довольно точно.Ключевая часть:
после инструкции повтора: %eip contains return address %esp points at arguments pushed by caller called function may have trashed arguments %eax contains return value (or trash if function is void) %ecx, %edx may be trashed %ebp, %ebx, %esi, %edi must contain contents from time of call
после инструкции повтора:
%eip contains return address %esp points at arguments pushed by caller called function may have trashed arguments %eax contains return value (or trash if function is void) %ecx, %edx may be trashed %ebp, %ebx, %esi, %edi must contain contents from time of call
Фраза «должен содержать контент с момента вызова» объясняет, почему они помещаются в пролог функции и выталкиваютсяснова в эпилоге.