源代码如下:

#include<stdio.h>
int g(int x)
{
	return x + 3;
}  

int f(int x)
{
	return g(x);
}

int main(void)
{
	return f(15) + 3;
}

查看汇编结果:

20145224 第五周实验楼实践部分补充

g:
	pushl	%ebp
	movl	%esp, %ebp
	movl	8(%ebp), %eax	//将15取出
	addl	$3, %eax	//执行15 + 3
	popl	%ebp
	ret

f:
	pushl	%ebp		//分配新的栈空间
	movl	%esp, %ebp	
	pushl	8(%ebp)		//将15重新入栈
	call	g		//调用g函数
	addl	$4, %esp
	leave
	ret

main:				//开始执行
	pushl	%ebp		//设置新的帧指针
	movl	%esp, %ebp	
	pushl	$15		//立即数15入栈
	call	f		//调用f函数
	addl	$4, %esp
	addl	$3, %eax	//返回值 + 3
	leave
	ret


使用gdb的bt/frame/up/down指令动态查看调用线帧的情况:

  • 设置函数断点:
    20145224 第五周实验楼实践部分补充
  • 使用d查看汇编代码:
    20145224 第五周实验楼实践部分补充
  • 使用i r查看此时寄存器中的值:
    20145224 第五周实验楼实践部分补充

相关文章:

  • 2022-03-04
  • 2021-08-19
  • 2021-08-22
  • 2021-12-07
  • 2021-12-27
  • 2021-07-07
  • 2021-12-19
猜你喜欢
  • 2021-09-28
  • 2022-02-13
  • 2021-07-26
  • 2021-08-07
  • 2021-07-08
  • 2021-12-25
  • 2021-04-16
相关资源
相似解决方案