解读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  

上面的程序就是用来说明编译器工作的例子,它在第一行里包含了头文件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  

相关推荐