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

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

源代码如下:

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

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

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

查看汇编结果:

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指令动态查看调用线帧的情况:

  • 设置函数断点:
  • 使用d查看汇编代码:
  • 使用i r查看此时寄存器中的值:
原文地址:https://www.cnblogs.com/20145224kevs/p/6130490.html