这是我教授在课堂上使用的装配中的斐波那契代码的替代版本,而是使用新的公式。
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
答案 0 :(得分:2)
1)
jb
和je
的含义是什么?
它们是x86指令集中的跳转。 jb
跳转到下方,如果相等则je
跳跃。它们根据影响x86标志寄存器的最新操作确定“低于”或“相等”是否为真。或者换句话说,如果你做了cmp eax,ebx
(比较eax
和ebx
个寄存器),那么jb foo
之后会跳转到标签foo
如果eax
值低于 ebx
值。如果值相等,je foo
会跳转到标签foo
。谷歌“x86跳转说明”了解更多详情。
2)
one
和two
两个局部变量?有什么不同的部分 方程式它们是否接受输入?
不是变量。它们是标签,用于指示可以从代码中的其他位置跳转到的位置。如果您将此知识与问题#1的答案结合起来,则代码会将eax
与2
(cmp eax,2
)和jb one
跳转标记为one
,如果{ {1}}小于eax
(它的值可能为1),如果2
的值等于je two
,则two
会跳转到标记eax
}。最后,如果2
的值高于值2,ja L1
会跳转到标签L1
。请注意,因为下一条指令的标签为{{1} },这没有功能效果。
3)
eax
和L1
,是那些注册表吗?为什么选择他们?
[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