2

avr-objcopyを使用して逆アセンブルしたバイナリファイルがあります。割り込みベクタテーブルは次のようになります。

00000000:
    ; VECTOR TABLE
   0:13c0rjmp。+38; 0x28、リセット
   2:b8c1rjmp。+880; 0x374、INT0
   4:fd cf rjmp .-6; 0x0
   6:fc cf rjmp .-8; 0x0
   8:fb cf rjmp .-10; 0x0
   a:fa cf rjmp .-12; 0x0
   c:f9 cf rjmp .-14; 0x0
   e:f8 cf rjmp .-16; 0x0
  10:f7 cf rjmp .-18; 0x0
  12:c7c1rjmp。+910; 0x3a2、TIMER1 OVF
  14:f5 cf rjmp .-22; 0x0
  16:f4 cf rjmp .-24; 0x0
  18:f3 cf rjmp .-26; 0x0
  1a:f2 cf rjmp .-28; 0x0
  1c:2bc2rjmp。+1110; 0x474、ADC変換が完了しました
  1e:f0 cf rjmp .-32; 0x0
  20:ef cf rjmp .-34; 0x0
  22:ee cf rjmp .-36; 0x0
  24:ed cf rjmp .-38; 0x0
  26:00 00 nop
  ; 始める
  28:f8 94 cli
 (をちょきちょきと切る)

いくつかの変更を加えて、このファイルを再構築したいと思います。最初の2列を削除して、通常のアセンブリファイルになるように再フォーマットしました。すなわち:

.org 0
    rjmp。+38; 0x28、リセット
    rjmp。+880; 0x374、INT0
(をちょきちょきと切る)

しかし、私が走ると

$ avr-as -mmcu = atmega8 test.asm

次に、生成されたファイルを逆アセンブルします。(objcopy -S a.outを使用)出力は次のようになります。

00000000:
   0:00c0rjmp。+0; 0x2
   2:00c0rjmp。+0; 0x4
   4:00c0rjmp。+0; 0x6
   6:00c0rjmp。+0; 0x8
   8:00c0rjmp。+0; 0xa
   a:00c0rjmp。+0; 0xc
   c:00c0rjmp。+0; 0xe
   e:00c0rjmp。+0; 0x10
  10:00c0rjmp。+0; 0x12
  12:00c0rjmp。+0; 0x14
  14:00c0rjmp。+0; 0x16
  16:00c0rjmp。+0; 0x18
  18:00c0rjmp。+0; 0x1a
  1a:00c0rjmp。+0; 0x1c
  1c:00c0rjmp。+0; 0x1e
  1e:00c0rjmp。+0; 0x20
  20:00c0rjmp。+0; 0x22
  22:00c0rjmp。+0; 0x24
  24:00c0rjmp。+0; 0x26
  26:00 00 nop
  28:f8 94 cli
(をちょきちょきと切る)

では、PC相対ジャンプを尊重するために、どうすればavrを取得できますか?

4

2 に答える 2

6

答えが見つかりました!

私は組み立てていましたが、リンクしていませんでした。したがって、アセンブラはすべての相対的なジャンプ/呼び出し/分岐を。+0で埋めていました。

これを修正するには、linker.xというカスタムリンカースクリプトを作成する必要がありました。このスクリプトには、次のものが含まれています。

セクション
{{
  。= 0x0;
  .text:{*(。text)}
}

これは、リンカーにアドレス0で.textセクションを開始するように指示します。

次に、次を使用してコードをリンクできます。

$ avr-ld -mavr4 -Tlinker.x a.out -o output.o

上記のコマンドを使用してリンクした後、すべての。+0に正しい値が入力されました。

これは、リンク段階まで、as/gccがバイナリファイルに他に何が含まれるかを知らないためです。個々のオブジェクトファイルをすべて取得し、それらを1つに結合するのはリンカーです。したがって、リンカステージが実行されない場合、相対ジャンプを絶対ジャンプで埋める方法はありません。

AVRのアセンブラは、アセンブルとリンクの両方を行います。ただし、gnuアセンブラはより一般的であるため、個別にリンクする必要があります。

于 2009-11-20T08:13:07.533 に答える
0

私はそれrjmp PC+2がavrで動作しないと仮定しています-として?それが私がAVRスタジオでそれをする方法です...

于 2009-11-19T13:57:57.320 に答える