aqicure
2020-05-09 18:54
采纳率: 50%
浏览 625

汇编递归求斐波那契数列前N项

汇编怎么用递归求斐波那契数列啊
救救孩子吧
已经几天了还是对堆栈不够理解
大佬最好别调用库做,萌新看不懂,
比如 输入个4
那么输出是 1 1 2 3 这四项

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • threenewbee 2020-05-10 02:06
    已采纳

    用turbo c写了一个

    #include <stdio.h>
    int foo(int n)
    {
      if (n <= 2) return 1;
      return foo(n - 1) + foo(n - 2);
    }
    main()
    {
      int i;
      for (i = 1; i < 10; i++)
        printf("%d ", foo(i));
      return 0;
    }
    

    得到如下汇编(帮你注释了下)

        ifndef  ??version
    ?debug  macro
        endm
        endif
        ?debug  S "..\project\app1.c"
    _TEXT   segment byte public 'CODE'
    DGROUP  group   _DATA,_BSS
        assume  cs:_TEXT,ds:DGROUP,ss:DGROUP
    _TEXT   ends
    _DATA   segment word public 'DATA'
    d@  label   byte
    d@w label   word
    _DATA   ends
    _BSS    segment word public 'BSS'
    b@  label   byte
    b@w label   word
        ?debug  C E9440EAA50112E2E5C70726F6A6563745C617070312E63
        ?debug  C E9A460A840122E2E5C696E636C7564655C737464696F2E68
        ?debug  C E9A460A840132E2E5C696E636C7564655C7374646172672E68
    _BSS    ends
    _TEXT   segment byte public 'CODE'
    ;   ?debug  L 2
    _foo    proc    near ;foo函数
        push    bp
        mov bp,sp
        push    si
        mov si,word ptr [bp+4] ;n参数放入si
    ;   ?debug  L 4
        cmp si,2 ;判断n和2的大小
        jg  @2 ;大于2跳转到后面
        mov ax,1 ;n<2则返回1
        jmp short @1
    @2:
    ;   ?debug  L 5
        mov ax,si
        dec ax ;这里就是计算n-1
        push    ax
        call    near ptr _foo ;递归调用foo
        pop cx
        push    ax
        mov ax,si
        add ax,-2 ;这里是计算n-2
        push    ax ;结果放在堆栈上
        call    near ptr _foo ;递归调用foo
        pop cx
        mov dx,ax ;foo(n-2)的结果放在dx
        pop ax ;从堆栈上得到 foo(n-1)的结果
        add ax,dx //相加放在ax上作为返回值
        jmp short @1
    @1: ;这里是函数返回部分
    ;   ?debug  L 6
        pop si
        pop bp
        ret 
    _foo    endp
    _TEXT   ends
    _DATA   segment word public 'DATA'
    _DATA   ends
    _TEXT   segment byte public 'CODE'
    ;   ?debug  L 7
    _main   proc    near
        push    si
    ;   ?debug  L 10
        mov si,1 ;si保存的是循环变量i,这里是i=1
        jmp short @7
    @6: ;循环开始
    ;   ?debug  L 11
        push    si ;将i作为参数放入堆栈
        call    near ptr _foo ;调用foo(i)
        pop cx
        push    ax ;把结果放入堆栈
        mov ax,offset DGROUP:s@ ;把"%d "放入堆栈
        push    ax
        call    near ptr _printf ;调用printf
        pop cx
        pop cx
    @5:
        inc si ;i++
    @7:
        cmp si,10 ;i == 10?
        jl  @6 ;小于10返回循环开始处(6)
    @4:
    ;   ?debug  L 12
        xor ax,ax
        jmp short @3
    @3:
    ;   ?debug  L 13
        pop si
        ret 
    _main   endp
    _TEXT   ends
        ?debug  C E9
    _DATA   segment word public 'DATA'
    s@  label   byte
        db  37 ;%
        db  100 ;d
        db  32 ;空格
        db  0
    _DATA   ends
    _TEXT   segment byte public 'CODE'
        extrn   _printf:near ;外部函数printf
    _TEXT   ends
        public  _main
        public  _foo
        end
    
    

    你可以用tasm汇编得到exe

    运行
    图片说明

    相关的工具程序下载

    https://download.csdn.net/download/caozhy/12404953

    问题解决的话,请点采纳

    打赏 评论
  • aqicure 2020-05-15 08:17

    大佬我采纳后总是404页面

    打赏 评论

相关推荐 更多相似问题