В программе сборки Фибоначчи выдается неизвестная ошибка - PullRequest
0 голосов
/ 12 апреля 2011

Вчера я опубликовал вопрос о моей программе Рекурсивной Фибоначчи в Ассамблее.Теперь я получаю правильный вывод, благодаря некоторой помощи от замечательных людей здесь, однако сразу после того, как правильный вывод напечатан, моя программа падает.

Вот программа Sequence, которая вызывает программу Фибоначчиколичество раз (хранится в L)

.386
.model Flat
public Sequence
extrn Fibonacci:proc
include iosmacros.inc
.code
Sequence proc
    MOV L, EAX
    XOR ECX, ECX ;start count at 0
    sequ:
    CMP ECX, L
        JA endseq ;if we have passed the given value (L), end
        putstr MsgOut1
        putint ECX ;number passed to Fibonacci
        putstr MsgOut2
        MOV count, ECX ;preserve count
        PUSH ECX
        CALL Fibonacci ;call Fibonacci
        putint ECX
        putch ' '
        MOV ECX, count ;restore count
        INC ECX ;increment the count
        JMP sequ ;again
    endseq:
        putint ecx
    ret
Sequence endp

.data
    MsgOut1 DB "Fib(", 0, 0 ;first half of output message
    MsgOut2 DB ") = ", 0, 0 ;second half of output message
    L DD, 0, 0 ;number of sequences to carry out
    count DD 0,0 ;for counting
end

А вот код, который вызывает процедуру последовательности:

.386
.model flat
extrn Sequence:proc
include Cs266.inc
.data
    Msg DB "Please input the number of sequences you would like carried out", 0Ah, 0 ;input request message
    err DB "reached end"

.code
include Rint.inc
    main:
        putstr Msg
        CALL Rint ;store int in EAX
        CALL Sequence
                putstr err
    ret

end

Код Фибоначчи выглядит следующим образом:

.386
.model Flat
public Fibonacci
include iosmacros.inc ;includes macros for outputting to the screen

.code
Fibonacci proc

    MOV ECX, [ESP+4]
    CMP ECX, 1
        JA Recurse
        MOV ECX, 1 ;return value in ECX
        JMP exit

Recurse:
    PUSH EBX ;preserve value of EBX
    DEC ECX
    PUSH ECX
    CALL Fibonacci
    MOV EBX, ECX ;EBX is preserved, so safe to use
    DEC [ESP] ;decrement the value already on the stack
    CALL Fibonacci
    ADD ECX, EBX ;return value in ECX
    ADD ESP, 4 ;remove value from stack
    POP EBX ;restore old value of EBX
exit:
ret
Fibonacci endp

.data
end

Я разместил здесь кучу кода, но это просто для вашего удобства, указав мне правильное направление.Я считаю, что проблема может быть в последовательности, и мой отладчик мне не помогает.

РЕДАКТИРОВАТЬ: все, что я получаю с точки зрения ошибки, это: http://imgur.com/XulTl И если я включаю Visual Studio просто-Время отладки, это никогда не помогает.

1 Ответ

1 голос
/ 12 апреля 2011

Хм ... в твоих Fibonacci я вижу два push эс и только один pop. По крайней мере, на первый взгляд это кажется небольшой проблемой.

...