Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编语言中的非递归斐波那契序列_Assembly_Masm_Fibonacci_Irvine32_Non Recursive - Fatal编程技术网

Assembly 汇编语言中的非递归斐波那契序列

Assembly 汇编语言中的非递归斐波那契序列,assembly,masm,fibonacci,irvine32,non-recursive,Assembly,Masm,Fibonacci,Irvine32,Non Recursive,在一些家庭作业中,我必须在汇编中创建一个斐波那契序列程序。我创建了这段代码,但它似乎工作不正常,我不知道为什么。我相信我这样做是正确的,但EAX在每个循环中都保持“2” INCLUDE Irvine32.inc .data prev DWORD ? next DWORD ? val DWORD ? count DWORD ? total DWORD ? myMsg BYTE "Fib

在一些家庭作业中,我必须在汇编中创建一个斐波那契序列程序。我创建了这段代码,但它似乎工作不正常,我不知道为什么。我相信我这样做是正确的,但EAX在每个循环中都保持“2”

    INCLUDE Irvine32.inc
    .data
        prev DWORD ?
        next DWORD ?
        val DWORD ?
        count DWORD ?
        total DWORD ?

        myMsg BYTE "Fibonacci Sequence ",0dh,0ah,0

   .code
    main PROC
       mov ecx,15
       mov val,1
       mov prev,-1
       mov eax,1
       mov edx,OFFSET myMsg
       call WriteString

    L1:
       mov count,ecx
       mov ebx,val
       add ebx,prev
       mov total,ebx
       mov ebx,val
       mov prev,ebx
       mov eax,total
       mov val, ebx
       call WriteInt
       call Crlf
       loop L1

    exit
    main ENDP
    END main

您的循环在伪代码中简化为:

L1:
   count = ecx; // count === 15
   eax = total = val + prev; // prev = -1 => eax = 0. prev = 1 => eax = 2
   prev = val; // sets prev = 1, val doesn't change so prev = 1 after the first iteration
如您所见,一旦prev设置为1,eax=val+prev将计算为2

你应该详细说明你的问题。要打印多少个整数?这就是计数=15的意义吗?在这种情况下,您需要在每次迭代中减少计数,并检查它是否为非零

对于斐波那契序列,您应该在循环中执行以下操作:

// lets say that eax is the current integer in the sequence and prev is the previous integer
// then the next integer = eax + prev
ebx = eax + prev
prev = eax
eax = ebx

您的循环在伪代码中简化为:

L1:
   count = ecx; // count === 15
   eax = total = val + prev; // prev = -1 => eax = 0. prev = 1 => eax = 2
   prev = val; // sets prev = 1, val doesn't change so prev = 1 after the first iteration
如您所见,一旦prev设置为1,eax=val+prev将计算为2

你应该详细说明你的问题。要打印多少个整数?这就是计数=15的意义吗?在这种情况下,您需要在每次迭代中减少计数,并检查它是否为非零

对于斐波那契序列,您应该在循环中执行以下操作:

// lets say that eax is the current integer in the sequence and prev is the previous integer
// then the next integer = eax + prev
ebx = eax + prev
prev = eax
eax = ebx
可能看起来像这样(未经测试):

可能看起来像这样(未经测试):


我想做的是fib(15)=???我必须用汇编来找出什么???是我不能使用递归调用(因此我认为我遇到了问题),我应该做的是fib(15)=???我必须用汇编来找出什么???是我不能使用递归调用(因此我认为我遇到了问题),我会在
add
之后添加
sub-ecx,1
,并将
loop\u fib
替换为
jnz\u fib
。但那只是我的无聊这实际上很有效。非常感谢。我没有想到这样做。我会在
add
之后添加一个
sub-ecx,1
,并用
jnz\u-fib
替换
loop\u-fib
。但那只是我的无聊这实际上很有效。非常感谢。我没想到会这样做。