循环的MASM代码无法正常工作



我目前正在学习MASM的过程中,我已经面对以下任务:

编写一个程序,该程序将根据以下递归公式计算f(n)的值:f(n)= f(n-1) 2*f(n-2)-2,f(0)= 0,f(1)= 3

我正在计算n = 15,并且由于我知道f(0)f(1)我从n的值中减去两个。

TITLE Recursion Solver
INCLUDE Irvine32.inc
.data
n   SDWORD 15       ;
n2  SDWORD 0        ; n-2 (n0)
n1  SDWORD 3        ; n-1 (n1)
.code
main PROC
mov ecx, n      ; initialize loop counter
sub ecx, 2      ; 

again:
    mov eax, n1     ; eax = f(n-1)
    mov ebx, n2     ; ebx = f(n-2)
    add ebx, ebx    ; ebx = 2*f(n-2)
    sub ebx, 2      ; ebx = 2*f(n-2) - 2
    add eax, ebx    ; eax = f(n-1) + 2*f(n-2) -2
    mov ebx, n2     ;
    mov n2, eax     ;
    mov n1, ebx     ;
    loop again
    call WriteInt
    exit
main ENDP
END main

我编写了一个简单的C 程序来根据公式计算n'TH值,但由于某种原因,组装程序无法正常工作。

这是我的C 程序的输出:

f(0) = 0
f(1) = 3
f(2) = 1
f(3) = 5
f(4) = 5
f(5) = 13
f(6) = 21
f(7) = 45
f(8) = 85
f(9) = 173
f(10) = 341
f(11) = 685
f(12) = 1365
f(13) = 2733
f(14) = 5461
f(15) = 10925

这是组件输出的整数:-13859

我可以看到一个错误。您将f(n-1)f(n-2)混合。修复它的最简单方法是通过更改起点的定义:

n1 SDWORD 3; n0
n2 SDWORD 0; n1

但是,您当然可以在代码中交换所有对这些变量的引用。

和我发现的第二个错误:

mov ebx, n1     ;
mov n1, eax     ;
mov n2, ebx     ;

最新更新