汇编 x86 中的斐波那契数列
Fibonacci Series in Assembly x86
经过长时间的无数错误后终于出来了,希望这是最后一次。
没有编译或运行时错误,只是一个逻辑错误。
编辑:(固定伪代码)
我的伪代码:
first = 1;
second = 1;
third = 0;
for i from 1 to n{
third=first+second
first=second
second=third
}
return third
这将打印系列的最终结果。
我的汇编代码:
I have added Comments where ever possible
.386
.model flat,stdcall
option casemap:none
.data
timestell db "Loop Ran : %d Times -----",0 ;format string
fmtd db "%d",0
finalprint db "Final Number is : %d ------",0 ;format string
times dd 0Ah ;times to loop
first dd 1h
second dd 1h
third dd 0h
.data?
retvalue1 dd ? ;we will initialize it later
.code
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
includelib MSVCRT
extrn printf:near
extrn exit:near
public main
main proc
mov ecx, times ;loop "times" times
mov eax,0 ;just to store number of times loop ran
top: ;body of loop
cmp ecx, 0 ;test at top of loop
je bottom ;loop exit when while condition false
add eax,1 ;Just to test number of times loop ran
mov ebx,first ;move first into ebx
add ebx,second ;add ebx, [ first+second ]
mov third,ebx ;Copy result i.e ebx [first+second] to third
xor ebx,ebx ;clear for further use
mov ebx,first ;move first into ebx
mov second,ebx ;copy ebx to second [NOW second=first]
xor ebx,ebx ;clear for later use
mov ebx,third ;move thirs into ebx
mov second,ebx ;copy ebx to third [NOW second=third]
xor ebx,ebx ;clear it
dec ecx ;decrement loop
jmp top ;Loop again
bottom:
mov retvalue1,eax ;store eax into a variable
push retvalue1 ;pass this variable to printf
push offset timestell ;pass Format string to printf
call printf ;Print no. of times loop ran
push third ;push value of third to printf
push offset finalprint ;push the format string
call printf ;Print the final number
push 0 ;exit gracefully
call exit ;exit system
main endp
end main
代码运行良好,但输出不令我满意:
输出:Loop Ran : 10 Times -----Final Number is : 11 ------
首先我不确定最终数字是十进制还是十六进制。
- 假设为十进制:斐波那契数列没有 11
- 假设它是十六进制:斐波那契数列没有 17(11 十六进制 = 17 十进制)
我做错了什么?
问题是我的实际代码与导致逻辑错误的伪代码不匹配。
这部分
mov ebx,first ;move first into ebx
mov second,ebx ;copy ebx to second [NOW second=first]
这给出了 second
的 first
值,但是我的伪代码说 "first=second",这意味着将 second
的值赋给 first
。
mov ebx,second ;move second into ebx
mov first,ebx ;copy ebx to second [NOW first=second]
x86 Intel 处理器的最终工作代码:
对于任何进一步的推荐人,我发布了 x86 英特尔的工作代码
.386
.model flat,stdcall
option casemap:none
.data
timestell db "Loop Ran : %d Times -----",0 ;format string
finalprint db "%d th Fibonacci number is %d",0 ;format string
times dd 14h ;times to loop
first dd 1h
second dd 1h
third dd 0h
.code
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
includelib MSVCRT
extrn printf:near
extrn exit:near
public main
main proc
mov ecx, times ;set loop counter to "times" time
sub ecx,2 ;loop times-2 times
top:
cmp ecx, 0 ; test at top of loop
je bottom ; loop exit when while condition false
xor ebx,ebx ;Clear ebx
mov ebx,first ;move first into ebx
add ebx,second ;add ebx, [ first+second ]
mov third,ebx ;Copy result i.e ebx [first+second] to third
xor ebx,ebx ;clear for further use
mov ebx,second ;move second into ebx
mov first,ebx ;copy ebx to second [NOW first=second]
xor ebx,ebx ;clear for later use
mov ebx,third ;move thirs into ebx
mov second,ebx ;copy ebx to third [NOW second=third]
xor ebx,ebx ;clear it
dec ecx ;decrement loop
jmp top ;Loop again
bottom:
push third
push times ;push value of third to printf
push offset finalprint ;push the format string
call printf ;Print the final number
push 0 ;exit gracefully
call exit ;exit system
main endp
end main
经过长时间的无数错误后终于出来了,希望这是最后一次。
没有编译或运行时错误,只是一个逻辑错误。
编辑:(固定伪代码)
我的伪代码:
first = 1;
second = 1;
third = 0;
for i from 1 to n{
third=first+second
first=second
second=third
}
return third
这将打印系列的最终结果。
我的汇编代码:
I have added Comments where ever possible
.386
.model flat,stdcall
option casemap:none
.data
timestell db "Loop Ran : %d Times -----",0 ;format string
fmtd db "%d",0
finalprint db "Final Number is : %d ------",0 ;format string
times dd 0Ah ;times to loop
first dd 1h
second dd 1h
third dd 0h
.data?
retvalue1 dd ? ;we will initialize it later
.code
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
includelib MSVCRT
extrn printf:near
extrn exit:near
public main
main proc
mov ecx, times ;loop "times" times
mov eax,0 ;just to store number of times loop ran
top: ;body of loop
cmp ecx, 0 ;test at top of loop
je bottom ;loop exit when while condition false
add eax,1 ;Just to test number of times loop ran
mov ebx,first ;move first into ebx
add ebx,second ;add ebx, [ first+second ]
mov third,ebx ;Copy result i.e ebx [first+second] to third
xor ebx,ebx ;clear for further use
mov ebx,first ;move first into ebx
mov second,ebx ;copy ebx to second [NOW second=first]
xor ebx,ebx ;clear for later use
mov ebx,third ;move thirs into ebx
mov second,ebx ;copy ebx to third [NOW second=third]
xor ebx,ebx ;clear it
dec ecx ;decrement loop
jmp top ;Loop again
bottom:
mov retvalue1,eax ;store eax into a variable
push retvalue1 ;pass this variable to printf
push offset timestell ;pass Format string to printf
call printf ;Print no. of times loop ran
push third ;push value of third to printf
push offset finalprint ;push the format string
call printf ;Print the final number
push 0 ;exit gracefully
call exit ;exit system
main endp
end main
代码运行良好,但输出不令我满意:
输出:Loop Ran : 10 Times -----Final Number is : 11 ------
首先我不确定最终数字是十进制还是十六进制。
- 假设为十进制:斐波那契数列没有 11
- 假设它是十六进制:斐波那契数列没有 17(11 十六进制 = 17 十进制)
我做错了什么?
问题是我的实际代码与导致逻辑错误的伪代码不匹配。
这部分
mov ebx,first ;move first into ebx
mov second,ebx ;copy ebx to second [NOW second=first]
这给出了 second
的 first
值,但是我的伪代码说 "first=second",这意味着将 second
的值赋给 first
。
mov ebx,second ;move second into ebx
mov first,ebx ;copy ebx to second [NOW first=second]
x86 Intel 处理器的最终工作代码:
对于任何进一步的推荐人,我发布了 x86 英特尔的工作代码
.386
.model flat,stdcall
option casemap:none
.data
timestell db "Loop Ran : %d Times -----",0 ;format string
finalprint db "%d th Fibonacci number is %d",0 ;format string
times dd 14h ;times to loop
first dd 1h
second dd 1h
third dd 0h
.code
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
includelib MSVCRT
extrn printf:near
extrn exit:near
public main
main proc
mov ecx, times ;set loop counter to "times" time
sub ecx,2 ;loop times-2 times
top:
cmp ecx, 0 ; test at top of loop
je bottom ; loop exit when while condition false
xor ebx,ebx ;Clear ebx
mov ebx,first ;move first into ebx
add ebx,second ;add ebx, [ first+second ]
mov third,ebx ;Copy result i.e ebx [first+second] to third
xor ebx,ebx ;clear for further use
mov ebx,second ;move second into ebx
mov first,ebx ;copy ebx to second [NOW first=second]
xor ebx,ebx ;clear for later use
mov ebx,third ;move thirs into ebx
mov second,ebx ;copy ebx to third [NOW second=third]
xor ebx,ebx ;clear it
dec ecx ;decrement loop
jmp top ;Loop again
bottom:
push third
push times ;push value of third to printf
push offset finalprint ;push the format string
call printf ;Print the final number
push 0 ;exit gracefully
call exit ;exit system
main endp
end main