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
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章