2012-03-07 65 views
0

在一些作业中,我必须在Assembly中创建一个斐波那契数列程序。我创建了这个代码,但它似乎没有正常工作,我不知道为什么。我相信我正确地做到了这一点,但EAX在每个循环中都保持“2”。装配中的非递归斐波那契数列

INCLUDE Irvine32.inc 
    .data 
     prev DWORD ? 
     next DWORD ? 
     val DWORD ? 
     count DWORD ? 
     total DWORD ? 

     myMsg BYTE "Fibonacci Sequence ",0dh,0ah,0 

    .code 
    main PROC 
     mov ecx,15 
     mov val,1 
     mov prev,-1 
     mov eax,1 
     mov edx,OFFSET myMsg 
     call WriteString 

    L1: 
     mov count,ecx 
     mov ebx,val 
     add ebx,prev 
     mov total,ebx 
     mov ebx,val 
     mov prev,ebx 
     mov eax,total 
     mov val, ebx 
     call WriteInt 
     call Crlf 
     loop L1 

    exit 
    main ENDP 
    END main 

回答

2

看起来是这样的(未经测试):

mov ecx, 15 
    mov eax, 0 ;a = 0 
    mov ebx, 1 ;b = 1 
_fib: 
    mov edx, eax 
    add edx, ebx ;sum = a + b 
    mov eax, ebx ;a = b 
    mov ebx, edx ;b = sum 
    loop _fib 
+0

我会在'add'后添加'sub ecx,1',并用'jnz _fib'替换'loop _fib'。但那只是我很无聊。 :P – 2012-03-07 22:56:22

+0

这实际上运作良好。谢谢。我没有想到这样做。 – seiryuu10 2012-03-07 23:55:03

1

你的循环可以简化为这伪代码:一旦上一个被设置为1

您应详细说明

L1: 
    count = ecx; // count === 15 
    eax = total = val + prev; // prev = -1 => eax = 0. prev = 1 => eax = 2 
    prev = val; // sets prev = 1, val doesn't change so prev = 1 after the first iteration 

正如你所看到的,EAX = VAL +分组将评估为2在你的问题的规范。你想打印多少个整数?这是计数= 15是什么?在这种情况下,每次迭代都需要减少计数并检查它是否为非零。

至于Fibonacci序列,你应该做这样的事情在你的循环:

// lets say that eax is the current integer in the sequence and prev is the previous integer 
// then the next integer = eax + prev 
ebx = eax + prev 
prev = eax 
eax = ebx 
+0

什么,我想是这样做的fib(15)= ???我不得不使用程序集来找出什么?是。我不能使用递归调用(因此为什么我认为我遇到问题) – seiryuu10 2012-03-07 20:09:27