这个版本的斐波那契代码在程序集中的概念

时间:2015-03-17 22:42:02

标签: assembly recursion

这是我教授在课堂上使用的装配中的斐波那契代码的替代版本,而是使用新的公式。

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

so the sequence is 1, 2, 4, 9, 20, 44, 98, 218

我只是有一些让我困惑的事情。

  1. jb和je是什么意思?

  2. 是一个还是两个局部变量?他们在输入中采用了什么不同的等式?

  3. [ebp-4]和[ebp-8],是那些注册表?他们为什么选择。

  4. 请帮助我,我真的失去了这段代码背后的概念!

    这是代码

    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
    

2 个答案:

答案 0 :(得分:2)

  

1)jbje的含义是什么?

它们是x86指令集中的跳转。 jb跳转到下方,如果相等则je跳跃。它们根据影响x86标志寄存器的最新操作确定“低于”或“相等”是否为真。或者换句话说,如果你做了cmp eax,ebx(比较eaxebx个寄存器),那么jb foo之后会跳转到标签foo如果eax低于 ebx值。如果值相等,je foo会跳转到标签foo。谷歌“x86跳转说明”了解更多详情。

  

2)onetwo两个局部变量?有什么不同的部分   方程式它们是否接受输入?

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

  

3)eaxL1,是那些注册表吗?为什么选择他们?

[ebp-4]是x86架构中的Base Pointer寄存器。它通常包含一个地址。引用[ebp-8]ebp引用内存中位置[ebp-4][ebp-8]的值(该地址的值减少4并减少8)。谷歌“x86堆栈框架”详细说明了为什么这样做。

答案 1 :(得分:0)

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