查看函数返回值1
void showchar(char a,int b);
main()
{
int a1,a2,a3;
a1 = 0xa1;
a2 = 0xa2;
a3 = 0xa3;
showchar('a',2);
}
void showchar(char a,int b)
{
*(char far*) (0xb8000000 + 160*80 +80)=a;
*(char far *)(0xb8000000 + 160*80 +81)=b;
}
分析一下:main中的前三个变量:a1,a2,a3存放在栈中,这是前几天已经写过的博客记录下来的;可以看到showchar(‘a’,2)的参数用ax转移在栈中。
函数的参数存放在栈中,也是一种局部变量;
showchar(char a,int b)可以看成是char a='a',int b = 2;
这就是为什么,传递较大的参数时,都要这样压栈出栈,参数过大,会很消耗内存和时间,因此,这就是为什么把大参数改成指针的原因。
探索C语言参数2
void showcharA(int,int,...); // 这种写法代表参数个数未知;
main()
{
int a1,a2,a3;
a1 = 0xa1;
a2 = 0xa2;
a3 = 0xa3;
showcharA(8,2,'a','b','c','d','e','f','g','h');
}
void showcharA(int n,int color,...)
{
int a;
for(a=0;a != n;a++)
{
*(char far *)(0xb8000000 + 160*10 + 80) = *(int *)(_BP + 8 + a +a);
*(char far *)(0xb8000000 + 160*10 + 81) = color;
}
}
可以看到,main()函数中的a1,a2,a3存放在栈中,内存位置分别是:bp-6,bp-4,bp-2;
而showcharA(8,2,'a','b','c','d','e','f','g','h');
的参数同样存放在栈中,从右向左开始向栈中存放。
main函数中的所有参数都放入栈中后,开始调用这个函数;
for原理也是JNZ跳转。
总结:函数的参数是局部变量存放在栈中。