大家好,欢迎来到IT知识分享网。
我们知道,函数不能嵌套定义,但是可以嵌套调用的,函数的调用时,相关数据压入栈空间,返回时,相关数据从栈空间弹出。而对于函数的返回值,既然被函数的栈帧空间都释放了,那怎样将值返回给主调函数呢?
先来看返回各类值的一个例子:
#include
using namespace std; char getChar(){ return 'c';} short getShort(){ return 2;} int getInt(){ return 0x0;} int* getP(){ int* p=new int(5); return p;} float getFloat(){ return 5.1;} double getDouble(){ return 5.2;} typedef struct Student{ int id; char name[12]; double score; }stu; stu getStu(){ stu s={12,"wwu",88};return s;} int main() { char c = getChar(); short si= getShort(); int ii = getInt(); int* p = getP(); float f = getFloat(); double d= getDouble(); stu s = getStu(); getchar(); return 0; }
1 返回整数值
20: char c = getChar(); 0040126E call @ILT+45(getChar) (00) 00 mov byte ptr [ebp-4],al
返回的整数值保存在寄存器EAX的AL中
2 返回short整型
返回的整数值保存在寄存器ax中
3 返回整型
返回的整数值保存在寄存器eax中
4 返回指针
23: int* p = getP(); 00 call @ILT+20(getP) (00) 0040128C mov dword ptr [ebp-10h],eax
返回的指针变量保存在寄存器eax中
5 返回浮点数
24: float f = getFloat(); 0040128F call @ILT+15(getFloat) (00) 00 fstp dword ptr [ebp-14h] 25: double d= getDouble(); 00 call @ILT+25(getDouble) (0040101e) 0040129C fstp qword ptr [ebp-1Ch]
CPU中集成了一个FPU(Float Point Unit,浮点运算单元,也称协处理器),专用于浮点运算,FPU中包含有8个寄存器,分别为ST0~ST7。
FSTP 指令将 ST(0) 寄存器中的值复制到目标操作数,目标操作数可以是内存位置或 FPU 寄存器堆栈中的另一个寄存器。将值存储到内存时,值会转换成单精度或双精度实数格式。然后弹出寄存器堆栈。为了弹出寄存器堆栈,处理器将 ST(0) 寄存器标记为空,并使堆栈指针 (TOP) 递增 1。FSTP 指令还可以按扩展的实数格式在内存中存储值。
6 返回自定义类型
26: stu s = getStu(); 0040129F lea eax,[ebp-64h] 004012A2 push eax 004012A3 call @ILT+10(getStu) (0040100f) 004012A8 add esp,4 004012AB mov esi,eax 004012AD mov ecx,6 004012B2 lea edi,[ebp-4Ch] 004012B5 rep movs dword ptr [edi],dword ptr [esi] 004012B7 mov ecx,6 004012BC lea esi,[ebp-4Ch] 004012BF lea edi,[ebp-34h] 004012C2 rep movs dword ptr [edi],dword ptr [esi]
对于寄存器eax无法保存返回的数据类型时,在函数调用前,编译器会预先将要返回的数据所需要的内存空间使用自己的栈帧空间(主调函数的栈空间)保留出来,这样当被调函数在退出时,将返回值的数据复制到预先分配的主调函数的内存栈空间,以这个临时空间的首地址作为首地址作为返回值。由于这个临时空间是调用者函数内部的栈空间,所以说是可用的。
综上,被调函数的返回值通过以下三类来保存:
1 CPU寄存器;
2 EPU寄存器;
3 主调函数的栈空间。
-End-
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/90833.html