1

アセンブリ言語の最初のコースを受講していて、デバッグ中に不可解なエラー メッセージに不満を感じています...次の情報だけでは問題の原因を見つけるのに十分ではないことを認識しています (アセンブリ言語 ColdFire(MCF5307) についての私の理解が限られている場合、M68K ファミリー))、アドバイスを喜んでお受けします。

...

jsr out_string

アドレス エラー (フォーマット 0x04 ベクトル 0x03 フォルト ステータス 0x1 ステータス レジスタ 0x2700)

一般的な ADDRESS ERROR に関して、http://forums.freescale.com/freescale/board/message?board.id=CFCOMM&thread.id=271で同様の質問を見つけました。

質問に対する答えは、アドレス エラーは、コードが「誤って」アライメントされていない境界で実行しようとしている (またはアライメントされていないメモリにアクセスしようとしている) ためであると述べています。

だから私の質問は次のようになります:

  1. アラインされていない境界/メモリを「誤って」実行しようとすると、どういう意味ですか? 例があれば大変助かります

  2. アライメントされていない境界/メモリとは何ですか?

  3. デバッグ技術がほとんどないと仮定して、この問題をどのように修正しますか (例: ブレークポイントとトレースを使用)

4

2 に答える 2

1

久しぶりに68K系プロセッサを使いましたが、ヒントを教えてください。アラインされていない境界で実行しようとすることは、奇数アドレスでコードを実行することを意味します。たとえば、out_string が下位ビットが設定されたアドレスにあったとします。

2 または 4 バイト データのメモリへのデータ アクセスの場合も同様です。Coldfire が奇数メモリ アドレスへのバイト アクセスをサポートしているかどうかはわかりませんが、他の 68K ファミリ メンバーはサポートしていました。

いずれの場合も、エラーの原因となった命令でアドレス エラーが発生します。

そこにどのような指示があるかを調べます。pc が一致する (または近い) 場合は、アライメントされていない実行です。move.w d0,(a0) などのメモリ アクセスの場合は、読み取り/書き込みが行われているアドレス (この場合は a0 が指すアドレス) を確認します。

これは理解するのに非常に良いものであることを付け加えたいだけです. 私は日常業務でハイエンドの医用画像処理装置をプログラムしていますが、時にはこのレベルまで下げる必要があります。この種の問題だけを追跡できるようにすることで、複数の COTS OS の問題を見つけて修正しました。

于 2009-11-20T22:48:47.783 に答える
1

まず、エラーの原因となっている命令ではない可能性があります。前または次の命令が原因であるかどうかを確認してください。ただし、例外ハンドラーとデバッガーが改善されたと仮定すると、次のようになります。

アラインメント例外は、たとえば 32 ビット (4 バイト) データが 4 バイトの倍数ではないアドレスから取得されたときに発生します。たとえば、変数 x がアドレス 2 で 32 ビットの場合、

const1:   dc.w   someconstant
x:        dc.l   someotherconstant

それから指示

          mov.l x, %r0

68000 (および 68010、IIRC) でデータ アライメント エラーが発生します。68020 はこの制限をなくし、アラインされていないアクセスを実行しますが、パフォーマンスが低下します。jsrアラインメントが必要な (サブルーチンへのジャンプ) 命令については認識していませんが、無理はなく、配置も簡単です。各関数の前に、アラインメント用のアセンブリ言語のマクロを挿入します。

      .align long
func:   ...
于 2009-11-20T22:52:01.413 に答える