Наконец, после долгого сеанса бесчисленных ошибок, надейтесь, что это окончательный вариант.Серия Фибоначчи в сборке x86
Нет ошибок компиляции или выполнения, просто логическая ошибка.
EDIT: (Fixed псевдокод)
Мой псевдокод:
first = 1;
second = 1;
third = 0;
for i from 1 to n{
third=first+second
first=second
second=third
}
return third
Это напечатает конечный результат серии.
My ассемблере:
Я добавил комментарии, где когда-либо возможные
.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 декабря)
Что я делаю неправильно?
Нет необходимости быть уверены в том, напечатанный номер в десятичная дробь. 'printf' использует строку' finalprint' как формат, и если это что-то вроде регулярного 'printf', он будет использовать'% d' для вывода как десятичного. – usr2564301
Просто сравните свои комментарии с тем, что вы действительно хотели сделать;) 'NOW second = first' yeah, но вы хотели' first = second' ... oops. Вы получаете +1 для комментариев, вот как мы можем обнаружить вашу ошибку. – Jester
Примечание: псевдокод возвращает правильное число Фибоначчи, хотя для n = 10 оно возвращает '144', технически * 12th * fib num (или' 89', в зависимости от того, как инициализируется 'n', но оно все еще слишком далеко). – usr2564301