怎么样分一个函数是否是 用寄存器返回值的函数
答案:1 悬赏:80
解决时间 2021-10-11 07:41
- 提问者网友:末路
- 2021-10-10 12:00
怎么样分一个函数是否是 用寄存器返回值的函数
最佳答案
- 二级知识专家网友:人间朝暮
- 2021-10-10 13:02
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;
}
你的这一句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;
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯