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
我只是有一些事情让我困惑
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