使用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
ASSUME CS:FLAT,DS:FLAT,SS:FLAT
_TEXT SEGMENT 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
_fibonacci PROC 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