为了保持这一点,我收到了我的第一个MASM32项目,其内容如下:"编写汇编程序以生成并显示前24个Fibonacci数字,从1开始到46368结束。&#34 ;由于这是我的第一个项目,我老实说根本不知道如何开始或编写这个代码。任何帮助将非常感激。非常感谢你。
答案 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'数组元素中。 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会编译这个,我正在使用另一个汇编程序,给我一个提示,我会纠正它