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;
}

被折叠的 条评论
为什么被折叠?



