2012-03-07 61 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