2011-01-13 20 views
1

私の武勇伝は、私は、コードのこの部分で無限ループになっていると私は少し困惑してる、続けています。組立無限ループ

movl $1, %ecx 
movl $4, %edi 

do_loop: 
    cmpl %edi, %ecx 
    je do_exit 
    ......... 
    do_stuff 
    ......... 
    incl %ecx 
    jmp do_loop 
do_exit: 
私は do_exitへのジャンプを期待してい

それはすべての反復

+4

do_stuffセクションでecxを再利用/再割り当てしようとしています... –

+0

do_stuffはprintfをいくつか呼び出しますが、明らかにレジスタを変更します。私はそれを期待していませんでした。 –

答えて

0

do_stuffでのレジスタの使用に注意してください。あなたが探している本物はcalling conventions、特にこの行です:

レジスタEAX、ECX、EDXはこの機能で使用できます。

1

ませんデバッガでインクリメントされますので、%のECXが4に到達したとき? do_stuffは%ediを修正しますか? do_stuffをコメントアウトしてみてください。

+0

いいえ、%ediは変更されていません。%ecx –

+0

私はprintfを呼び出しています。呼び出し前にスタックにecxとediを保存し、後でポップアップすると正しい結果が得られます。奇妙な私はこれを期待していませんでした。 –

+0

@void:呼び出し規約では、 'ecx'を' eax'や 'edx'と一緒に呼び出された関数で変更することができます。残りの部分は保存する必要があります。したがって、 'printf'の呼び出しの間に' edi'を保存する必要はありません。 これはあなたの関数にも当てはまります。 – Jester

0

私はdo_exitは空白が続いている場合は知らないと私はあなたがアセンブリコードを実行しているかはわかりません...

しかしdo_exit後に以下を追加してみてください:

休暇

RET

他の人が述べたように