intel编译器编译斐波拉契数列的疑问
使用icc编译器编译斐波拉契数列,c代码详见下方,得到汇编代码,出现以下疑问:
1。函数入口处保护寄存器时,为何对于esi寄存器入栈两次,而出栈时却对应于esi,ecx,明明没有入栈ecx,而出栈时却多出个ecx,不知有何寓意?
2。icc生成的汇编代码中的注释很多都不知道什么意思,譬如“;2.1”“; LOE eax ebx ebp edi”“; Preds .B1.2”这些都是什么意思呢?
3。在链接时会出错,报错主要是因为生成的asm文件中的一些库文件找不到,我找到的解决办法是,将vc中的这些库手动复制到当前目录下,不过觉得这不是根本解决办法,因该与环境变量的设置有关,不过不太清楚如何修改。
另外,使用命令行模式调用icc时,我想对于生成的汇编代码重命名,譬如:“icl -S -o fibo_111.s fibo.c”,不过在生成汇编文件时好像默认生成的是“fibo.asm”,为什么呢?
请教大牛指点一二!
c语言代码:
int fibonacci(int n)
{ if (n < 2)
{
return n;
}
return fibonacci(n - 2) + fibonacci(n - 1);
}
; -- Machine type PW
; mark_description "Intel(R) C++ Compiler XE for applications running on IA-32, Version 12.0.0.104 Build 20101006";
; mark_description "-S";
.686P
.387
OPTION DOTNAME
ASSUMECS:FLAT,DS:FLAT,SS:FLAT
_TEXTSEGMENT PARA PUBLIC FLAT 'CODE'
;COMDAT _fibonacci
TXTST0:
; -- Begin _fibonacci
; mark_begin;
IF @Version GE 800
.MMX
ELSEIF @Version GE 612
.MMX
MMWORD TEXTEQU <QWORD>
ENDIF
IF @Version GE 800
.XMM
ELSEIF @Version GE 614
.XMM
XMMWORD TEXTEQU <OWORD>
ENDIF
ALIGN 16
PUBLIC _fibonacci
_fibonacciPROC NEAR
; parameter 1: eax
.B1.1: ; Preds .B1.0
mov eax, DWORD PTR [4+esp] ;2.1
PUBLIC _fibonacci.
_fibonacci.::
push esi ;2.1
push ebp ;2.1
push esi ;2.1
mov ebp, eax ;2.1
cmp ebp, 2 ;2.12
jl .B1.3 ; Prob 5% ;2.12
; LOE ebx ebp edi
.B1.2: ; Preds .B1.1
lea eax, DWORD PTR [-2+ebp] ;6.23
call _fibonacci. ;6.9
; LOE eax ebx ebp edi
.B1.8: ; Preds .B1.2
dec ebp ;6.42
mov esi, eax ;6.9
mov eax, ebp ;6.28
call _fibonacci. ;6.28
; LOE eax ebx esi edi
.B1.7: ; Preds .B1.8
mov ebp, eax ;6.28
add ebp, esi ;6.28
; LOE ebx ebp edi
.B1.3: ; Preds .B1.1 .B1.7
mov eax, ebp ;
pop ecx ;
pop ebp ;
pop esi ;
ret ;
ALIGN 16
; LOE
; mark_end;
_fibonacci ENDP
;_fibonacciENDS
_TEXTENDS
_DATASEGMENT DWORD PUBLIC FLAT 'DATA'
_DATAENDS
; -- End _fibonacci
_DATASEGMENT DWORD PUBLIC FLAT 'DATA'
_DATAENDS
INCLUDELIB <libmmt>
INCLUDELIB <LIBCMT>
INCLUDELIB <libirc>
INCLUDELIB <svml_disp>
INCLUDELIB <OLDNAMES>
INCLUDELIB <libdecimal>
END