在MASM中向斐波那契数列输出错误

我一直在为这个任务编写代码,似乎无法获得正确的输出结果。 任何人都可以请帮我吗?

注意:该程序在MASM中编译

  • 我只能使用reg-memreg-reg架构命令。
  • 只能使用MOVADDDECJMPJcc指令。
  • 只能使用四个主要寄存器 ,即EAX,EBX,ECXEDX,ESI一起登记和算术/逻辑运算及其子寄存器。
  • 除此之外,字符串内存变量不允许其他内存变量。
  • 以下是代码:

    INCLUDE Irvine32.inc
    .data
    
    string1 byte "Enter number to generate Fibonacci series: ",0
    string2 byte "Fibonacci is ",0
    
    .code
    main PROC
    call    DumpRegs;
    mov     edx,offset string1;
    call    writestring;
    call    ReadInt;
    mov     ecx,eax;
    mov     eax,1;
    call    DumpRegs;
    dec     ecx;
    mov     esi,eax;
    JMP     Jumpzero;
    mov edx, offset string2;    
    call writeint           ;   Display the contents of eax register on the output device
    
    Jumpzero:
    add     eax,esi;
    call    DumpRegs;
    inc     esi;
    dec     ecx
    jnz     Jumpzero
    exit
    MAIN ENDP   
    END main
    

    ; ...
    call ReadInt
    mov ecx,eax
    
    mov eax,1
    mov edx,eax
    call writeint    ; Assuming EDX is incremented by writeint
    _generate:
        call writeint
        add eax,edx
        mov edx,eax
    loop _generate
    ; ...
    

    哦,亲爱的,人们正在根据欧文的材料进行教学? 这解释了很多。

    我认为你需要像这样思考:

    你需要记住3个数字:

  • 当前数字

  • 以前的号码

  • 当前和以前的总和

  • 然后将电流移至前一个,总计至当前并继续。

    因此,如果您设置为ebx =当前值,edx =之前的值,ecx =要输出的值的数量

    那么你可以使用一个中央循环,如:

    fib_loop:
        mov eax, ebx
        add eax, edx
        mov edx, ebx
        mov ebx, eax
        call writeint
        dec ecx
    jnz fib_loop
    

    注意:我正在从您的评论中看到'writeint'过程的行为,它仅在输出设备上显示eax,并假定它不会与任何其他寄存器混淆。


    只有两个数字需要跟踪Fibonacci。 如果允许XCHG,逻辑将是:

        swap(A, B)
        A += B
    

    如果不是,则交换需要临时变量:

        D = B
        B = A
        A = D
        A += B
    

    A和B的初始值取决于你想要的第一个输出。 例如,从A = 1(fib(-1)),B = -1(fib(-2))开始,然后会生成序列0,1,1,2,3,5,...。 或者从A = 0(fib(0)),B = 1(fib(-1))开始,产生序列1,1,2,3,5,......

    链接地址: http://www.djcxy.com/p/89853.html

    上一篇: Incorrect output to Fibonacci series in MASM

    下一篇: Division in x86 Assembly GAS