解读C++编译器编译功能

下面深度讲解C++中的大规模C++编译器,C++编译器具有很强的复杂性,并且源程序的行数也是非常多,所以,在进行C++编译器编译时,一定要定一个计划表,这样才能更好的对C++编译器进行操作。

员工经过长期磨合与沉淀,具备了协作精神,得以通过团队的力量开发出优质的产品。创新互联坚持“专注、创新、易用”的产品理念,因为“专注所以专业、创新互联网站所以易用所以简单”。公司专注于为企业提供成都做网站、网站建设、外贸营销网站建设、微信公众号开发、电商网站开发,成都小程序开发,软件按需策划等一站式互联网企业服务。

接着再跟着编译运行的主线来分析它的源程序。下面先看一下简单的C++例子,如下:

 
 
 
  1. #001 #include  
  2. #002   
  3. #003 int main(void)  
  4. #004 {  
  5. #005  int nTest1 = 1;  
  6. #006  int nTest2 = 2;  
  7. #007  int nTest3;  
  8. #008  int i;  
  9. #009    
  10. #010  nTest3 = nTest1 + nTest2;  
  11. #011  printf("nTest3 = %d\r\n",nTest3);  
  12. #012    
  13. #013  for (i = 0; i < 5; i++)  
  14. #014  {  
  15. #015         printf("%d\r\n",nTest3+i);  
  16. #016  }  
  17. #017    
  18. #018  printf(__TIME__" "__DATE__"\r\nhello world\n");  
  19. #019  return 0;  
  20. #020 }  
  21. #021  

上面的程序就是用来说明编译器工作的例子,它在***行里包含了头文件stdio.h,由于后面调用printf函数输出显示到屏幕里。第二行空行,第三行是main函数,它是C程序的入口函数。在main函数里,定义了几个局部变量,分别第5,6,7,8行的变量。第10行作两个变量nTest1和nTest2的加法,然后赋值给变量nTest3。第11行显示变量nTest3的值,是用10进制输出显示。在第13到16行是5次输出nTest3+i值。在第18行里输出编译这个程序的时间和hello world的字符串。
 
C++编译器的任务,就是把上面的源程序变换到汇编代码输出,或者变成其它中间代码输出。在这里LCC编译器是输出汇编代码的,所以就不介绍其它的中间代码输出。那么LCC把上面的源程序变成什么样的汇编输出呢?下面就先把它的目标代码看一下,如下:

 
 
 
  1. #001 [global $main]  
  2. #002 [section .text]  
  3. #003 $main:  
  4. #004 push ebx  
  5. #005 push esi  
  6. #006 push edi  
  7. #007 push ebp  
  8. #008 mov ebp, esp  
  9. #009 sub esp, 16  
  10. #010 mov dword [ebp + -12], 1  
  11. #011 mov dword [ebp + -16], 2  
  12. #012 mov edi, dword [ebp + -12]  
  13. #013 mov esi, dword [ebp + -16]  
  14. #014 lea edi, [esi + edi]  
  15. #015 mov dword [ebp + -8], edi  
  16. #016 mov edi, dword [ebp + -8]  
  17. #017 push dword edi  
  18. #018 lea edi, [$L2]  
  19. #019 push dword edi  
  20. #020 call $printf  
  21. #021 add esp, 8  
  22. #022 mov dword [ebp + -4], 0  
  23. #023 $L3:  
  24. #024 mov edi, dword [ebp + -8]  
  25. #025 mov esi, dword [ebp + -4]  
  26. #026 lea edi, [esi + edi]  
  27. #027 push dword edi  
  28. #028 lea edi, [$L7]  
  29. #029 push dword edi  
  30. #030 call $printf  
  31. #031 add esp, 8  
  32. #032 $L4:  
  33. #033 inc dword [ebp + -4]  
  34. #034 cmp dword [ebp + -4], 5  
  35. #035 jl near $L3  
  36. #036 lea edi, [$L8]  
  37. #037 push dword edi  
  38. #038 call $printf  
  39. #039 add esp, 4  
  40. #040 mov eax, 0  
  41. #041 $L1:  
  42. #042 mov esp, ebp  
  43. #043 pop ebp  
  44. #044 pop edi  
  45. #045 pop esi  
  46. #046 pop ebx  
  47. #047 ret  
  48. #048 [extern $printf]  
  49. #049 [section .data]  
  50. #050 times ($-$$) & 0 nop  
  51. #051 $L8:  
  52. #052 db '00:30:28 Apr 07 2007', 13, 10, 'hello world', 10, 0  
  53. #053 times ($-$$) & 0 nop  
  54. #054 $L7:  
  55. #055 db '%d', 13, 10, 0  
  56. #056 times ($-$$) & 0 nop  
  57. #057 $L2:  
  58. #058 db 'nTest3 = %d', 13, 10, 0  
  59. #059  

LCC是可以生成很多目标代码的C++编译器,在这里主要介绍生成X86的NASM汇编的代码。上面的汇编代码就是NASM的汇编格式,可以使用NASM编译生成目标文件,然后再用连接程序生成可执行文件。如果不能看懂上面的NASM汇编,就需要去看NASM手册了,这个手册在网上有下载。如果想更深入理解汇编生成机器码的过程,当然也可以深入分析NASM的程序实现。

从上面的C++和汇编也可以看出,汇编代码比C++代码要复杂,行数也比较多,还分了数据段和代码段。所以使用C++编译器是可以大大地提高生产效率的,并且更容易理解,这样就容易降低软件的成本,容易开发大规模的软件工程。

本文题目:解读C++编译器编译功能
本文URL:http://www.mswzjz.cn/qtweb/news29/155579.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能