我对return 语句的理解----2

本文详细解析了C++中不同数据类型的函数调用过程及内部实现,包括整型、字符型、浮点型和双精度型的数据处理方式,并通过具体的汇编代码示例说明了每种类型的操作细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个我们写个稍微复杂一些的.

  1. #include <iostream>
  2. using namespace std;
  3. int Add(int a,int b)
  4. {
  5.     return (a+b);
  6. }
  7. int main()
  8. {
  9.     int c=Add(3,5);
  10.     return 0;
  11. }

 

带有两个参数.

进入Add函数的汇编

  1. 00401030   push        ebp
  2. 00401031   mov         ebp,esp
  3. 00401033   sub         esp,40h
  4. 00401036   push        ebx
  5. 00401037   push        esi
  6. 00401038   push        edi
  7. 00401039   lea         edi,[ebp-40h]
  8. 0040103C   mov         ecx,10h
  9. 00401041   mov         eax,0CCCCCCCCh
  10. 00401046   rep stos    dword ptr [edi]
  11. 5:        return (a+b);
  12. 00401048   mov         eax,dword ptr [ebp+8] //仍然是EAX做为中介
  13. 0040104B   add         eax,dword ptr [ebp+0Ch]
  14. 6:    }
  15. 0040104E   pop         edi
  16. 0040104F   pop         esi
  17. 00401050   pop         ebx
  18. 00401051   mov         esp,ebp//这句释放了40h的内存块
  19. 00401053   pop         ebp
  20. 00401054   ret

退出到 C=Add(3,5);

  1. 00401081   add         esp,8  //为了堆栈平衡.
  2. 00401084   mov         dword ptr [ebp-4],eax//把返回值放到主函数的局部变量中

下面我们看整个的全貌

 

  1. 1:    #include <iostream>
  2. 2:    using namespace std;
  3. 3:    int Add(int a,int b)
  4. 4:    {
  5. 00401030   push        ebp
  6. 00401031   mov         ebp,esp
  7. 00401033   sub         esp,40h
  8. 00401036   push        ebx
  9. 00401037   push        esi
  10. 00401038   push        edi
  11. 00401039   lea         edi,[ebp-40h]
  12. 0040103C   mov         ecx,10h
  13. 00401041   mov         eax,0CCCCCCCCh
  14. 00401046   rep stos    dword ptr [edi]
  15. 5:        return (a+b);
  16. 00401048   mov         eax,dword ptr [ebp+8]
  17. 0040104B   add         eax,dword ptr [ebp+0Ch]
  18. 6:    }
  19. 0040104E   pop         edi
  20. 0040104F   pop         esi
  21. 00401050   pop         ebx
  22. 00401051   mov         esp,ebp
  23. 00401053   pop         ebp
  24. 00401054   ret
  25. --- F:/1/2.cpp  ----------------------------------------------------------------------------------------------------------
  26. 7:
  27. 8:    int main()
  28. 9:    {
  29. 00401060   push        ebp
  30. 00401061   mov         ebp,esp
  31. 00401063   sub         esp,44h  //注意多分配了4个字节
  32. 00401066   push        ebx
  33. 00401067   push        esi
  34. 00401068   push        edi
  35. 00401069   lea         edi,[ebp-44h]
  36. 0040106C   mov         ecx,11h
  37. 00401071   mov         eax,0CCCCCCCCh
  38. 00401076   rep stos    dword ptr [edi]
  39. 10:       int c=Add(3,5);
  40. 00401078   push        5
  41. 0040107A   push        3
  42. 0040107C   call        @ILT+0(Add) (00401005)
  43. 00401081   add         esp,8
  44. 00401084   mov         dword ptr [ebp-4],eax
  45. 11:       return 0;
  46. 00401087   xor         eax,eax
  47. 12:   }
  48. 00401089   pop         edi
  49. 0040108A   pop         esi
  50. 0040108B   pop         ebx
  51. 0040108C   add         esp,44h
  52. 0040108F   cmp         ebp,esp
  53. 00401091   call        __chkesp (00408180)
  54. 00401096   mov         esp,ebp
  55. 00401098   pop         ebp
  56. 00401099   ret

这是int类型,那如果是char类型,float类型,double类型呢

代码类似,我写出重要的部分.

char类型

5:        return (a+b);
00401048   movsx       eax,byte ptr [ebp+8]  //注意指令用  movsx.
0040104C   movsx       ecx,byte ptr [ebp+0Ch]
00401050   add         eax,ecx

10:       int c=Add('c','a');
00401088   push        61h
0040108A   push        63h
0040108C   call        @ILT+0(Add) (00401005)
00401091   add         esp,8  //Add函数执行完,跳到这
00401094   movsx       eax,al//注意又是movsx
00401097   mov         dword ptr [ebp-4],eax

movsx     将有符号数符号位扩展再传送   
movzx     无论有符号还是无符号高位全部置0扩展 

float 类型 

用了80387指令.

5:        return (a+b);
00401048   fld         dword ptr [ebp+8]
0040104B   fadd        dword ptr [ebp+0Ch]

1.浮点数操作
fld指令从内存中将一个4字节(single)、8字节(double)、10字节(double extended)的浮点数压入FPU的浮点寄存器栈中
FLD src
装入实数到st(0)
st(0) <- src (mem32/mem64/mem80)

 

加法
FADD
加实数
st(0) <-st(0) + st(1)

 

到了 c=Add(3.0,5.0);

0040108A   fstp        dword ptr [ebp-4]

 

FSTP dest
dest <- st(0) (mem32/mem64/mem80);然后再执行一次出栈操作

 

double 类型

5:        return (a+b);
00401048   fld         qword ptr [ebp+8]  //注意用qword
0040104B   fadd     qword ptr [ebp+10h]

到了c=Add(3.0,5.0);

0040108B   add         esp,10h

0040108E   fstp        dword ptr [ebp-4]

 

总结:

char  , int 类型照样用EAX.

float ,double类型有st(0).


     


 

 

 


 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值