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

开发 后端
所谓C++编译器,其实就是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。

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

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

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

上面的程序就是用来说明编译器工作的例子,它在***行里包含了头文件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把上面的源程序变成什么样的汇编输出呢?下面就先把它的目标代码看一下,如下:

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

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

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

【编辑推荐】

  1. 简介学习C++总结之谈
  2. 对C++库函数进行学习探索总结笔记
  3. C++类库设计的基本构思与方法
  4. C++语言真的还有市场价值?
  5. C++类库设计的基本构思与方法
责任编辑:chenqingxiang 来源: cnbeta
相关推荐

2010-01-18 10:34:21

C++编译器

2010-10-20 13:43:37

C++编译器

2010-01-18 10:28:15

C++编译器

2010-01-12 16:42:59

C++编译器

2010-01-14 15:29:44

C++编译器

2010-02-03 13:14:03

C++编译器命令

2010-01-21 09:26:53

CC++编译器

2010-01-27 16:39:48

C++编译器

2010-01-14 14:55:14

C++编译器

2009-01-12 10:16:11

Visual C++编译器选项设置

2023-11-15 17:58:58

C++代码

2010-01-27 14:48:55

优秀C++编译器

2009-08-10 17:12:54

C#编译器

2012-02-09 09:14:32

C++

2010-01-22 18:33:17

C++编译器

2010-01-08 16:00:46

C++编译器

2010-01-15 16:37:28

Visual C++

2010-01-13 17:12:26

C++编译器

2013-03-18 09:42:47

C++C++ 11

2010-01-19 13:01:32

C++数据类型
点赞
收藏

51CTO技术栈公众号