函数返回值

来源:互联网 发布:财经直播间源码 编辑:程序博客网 时间:2024/05/09 08:23

 

int Count()
{
  int i,j;
  i=100;
  j=200;
  return i+j;
}

测试函数:
void Test()
{
int k=Count();
printf("/n k[%d]/n");
}

 

C/C++的函数返回值一般是放在寄存器eax里的,而不是在栈里。

你的这一句int k = Count()的汇编语句就是这样:

mov [esp - 4], eax //eax里是300,esp - 4是局部变量k的位置


你可以在vc里做个实验:

int  add(int a, int b)
{
__asm {
  mov eax,a // 把参数1存入eax
  add eax,b // eax += 参数2, 结果在eax里
}
}

int main()
{
printf("%d/n", add(3, 4));
return 0;
}

楼主需要了解下寄存器这一概念,我就不把C/C++函数的汇编代码给发出来了。

还有在汇编层面来看,函数的返回值根本就没有定论,函数可以通过多种方式返回。保存返回值在eax里只是C/C++的一个约定而已。

返回值可以放在栈里,但你在C的语言层面上可能做不到,其实随着函数的结束,mov esp, ebp这条指令过后,函数内部的局部变量就报废了。如果你之后没改变过栈的内容,你可以用栈来存返回值,但比起用寄存器来存储,存储和读取要慢的多。

自己突发奇想在vc下试了下用栈“返回”值,写了段代码:


#include <stdio.h>


void __declspec(naked) __stdcall return_a_value()
{
int local;
local = 1990; // 栈空间
__asm ret
}

int main()
{
int local = 1;
return_a_value(); // 用栈返回值
printf("%d/n", local);
return 0;
}