質問
私は、msp430命令セット用のシミュレータに取り組んでいます。 gnuアセンブラを使用すると、次のような命令をエンコードできます。
fc0a: 12 10 00 02 rrc &0x0200
fc0e: 22 11 rra #4
fc10: 23 52 add #4,#2
私の推測では、rrc& 0x0200はアドレス0x0200からフェッチしてローテートを実行してから、アドレス0x0200に回答を書き戻しますか?しかし、rra#4は何をしますか?ソースはすぐに4になりますが、操作後に宛先はありますか?加算#4、#2は期待どおりに組み立てられ(2b10、source = r2、ad = 1b0、dest = r3)、binutils逆アセンブラーはその命令の処理方法を知りませんでした。
これらの有効な指示はありますか?
解決
この効果についての明確なオンライン参照は存在しないようですが、示されている2つの命令(および他のいくつかの命令)はおそらく無効であるというOPに同意する傾向がありますデータシートで定義されている形式に準拠しています。
つまり、命令語を構成するさまざまな部分のすべての可能な組み合わせが有効というわけではありません。特に、即時アドレス指定モードを使用する多くの単一オペランド命令、および宛先に即時アドレス指定モードを持つ多くの二重オペランド命令は、おそらく意味的に実行可能ではありません。
ドキュメンテーションには、この効果に対するいくつかのヒントしかありません。たとえば、ユーザーガイドのセクション3.3.7(即時アドレス指定モード)では、コメントは" ソースオペランドに対してのみ有効です。" (そして、これは、R2またはR3の定数生成トリックで許可されている短縮形のケースだけでなく、即時アドレッシングモードのすべてのケースに適用されます。)
逆アセンブラーがそのようなコードの処理方法を知らないという事実も、別のヒントです(ただし、一部の逆アセンブラーは簡単にトリップする...)。
ドキュメントのために、MSP430の便利なリファレンスを以下にまとめました。
- TIのMSP430ユーザーズガイド(pdf)第3章は特に関連
- TI MSP430マイクロコントローラー(pdf)短い概要(11ページ) )
- MSPGCCマニュアル MSP430マイクロコントローラ用のTIのツールのGNUポート。
他のヒント
現在のユーザーガイドのセクション3.4.4.2で、コマンドRRAの宛先フィールドで即時モード(#N)を使用しないことをお勧めします。これは、「予測不能なプログラム操作」が発生するためです。
可能性があります。ウィキペディアの命令セットを見ると、オペコードはレジスタとさまざまなオプションをエンコードしています。したがって、単純なマッピングではありません。取得した出力はリトルエンディアンのように見えるため、次のようにします。
fc0a: 12 10 00 02 rrc &0x0200
命令1012に対応し、バイナリでは0001 0000 0001 0010です。
これは次のように分類されます。
6 bits: 0001 00 - fixed; defines the instruction family
3 bits: 00 0 - instruction (RRC)
1 bit : 0 - byte or word parameter (0 = 16 bit parameter; 1 = 8 bit)
2 bits: 01 - addressing mode (01 = indexed;)
4 bits: 0010 - register
この場合、アドレス& 0200からレジスタ2のオフセットの値で右回転が発生しています。
完全に理解するには、同様の方法で他の指示を分解する必要があります。 ADD命令の場合、ソースとデスティネーションの両方のレジスタ/アドレスは、 5223命令。