汇编语言和斐波纳契数

时间:2016-03-28 22:44:46

标签: assembly masm masm32

为了保持这一点,我收到了我的第一个MASM32项目,其内容如下:"编写汇编程序以生成并显示前24个Fibonacci数字,从1开始到46368结束。&#34 ;由于这是我的第一个项目,我老实说根本不知道如何开始或编写这个代码。任何帮助将非常感激。非常感谢你。

1 个答案:

答案 0 :(得分:0)

fibunacci通常倾向于递归求解,而用简单的循环解决它就很容易了

你已经知道你的阵列将是24个字大,
在第一眼看来,你的循环看起来像是24步

虽然已经设置了f(1)和f(2),并且你需要至少使用这两个元素,所需的元素数量是22,而不是24 ...所以让我们从我们已经知道的开始

fib  dw 24 dup (0)    ; i don't know masm too well, this should create 24 words
    mov word ptr[fib  ],1   ; f(1)
    mov word ptr[fib+2],1   ; f(2)

    mov cx,22           ; this will be the loop counter
l1:
    ; add up the last 2 elements
    dec cx
    jnz l1
好的,到目前为止一切顺利。 “将最后2个元素加起来”BEGS用于存储最后两个元素的2个寄存器,并不总是必须从内存中读取它们。所以让我们使用AX和BX,AX代表元素n-2,BX代表n-1。我们将它们相加,并将结果存储在'next'数组元素中。
对于数组,使用si和di很棒,而我们写作时,DI(目标索引)是我们的最佳选择

fib  dw 24 dup (0)    ; i don't know masm too well, this should create 24 words

calculate:
    cld
    mov word ptr[fib  ],1   ; f(1)
    mov ax, 1   
    mov word ptr[fib+2],1   ; f(2)
    mov bx, 1
    mov di, offset fib+4    ; does this work in MASM ?

    mov cx,22           ; this will be the loop counter
l1:
    add ax,bx
    stosw           ; write new element to array   
                    ; note: this is equivalent to mov [di], AX and add si,2

    dec cx
    jnz l1

加起来之后,我们需要用正确的值加载ax和bx,带有f(n)的ax和带有f(n-1)的bx ...我们可以通过从数组读取来做到这一点,但是如果我们采取仔细观察,AX是这个循环的f(n)(刚刚计算的最后一个元素),对于下一个循环将是f(n-1),而BX是f(n-1),它将是f(n-) 2)用于下一个循环。所以我们所要做的就是交换它们

fib  dw 24 dup (0)    ; i don't know masm too well, this should create 24 words

calculate:
    cld
    mov word ptr[fib  ],1   ; f(1)
    mov ax, 1   
    mov word ptr[fib+2],1   ; f(2)
    mov bx, 1
    mov di, offset fib+4    ; does this work in MASM ?

    mov cx,22           ; this will be the loop counter
l1:
    add ax,bx
    stosw           ; write new element to array   
                    ; note: this is equivalent to mov [di], AX and add si,2
    xchg ax,bx      

    dec cx
    jnz l1

etvoilà:你计算了24个元素

PS:我不确定MASM会编译这个,我正在使用另一个汇编程序,给我一个提示,我会纠正它