解读C++编译器编译功能
来源:互联网 发布:软件职业技术学院 编辑:程序博客网 时间:2024/06/05 21:57
- 所谓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
LCC是可以生成很多目标代码的C++编译器,在这里主要介绍生成X86的NASM汇编的代码。上面的汇编代码就是NASM的汇编格式,可以使用NASM编译生成目标文件,然后再用连接程序生成可执行文件。如果不能看懂上面的NASM汇编,就需要去看NASM手册了,这个手册在网上有下载。如果想更深入理解汇编生成机器码的过程,当然也可以深入分析NASM的程序实现。
从上面的C++和汇编也可以看出,汇编代码比C++代码要复杂,行数也比较多,还分了数据段和代码段。所以使用C++编译器是可以大大地提高生产效率的,并且更容易理解,这样就容易降低软件的成本,容易开发大规模的软件工程。
- 解读C++编译器编译功能
- C编译器的八个编译阶段
- 编译c程序时 gcc编译器
- C语言的编译器及编译过程
- 通过GCC编译器编译c语言
- C/C++的编译器|编译环境
- linux下c编译全程细致解读
- 编译器功能
- 判断当前编译器是C++编译还是C编译
- [C/C++]_[通过编译器获取编译日期]
- 《C编译原理》自己写C语言编译器
- 为notepad++添加g++编译器编译objc/c/c++/C#
- [C编译器]在VS中编译调试C程序
- 为notepad++添加g++编译器编译objc/c/c++/C#
- 判断程序是有C编译器编译 还是由c++编译器编译
- Windows下C++编译环境--编译器和IDE
- 编译原理 编译器的实现(C语言实现)
- 编译时C/C++编译器(cl.exe)crash
- Dsquery
- Linux 远程控制方法概述
- SVN命令行操作
- 美元转中文
- 郁闷~~~
- 解读C++编译器编译功能
- 部分背包问题(贪心)
- “运行错误-不能识别对象”的处理方法
- CIconListBox带图标的列表框类
- 【狩猎】:我看3Q大战
- The #if, #elif, #else, and #endif Directives
- 再看sizeof
- nagios
- JSON格式