push %ebp
push %esp, %ebp
push edi
push esi
push ebx
(x86 32位Linux)
为什么这些寄存器被推到堆叠状态? 由于某种原因迁移了......? 但是,为什么只有'edi''esi''ebx'被推了?
答案 0 :(得分:5)
它是x86代码生成器的gcc实现细节。令人惊讶的是很难找到好的文档,我确实发现this page非常准确。关键部分:
退出指令后:
%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
“必须包含来自通话时间的内容”这个短语解释了为什么将它们推入功能序言并在结语中再次弹出。