首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2013-04-21 
intel编译器编译斐波拉契数列的疑问使用icc编译器编译斐波拉契数列,c代码详见下方,得到汇编代码,出现以下

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


[解决办法]
ecx是作为checkesp校验的。。。堆栈检测用途。。多学习就明白了。
[解决办法]
只是用于验证esp堆栈没有溢出。。这是编译器的功能。。设置不做堆栈检查那个pop ecx就没了

热点排行