Linux C call stack structure



C++ code


#include "stdio.h"
#include "string.h"

int FuncChar( char c )
{
	return  c == 'a';
}

void FuncName( char *pName )
{
	printf( "%s", pName );
}

int  Func3( long int hiSel, int iVal,   char * pName )
{
	if ( hiSel <= 4 )
		return 1;
	printf( "Name is %s   val: %d", pName, iVal);
	return 0;
}


int FuncMM( char c, int iVal,  char * pName, int * pData, int iWid, int iHet, int iDeep, long lTempral  )
{
	if ( c == 'a')d
		return 1;
	else if ( c == 'c' )
	{
		printf( "Name is %s   val: %d", pName, iVal);
	}
	return 0;
}

char *strName = "Test ASM Function Stack value!\n";
int     main ()
{
	int iWid = 1;
	int iHet = 2;
	int iDeep = sizeof(int);
	long lTempral = sizeof(long);
	int  arData[2];
	long int hiVal = sizeof(long int );
	char c = 'c';

	FuncChar( c );
	FuncName( strName );
	Func3( c, hiVal, strName);
	FuncMM(c, iWid, strName, &arData[0], iWid, iHet, iDeep, lTempral );

	return 0;
}

ASM code following:


FuncChar:
  push %rbp
  mov %rsp,%rbp
  mov %edi,%eax
  mov %al,-0x4(%rbp)
  cmpb $0x61,-0x4(%rbp)
  sete %al
  movzbl %al,%eax
  pop %rbp
  retq 
FuncName:
  push %rbp
  mov %rsp,%rbp
  sub $0x10,%rsp
  mov %rdi,-0x8(%rbp)
  mov -0x8(%rbp),%rax
  mov %rax,%rsi
  mov $0x4007b8,%edi
  mov $0x0,%eax
  callq 0x400470 <printf@plt>
  nop 
  leaveq 
  retq 
Func3:
  push %rbp
  mov %rsp,%rbp
  sub $0x20,%rsp
  mov %rdi,-0x8(%rbp)
  mov %esi,-0xc(%rbp)
  mov %rdx,-0x18(%rbp)
	if ( hiSel <= 4 )
  cmpq $0x4,-0x8(%rbp)
  jg 0x4005f1 <Func3+33>
		return 1;
  mov $0x1,%eax
  jmp 0x40060f <Func3+63>
	printf( "Name is %s   val: %d", pName, iVal);
  mov -0xc(%rbp),%edx
  mov -0x18(%rbp),%rax
  mov %rax,%rsi
  mov $0x4007bb,%edi
  mov $0x0,%eax
  callq 0x400470 <printf@plt>
	return 0;
  mov $0x0,%eax
}
  leaveq 
  retq 
{
FuncMM:
  push %rbp
  mov %rsp,%rbp
  sub $0x20,%rsp
  mov %edi,%eax
  mov %esi,-0x8(%rbp)
  mov %rdx,-0x10(%rbp)
  mov %rcx,-0x18(%rbp)
  mov %r8d,-0x1c(%rbp)
  mov %r9d,-0x20(%rbp)
  mov %al,-0x4(%rbp)
	if ( c == 'a')
  cmpb $0x61,-0x4(%rbp)
  jne 0x40063e <FuncMM+45>
		return 1;
  mov $0x1,%eax
  jmp 0x400662 <FuncMM+81>
	else if ( c == 'c' )
  cmpb $0x63,-0x4(%rbp)
  jne 0x40065d <FuncMM+76>
		printf( "Name is %s   val: %d", pName, iVal);
  mov -0x8(%rbp),%edx
  mov -0x10(%rbp),%rax
  mov %rax,%rsi
  mov $0x4007bb,%edi
  mov $0x0,%eax
  callq 0x400470 <printf@plt>
	return 0;
  mov $0x0,%eax
}
  leaveq 
  retq 
{
main:
  push %rbp
  mov %rsp,%rbp
  sub $0x30,%rsp
  mov %fs:0x28,%rax
  mov %rax,-0x8(%rbp)
  xor %eax,%eax
	int iWid = 1;
  movl $0x1,-0x2c(%rbp)
	int iHet = 2;
  movl $0x2,-0x28(%rbp)
	int iDeep = sizeof(int);
  movl $0x4,-0x24(%rbp)
	long lTempral = sizeof(long);
  movq $0x8,-0x20(%rbp)
	long int hiVal = sizeof(long int );
  movq $0x8,-0x18(%rbp)
	char c = 'c';
  movb $0x63,-0x2d(%rbp)
	FuncChar( c );
  movsbl -0x2d(%rbp),%eax
  mov %eax,%edi
  callq 0x400596 <FuncChar>
	FuncName( strName );
  mov 0x20098a(%rip),%rax        # 0x601040 <strName>
  mov %rax,%rdi
  callq 0x4005ab <FuncName>
	Func3( c, hiVal, strName);
  mov 0x20097b(%rip),%rdx        # 0x601040 <strName>
  mov -0x18(%rbp),%rax
  mov %eax,%ecx
  movsbq -0x2d(%rbp),%rax
  mov %ecx,%esi
  mov %rax,%rdi
  callq 0x4005d0 <Func3>
	FuncMM(c, iWid, strName, &arData[0], iWid, iHet, iDeep, lTempral );
  mov 0x20095f(%rip),%rdx        # 0x601040 <strName>
  movsbl -0x2d(%rbp),%eax
  mov -0x28(%rbp),%r9d
  mov -0x2c(%rbp),%r8d
  lea -0x10(%rbp),%rcx
  mov -0x2c(%rbp),%esi
  pushq -0x20(%rbp)
  mov -0x24(%rbp),%edi
  push %rdi
  mov %eax,%edi
  callq 0x400611 <FuncMM>
  add $0x10,%rsp
	return 0;
  mov $0x0,%eax
}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值