昨日、Assembly の Recursive Fibonacci プログラムに関する質問を投稿しました。ここの素晴らしい人々の助けのおかげで、適切な出力が得られるようになりましたが、正しい出力が出力された直後に、プログラムがクラッシュします。
これは、フィボナッチ プログラムを指定された回数呼び出すシーケンス プログラムです (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
Sequence プロシージャを呼び出すコードは次のとおりです。
.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 の Just-In-Time デバッグを有効にしても、決して役に立ちません。