MASM中Fibonacci系列的输出不正确

时间:2012-11-04 12:34:04

标签: assembly x86 masm irvine32

我一直在研究这个代码的分配,似乎无法让输出正确。有人可以帮帮我吗?

注意:该程序是在MASM中编译的

  1. 我只允许使用 reg-mem reg-reg 架构命令。
  2. 仅使用 MOV ADD DEC JMP Jcc 指令。
  3. 仅使用四个主要寄存器,即 EAX EBX ECX EDX ,以及 ESI 寄存器及其子寄存器,用于算术/逻辑运算。
  4. 除了字符串内存变量之外,不允许其他内存变量。
  5. 以下是代码:

    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
    

3 个答案:

答案 0 :(得分:0)

; ...
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
; ...

答案 1 :(得分:0)

亲爱的,人们在基于欧文的东西教学?这解释了很多。

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

你需要记住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,并假设它不会混淆任何其他寄存器。

答案 2 :(得分:0)

斐波那契只需要跟踪两个数字。如果允许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 ......