中易网

怎么样分一个函数是否是 用寄存器返回值的函数

答案:1  悬赏:80  
解决时间 2021-10-11 07:41
怎么样分一个函数是否是 用寄存器返回值的函数
最佳答案
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;
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
谁能告诉我什么眼霜补水效果好,性价比要高?
杏林轩健康服务,加盟杏林轩健康服务前景如何
中秋节给老师的短信祝福
冷热水龙头阀芯价格是多少呢?不同水龙头的出
谁能推荐几个简单易行的,提高和保护视力的方
瓷砖接缝处的黑垢如何才能去除啊?
狗狗得疟疾因注意哪些事项(速度,拖不得!!
毛泽东当年抽过一次签签上写的是什么?
遵义网吧有那些?
东莞市大岭山镇伟创力招聘普工现在要社保吗?
母乳缺少的原因有哪些
玉田---宝坻的汽车时刻表 急急急急急急
请问福建福州星东方舞蹈学校的具体地址?
高分!请列西安已有或规划在建中的主题性质的
延吉铁南御翠园什么时候开始备案
推荐资讯
电陶炉修理方法有哪些?
请问在陕西阎良区开个九牧王男装专卖店怎么样
我想做去上眼皮眼袋的那种抽脂,可发现自己眼
南充支队仪陇大队科目三考场地址在哪,我要去
苍山县到底有申通快递吗?
上网打开网页的速度变慢了是什么原因?
三叶沙发定做得多长时间
2010年2月10日左右到哈尔滨旅游,请给一份自
pvc下水管为什么出现裂缝?
邹平商厦手机大卖场信誉怎么样
清代竹刻笔筒的价格贵吗,清代的竹笔筒价格算
百味坊排骨米饭 青岛有吗?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?