Assembly 此版本的斐波那契码在汇编中的概念

Assembly 此版本的斐波那契码在汇编中的概念,assembly,recursion,Assembly,Recursion,这是我的教授在课堂上使用的汇编斐波那契代码的替代版本,它使用了一个新的公式 f(n-2)/2 + f(n-1)*2 so the sequence is 1, 2, 4, 9, 20, 44, 98, 218 我只是有一些事情让我困惑 jb和je是什么意思 一和二是两个局部变量吗?他们在公式的输入中采用了什么不同的部分 [ebp-4]和[ebp-8],这些是注册表吗?他们为什么被选中 请帮帮我,我真的很迷茫这个代码背后的概念 这是密码 TITLE Mobonacci .586 .MODEL

这是我的教授在课堂上使用的汇编斐波那契代码的替代版本,它使用了一个新的公式

f(n-2)/2 + f(n-1)*2

so the sequence is 1, 2, 4, 9, 20, 44, 98, 218
我只是有一些事情让我困惑

  • jb和je是什么意思

  • 一和二是两个局部变量吗?他们在公式的输入中采用了什么不同的部分

  • [ebp-4]和[ebp-8],这些是注册表吗?他们为什么被选中

  • 请帮帮我,我真的很迷茫这个代码背后的概念

    这是密码

    TITLE Mobonacci 
    .586
    .MODEL FLAT, C
    .code
        Mobonacci PROC
        ; will move n into EAX;
    
        push ebp
        mov ebp, esp
        mov  eax, [ebp+8]
    
    ;   see if EAX is less than or equal to 1;
    
    cmp  eax, 2
    jb   one
    je   two
    ja   L1
    
    
    ; call the Mobonacci;
    
    L1:
         sub esp, 8
         ; Mobo(n-1) * 2;
         sub eax, 1
         push eax
         call Mobonacci;
         mov ebx, eax
         pop eax
    
    
         ; times ebx by 2;
         shl ebx, 1
         mov [ebp-4], ebx
    
    
        ; Mobo(n-2)/2;
        sub eax, 1
        push eax
        call Mobonacci
        mov ebx, eax
        pop eax
    
        ; Divide ebx by 2;
        shr ebx, 1
        mov [ebp-8], ebx
    
    
        ; sum of two numbers;
    
        mov eax, 0
        add eax, [ebp-4]
        add eax, [ebp-8]
    
        ; Clean stack;
        mov  esp, ebp
    
        jmp ending
    
    
        ; Return 1;
        one:
           mov   eax, 1
           jmp   ending
    
    
        ; Return 2;
        two: 
           mov eax, 2
           jmp ending
        ; Return the value in eax;
        ending:
           pop ebp
           ret
        Mobonacci ENDP
    
        END
    
    1)
    jb
    je
    是什么意思

    它们是x86指令集中的跳转
    jb
    在下面跳转,如果相等,
    je
    则跳转。它们根据影响x86标志寄存器的最新操作确定“低于”或“等于”是否为真。或者以另一种方式说明,例如,如果您执行了
    cmp eax,ebx
    (比较
    eax
    ebx
    寄存器),那么
    jb foo
    之后,如果
    eax
    值低于
    ebx
    值,则将跳转到标签
    foo
    。如果值相等,
    je-foo
    将跳转到标签
    foo
    。谷歌“x86跳转指令”了解更多详细信息

    2)
    1和
    2是两个局部变量吗?什么不同的部分
    他们接受了什么样的输入

    不是变量。它们是指示可以从代码中的其他位置跳转到的位置的标签。如果您将此知识与问题1的答案结合起来,代码会将
    eax
    2
    cmp-eax,2
    )进行比较,如果
    eax
    小于
    2
    ,则
    jb-one
    跳到标签
    one
    (其值可能为1),如果
    eax
    的值等于
    2
    ,则
    je two
    跳到标签
    two
    。最后,如果
    eax
    的值高于值2,
    ja L1
    跳到标签
    L1
    。请注意,由于下一条指令的标签为
    L1
    ,因此没有任何功能效果

    3)
    [ebp-4]
    [ebp-8]
    ,这些是注册表吗?他们为什么被选中


    ebp
    是x86体系结构中的基本指针寄存器。它通常包含一个地址。参考
    [ebp-4]
    [ebp-8]
    指的是位于内存中
    ebp-4
    ebp-8
    位置的值(该地址的值减少了4,减少了8)。谷歌“x86堆栈框架”了解为什么这样做的详细信息。

    ebp的使用是可选的。代码本来可以使用

    Mobonacci PROC
            sub     esp,8          ;allocate space for 2 integers
            mov     eax,[esp+12]   ;get parameter
    ;       ...
            mov     [esp+4],ebx    ;instead of [ebp-4]
    ;       ...
            mov     [esp+0],ebx    ;instead of [ebp-8]
    ;       ...
    ending:
            add     esp,8          ;restore esp
            ret
    Mobonacci ENDP