函数调用时栈的变化

C语言中调用函数只需要一句:

myfunction(v1,v2,v3);

但如果翻译成汇编,其实做了很多事情:

	......
	pushal    	# 寄存器压栈
	pushl	%eax	# 参数压栈
	pushl 	%ebx
	pushl 	%ecx
	call 	foo	# 调用函数
	popl 	%ecx
	popl 	%ebx
	popl 	%eax
	popal			
	......
foo:
	pushl 	%ebp
	movl 	%esp, %ebp
	......
	popl 	%ebp
	ret

如果不理解汇编,没关系,来看图:
image

在进入新的函数之前,需要将寄存器放入栈中保存,调用函数时的参数压入栈中,函数的返回地址压入栈中。函数调用时还额外保存了一个叫call's EBP的东西,并且用一个寄存器EBP指向这个位置。这是做什么的?

EBP主要有两个功能:

  1. 方便获取参数,参数总在EBP的上方两个地址处
  2. 通过EBP的链接关系,可以追溯函数调用关系
posted @ 2021-03-03 10:02:11
评论加载中...

发表评论