2017-02-21 21 views
2

初めてこのサイトの質問をしますので、間違いや改善についてのフィードバックをお寄せいただきありがとうございます。それが私の問題だと言われています。バイナリへのARM命令のエンコードとデコード

タスク1:次の手順のための対応するアーム組立体表現を書く

11101001_000111000001000000010000 
11100100_110100111000000000011001 
10010010_111110100100000011111101 
11100001_000000010010000011111010 
00010001_101011101011011111001100 

タスク2:私はこのゼロ経験を持って

STMFA R13!, {R1, R3, R5-R11} 
LDR R11, [R3, R5, LSL #2] 
MOVMI R6, #1536 
LDR R1, [R0, #4]! 
EORS R3, R5, R10, RRX 

次の命令のための命令コードを書きます教授は私たちの生徒を乾燥させてしまいました。基本的に私はこれらの命令を解読するためのさまざまな方法を見つけましたが、私はまだ3つの大きな疑問を持っています。

  1. 私は宿題の最初の部分であるARM命令にバイナリをデコードする方法を知りません。

  2. これらのサフィックスの一部は、たとえばEORSでは見つかりません。それはセット条件ビットですか?命令の前にSがあるときは1にセットされていますか?

  3. 私は、1つの命令ラインに複数のレジスタを持つことはできません。例:

    EORS R3,R5,R10,RRx 
    

    非常に多くのレジスタで何が起こっているのか分かりません。

正しい方向のナッジがあれば幸いです。また、私はARMのマニュアルを検索しましたが、彼らは彼らが探しているものを理解していない人にとってはあまり役に立ちません。彼らはコーディングとデコードのための命令の大部分を持っていますが、私が上記で尋ねたものについてはほとんど説明していません。

+0

1)知っている命令のビットパターンへの入力と一致します。2)はい3)命令に依存します。各レジスタ番号にビットを設定します。私は、エンコードをリストアップしたリソースが与えられていると仮定します。 – Jester

+0

1)しかし、どのように私は異なるコマンドエンコーディング形式を区別できますか? 2)Sがない場合、ビットは設定されていません。 3)しかし、そこには4つのレジスタがあります。これはどのようにデスティネーションレジスタですか?これらの議論が何であるかについての情報はありますか? –

+1

google arm architecturalリファレンスマニュアル。それよりも古い方が良いですが、armv5とarmv7m、armv7mとarmv7mのどちらでもないことを望む皮質以外のものはすべて行います。これらには、完全な命令セットとマシンコード定義とが含まれる。 –

答えて

1

ARM v7 A + Rアーキテクチャマニュアル(DDI0406C)をお持ちの場合は、A5章のテーブルベースのデコード/逆アセンブリの説明があります。あなたはテーブルA5.1から始め、命令語の異なるビットの値に応じて、命令につながるより多くの特定のテーブルを参照します。例として

、次の命令を検討:条件1111なく、OP1は、この符号化がさらにある010であるので、最初のテーブルによれば

0001 0101 1001 1111 0000 0000 0000 1000 

をそれが符号なしのロード/ストア命令でありますA5.3

このセクションから、A = 0、op1 = 11001、Rn = 1111(PC)、およびB = 0を参照してください。これは、命令がLDR(リテラル)であることを意味します。この命令を説明するページをチェックし、cond = 0001であることを覚えていれば、命令はLDRNE R0, [PC, #4]であることがわかります。

逆の手順を実行するには、命令のアルファベット順のリストを参照し、そのパターンに従います。

1

cortex-m(armv6m armv7m)ではなくARMアーキテクチャリファレンスマニュアル(ARMv5とARMv7m)の異なる部分を見て親指の指示を見ていますが、 ARM命令は同じ方法で動作し、前にいくつかの章があります。

これは、セクション/チャプターとして設定されたサム命令を示しています。その直後に、サム命令セットのエンコードを示すテーブルがあります。 1つは加算/減算レジスタと呼ばれ、ハードコードされた1と0が前面にあり、ビット9はopc、次にrm、rn、rdビットです。

arm toolchainsは、windows macとlinuxのためには簡単に入手できますし、ソースから簡単にビルドすることもできます(binutilsが必要です)。組立この

.thumb 
add r1,r2,r3 
add r1,r2,r4 
add r1,r2,r5 
add r1,r2,r6 
add r1,r2,r7 

は、次に分解は、追加レジスタはハードコードビット000110の両方が6ビット000110で始まる0x18のまたは0x19と開始上記の手順で始まるARMのARMでそのチャートから

00000000 <.text>: 
    0: 18d1  adds r1, r2, r3 
    2: 1911  adds r1, r2, r4 
    4: 1951  adds r1, r2, r5 
    6: 1991  adds r1, r2, r6 
    8: 19d1  adds r1, r2, r7 

を与えます(00011000または00011001)。アルファベット順のサム命令のリストでは、追加命令が検索されます。 3つのレジスタ1を見つけます。この場合、7ビットがあります。これは、0001100をデコードしているビットに一致するため、正しいトラックにあります。最後の9ビットは3つの3つのセットである。

0x1951は0001100101010001または0001100 101 010001であり、最後の9はr5、r2およびr1を表す。命令の構文部分を見るとrd、rn、rmが追加されますが、マシンコードはrm、rn、rdとなりますので、マシンコードを取り、構文ごとに並べ替えてr1、r2、r5を追加してください。それは悪いことではありませんが、残念ながらここでは混乱しています。この親指の指示にはスペースがありませんでしたので、このフラグは常に更新されるので、この命令とツールチェーンの性質と、 sをアセンブリの端に取り付け、sと分解します。混乱して、ごめんなさい。アーム命令を使用すると、文字sは期待通りに動作します。

これをARM命令でどちらの方向にも繰り返します。即時価値はこれの最も難しい部分になるでしょう。それとも、特定の命令と即時エンコーディングに依存しますか。

関連する問題