【问题标题】:MASM code with loops not working as expected,带有循环的 MASM 代码无法按预期工作,
【发布时间】:2014-03-08 18:01:39
【问题描述】:

我目前正在学习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

I wrote a simple C++ program to calculate the n'th value according to the formula,但由于某种原因,汇编程序没有按预期工作。

这是我的 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

【问题讨论】:

    标签: loops assembly masm irvine32


    【解决方案1】:

    我可以看到一个错误。你混合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) 函数,我猜它没有错误,因为我们的教授告诉我们使用它:-)
    • 我对你在 MASM 中的代码输出比在 C 中的输出更感兴趣 :)
    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2019-11-04
    • 2018-01-26
    • 2022-06-17
    • 2021-09-12
    • 1970-01-01
    • 2014-12-06
    相关资源
    最近更新 更多