当前位置: 代码迷 >> 汇编语言 >> intel编译器编译斐波拉契据数列的疑问
  详细解决方案

intel编译器编译斐波拉契据数列的疑问

热度:308   发布时间:2016-05-02 04:54:57.0
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
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
  相关解决方案