解读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
相关推荐
IT之家 2020-03-11
graseed 2020-10-28
zbkyumlei 2020-10-12
SXIAOYI 2020-09-16
jinhao 2020-09-07
impress 2020-08-26
liuqipao 2020-07-07
淡风wisdon大大 2020-06-06
yoohsummer 2020-06-01
chenjia00 2020-05-29
baike 2020-05-19
扭来不叫牛奶 2020-05-08
hxmilyy 2020-05-11
黎豆子 2020-05-07
xiongweiwei00 2020-04-29
Cypress 2020-04-25
冰蝶 2020-04-20