【问题标题】:printing first 27 values in the Fibonacci series打印斐波那契数列中的前 27 个值
【发布时间】:2015-12-24 14:02:31
【问题描述】:

我正在尝试用汇编语言显示斐波那契数列中的前 27 个值。我有很多麻烦。我一直在转圈,所以请帮助我。我所看到的对我来说没有意义。

TITLE Fibonacci
INCLUDE Irvine32.inc
.code
main PROC
mov ebp, 0
mov edx, 1
mov ebx, edx
mov ecx, 27
L1:
mov eax, edx
mov ebp, eax
mov edx, ebx
add ebx, ebp
call DumpRegs
call WriteInt
loop L1
exit
main ENDP
END main

【问题讨论】:

  • 请使用代码块改进程序的格式,以便阅读和理解它。还请对您不理解和/或陷入困境的部分进行更具体的讨论,因为过于宽泛的问题不太可能导致您正在寻找的答案。也欢迎使用 StackOverflow!

标签: assembly masm fibonacci irvine32


【解决方案1】:

首先不要尝试在循环中包含前 2 个数字。它不付钱!

在您的代码中,您初始化 EBP=0 但这不是必需的。即使完全不使用 EBP,您也可以完成这项工作。

这是我的 27 个斐波那契数的简约版本:

 mov  eax, 1
 call WriteInt
 call WriteInt
 mov  edx, eax
 mov  ecx, 27-2
L1:
 xchg eax, edx
 add  eax, edx
 call WriteInt
 loop L1

请确保像 DumpRegsWriteInt 这样的例程保留您在代码中使用的寄存器。

【讨论】:

  • 在我暗示这段代码之后,我必须继续显示 26 个数字。我真的对汇编感到困惑
  • 为什么还要显示更多数字? @user3144770 写的代码已经输出了 27 个数字。
【解决方案2】:

如果我们使用不太直观的设置我们可以在一个循环中显示所有 27 个斐波那契数!

mov  ecx, 27
mov  eax, 1
cdq             ;EDX becomes 0
L1:
call WriteInt
xchg eax, edx
add  eax, edx
loop L1

此解决方案输出 1,1,2,3,5,8,13,...,但一些作者从 0 开始斐波那契数列。要做到这一点,只需在循环之前执行 1 个单独的 WriteInt 并使用 26 的计数器。

mov  ecx, 26
xor  eax, eax
call WriteInt
inc  eax
cdq             ;EDX becomes 0
L1:
call WriteInt
xchg eax, edx
add  eax, edx
loop L1

现在输出看起来像 0,1,1,2,3,5,8,...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多