これは、 GCC を使用して読み取り可能なアセンブリを生成することに近いですか? 、しかし、ここでの私のコンテキストはavr-gcc
(それに対応してavr-objdump
) Atmel 用です (ただし、GCC ボード全体に適用されると思います)。
問題は、複数の .c および .cpp ファイルのプロジェクトがあることです。最終的に、「マスター」.cpp ファイルと同じ名前の実行可能ファイルにコンパイルされます。このプロセスでは、次の 2 つの方法でアセンブリ リストを取得できます。
- スイッチを使用して、
gcc
アセンブリ リストのソースを出力するように指示できます( Linux Assembly and Disassembly an Introduction を参照)。-S
この場合、次のような内容のファイルを取得します。... ループ: r14を押す r15を押す r16を押す r17を押す r28を押す r29を押す /* プロローグ: 関数/ /フレーム サイズ = 0 */ ldi r24、lo8(13) ldi r22、lo8(1) デジタル書き込みを呼び出す rjmp .L2 .L3: ldi r24,lo8(MyObj) ldi r25,hi8(MyObj) _ZN16MYOBJ7connectEv を呼び出す .L2: ldi r24,lo8(MyObj) ldi r25,hi8(MyObj) call _ZN16MYOBJ11isConnectedEv ...
(まだ試していませんが、このコードはコンパイル可能/ビルド可能だと思います.... )
- スイッチを使用して、最終的な実行可能ファイルを検査し、
objdump
アセンブリ リスト ソースを出力するように指示でき-S
ます。この場合、次のような内容のファイルを取得します。... 0000066a <初期化>: ボイド初期化() { // これは setup() の前に呼び出す必要があります。そうしないと、一部の関数が呼び出されません // そこで働く sei(); 66a: 78 94 世 66c: r24 の 83 b7、0x33 ; 51 66e: 84 60 ori r24、0x04 ; 4 670: 0x33、r24 から 83 bf ; 51 ... 000006be <ループ>: 6be: ef 92 プッシュ r14 6c0: ff 92 プッシュ r15 6c2: 0f 93 プッシュ r16 6c4: 1f 93 プッシュ r17 6c6: cf 93 プッシュ r28 6c8: df 93 プッシュ r29 6ca: 8d e0 ldi r24, 0x0D ; 13 6cc: 61 e0 ldi r22、0x01 ; 1 6ce: 0e 94 23 02 コール 0x446 ; 0x446 6d2: 04 c0 rjmp .+8 ; 0x6dc 6d4: 8d ef ldi r24, 0xFD ; 253 6d6: 94 e0 ldi r25、0x04 ; 4 6d8: 0e 94 25 06 コール 0xc4a ; 0xc4a <_ZN16MYOBJ7connectEv> 6dc: 8d ef ldi r24, 0xFD ; 253 6de: 94 e0 ldi r25, 0x04 ; 4 6e0: 0e 94 21 06 コール 0xc42 ; 0xc42 <_ZN16MYOBJ11isConnectedEv> ...
(私はこのコードをビルドしようとしましたが、失敗しました - 「行番号」をラベルとして読み取ります)
明らかに、両方のリスト (loop
少なくとも関数については) は同じアセンブリ コードを表しています。を除外する:
- コンパイルする必要があるもの
gcc
-- コンパイルobjdump
しないもの - 1
objdump
つには、「マスター」以外のファイルで定義できるすべての参照関数のリストが含まれています(例:digitalWrite
) -1gcc
つにはありません - 1
objdump
つには、アセンブリが「散在」している元の C/C++ ソース行が含まれています (ただし、たまにしかなく、一見 C ファイルの場合のみですか?) --gcc
1 つには含まれていません。
それで、「コンパイル可能」であるアセンブリリストを取得する方法はありますが、すべてのリンクされた関数があり、ソース C/C++ コードが (おそらく、適切な場合) コメントとして散在しています (干渉しないように)アセンブリ ファイルのコンパイルで)? (の出力用のパーサーを書くことを除いてobjdump
、つまり :) )