1

私は大学のコースのプロジェクトに取り組んでいます。

まず、私はこれに対する完全な解決策を求めているのではありません。どこが間違っているのかを見つけるのに苦労しています。有効なISBN3201541974を入力すると、プログラムは「無効な」コードブロックを出力します。表示される可能性のある論理エラーに関するヒントをいただければ幸いです。また、すべてのコードを一度に見つめるよりも、デバッグするためのより良い方法があるかどうかを知りたいと思います。私は単純な印刷ステートメントとブレークポイントに依存することに慣れています。

編集:問題はここにありました

L1_top:
        mov     al, [esi]               ; get a character
        inc     esi         ; update source pointer
        sub     al, 0
        add     ah, al
        cmp     ah, 11
    .......

alから0を引く理由は、alが最初はcharだからです。alから「0」を引くと、これはintまたはw/eに変換されます。'0'の代わりに誤って0を減算しました

正しい行は

        sub     al, '0'
4

2 に答える 2

7

まず、私は実際にこのコースのTAです。答えを求めるのではなく、デバッグのヘルプを探しているだけでよいのですが、営業時間はあり、とてもフレンドリーです。

最初に簡単な質問に答えます。コードの問題を見つける簡単な方法があります。これはgdbと呼ばれます。基本的には単なるデバッガです。この方法でデバッグすると、プログラムの実行時に実際にレジスタとメモリに何が入っているかを確認できるため、非常に役立ちます。使用方法に関する情報へのリンクは次のとおりです。とても参考になるので、よく読んでおくことをお勧めします。gdbヘルプ

次に、より複雑な部分に移ります。

  • なぜmsg10またはmsg11があるのか​​わかりません。ロジックの設定方法を理解すれば、それらとmsg5を取り除くこともできます。
  • エラーチェックでは、eaxを11と比較し、等しい場合はジャンプすることをお勧めします。このように、正しい桁数がある場合にのみロジックを処理する必要があります。(10桁+改行)
  • ループでは、値が「0」と「9」の間にあるかどうかを確認する必要があります(はい、アポストロフィは重要です。値が数値ではなくASCIIであることをコンピューターに通知します)または「X」。
  • それが終わったら、「sum」と「t」が11以上かどうかを確認し、11以上の場合は11を引き、ループ全体を10回(各文字に1回)通過する必要があります。
于 2013-02-18T04:12:50.883 に答える
2

残念ながら、「printステートメント」の記述はそれほど簡単ではありません。「print_debug_out」関数を呼び出すだけで、関連する状態(フラグ、スタックなど)のほとんどが変更されます。しかし、あなたそれらを書いて一度だけそれをすることができます。デバッグ関数とマクロのミニライブラリを作成してください!

私も提案するつもりでしたgdb。デバッグ情報(-g)を使用してアセンブルし、gdbを使用してデバッグします。おそらくチュートリアルまたはGUIラッパーを見つける必要がありますが、gdb(または別のデバッガー)の使用法を学ぶことは十分に価値があります。

ソースコードとデバッガーでブレークポイントを設定できることに注意してください。int 3またはのint3説明を使用するだけです。

于 2013-02-18T04:24:40.823 に答える