为什么这些寄存器被推入堆栈?

时间:2012-03-21 01:12:53

标签: assembly

push    %ebp
push    %esp, %ebp
push    edi
push    esi
push    ebx

(x86 32位Linux)

为什么这些寄存器被推到堆叠状态? 由于某种原因迁移了......? 但是,为什么只有'edi''esi''ebx'被推了?

1 个答案:

答案 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 

“必须包含来自通话时间的内容”这个短语解释了为什么将它们推入功能序言并在结语中再次弹出。