Loops 循环未按预期工作的MASM代码,

Loops 循环未按预期工作的MASM代码,,loops,assembly,masm,irvine32,Loops,Assembly,Masm,Irvine32,我目前正在学习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的值中减去2 TITLE Recursion Solver INCLUDE Irvine32.inc .data n SDWORD 15 ; n2 SDWORD 0 ; n-2 (n0) n1 SDWORD 3 ; n-1 (n1)

我目前正在学习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
的值中减去2

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++程序的输出:

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     ;

你是对的(我已经确定了),但看看我写的C++程序中的F(15)的值(如果我没有错的话,它是10925),程序集输出一个不同的(负数)。我没有MASM编译器,而且我很久没有使用汇编程序了:)。但是在你的帖子中写下所有的值(f2)…f(15),我会尽力帮助你。另一个可能的问题是打印整数,您确定WriteInt方法没有错误吗?:)这是一个库(irvine32)函数,我想它是没有bug的,因为我们的教授告诉我们使用它:-)我对MASM中代码的输出比C中的更感兴趣:)让我们