私は逆アセンブラを書くことを信じています。おそらく、レジスタに定数をロードする非常に単純な1行または2行のプログラムから始めます(そのステップを学ぶためにチュートリアルまたは何かを読む必要があります)。組み立てます。バイナリを、読み取り可能なプログラムを作成できる、または作成できる形式で保存します (おそらく intel hex、サポートされている場合は elf)。
バイナリ ファイルを読み取ってプログラムを抽出し、それらのバイトを取得して逆アセンブラを書き込むプログラムを作成します (ベンダーが逆アセンブラを持っている場合でも、逆アセンブラを作成する必要があります)。
次に、プロセスの反復を開始し、新しい命令またはその命令を使用する新しい方法を一度に 1 つずつ学習します。その命令またはオプションを逆アセンブルするコードを記述します。命令の各ビットを操作するアセンブラを作成してみてください。
命令セットを理解する頃には、毎日それを使用するほとんどの人よりも命令セットをよく知っているでしょう。また、各オペコードのオプションごとにアセンブラを記述する方法を知っているでしょう。ある命令はその場所から N バイトしかアドレス指定できず、他の命令は何にでもアクセスできます。または、その命令は N ビットの即値のみを使用でき、他の命令は任意の値を使用できます。そのようなこと。
私はこのプロセスを何度も使用し、多くの命令セット、ymmv を学びました。最初の 2 ~ 3 回を過ぎると、上記のプロセスが完了するまでに 1 日しかかからない場合があります。
編集:
ここでの目標は教育であり、次の優れた SourceForge プロジェクトではありません。出力は、あなたがそれを読むのはあなただけです。
注: 可変長命令セットの一般的な逆アセンブラーはやや難しい場合があります。バイナリを線形に逆アセンブルしたくない場合は、すべての実行パスをたどる必要があります。私はそれを避けます。アセンブルと逆アセンブルを直線的に実行する単純なプログラムは、可変長命令セットでも難しくありません。コンパイラにアセンブラ出力オプションがない場合、または取得できない逆アセンブラがない場合は、C コンパイラ (またはその他の高水準言語) の出力を逆アセンブルして調べることで、命令セットについてかなりのことを学ぶことができます。これを利用するには (固定長の命令セットを除く)。
また、1 つのプロセッサのアセンブラを習得すると、2 番目のプロセッサははるかに簡単になります。次から次へと学習する必要があることは、このジャンプがどれだけ大きくなるか、即値のルール、間接アドレス指定、基本的にオペコードの調査に直接関係するすべてのことです。オペコードを見なくても学習できますが、ドキュメントやアセンブラーのエラー メッセージが高品質であることを信頼する必要があります。