そのため、最近、C++ コードの逆アセンブリを調べており、次のように各レジスタの内容を手動で追跡する必要があります。
95: 48 8b 16 mov (%rsi),%rdx ; %rdx = raggedCross.sink
98: 48 8b 42 38 mov 0x38(%rdx),%rax ; %rax = sink.table
9c: 8b 4a 10 mov 0x10(%rdx),%ecx ; %ecx = sink.baseCol
9f: 48 8b 70 50 mov 0x50(%rax),%rsi ; %rsi = table.starts
a3: 89 c8 mov %ecx,%eax ; %eax = baseCol
a5: 83 c1 1c add $0x1c,%ecx ; %ecx = baseCol + 1
等々。コメントは、C++ クラスのさまざまなフィールド (sink、table、baseCol、starts など) のオフセットを調べて、手作業で追加したものです。
実行するのは簡単ですが、退屈で時間がかかります。プログラムが実行するのに最適なことです。gdb は、構造体内のさまざまなフィールドのオフセットを認識しているようです: &((Table *)0x1200)->starts を実行すると、正しいアドレスが通知されます。だから、この情報は周りにあります。
この情報を使用してコードに注釈を付けることができる逆アセンブラーはありますか?
それがなければ、私は自分で書くことができました。gdb はどこでオフセットを取得しますか?