2012-08-02 8 views
21

私は非常に単純なARM命令をバイナリとヘックスとして表現する方法を理解するために、this pageなどのさまざまなガイドを使用しようとしています。それは私にとっては単純なプロセスでなければならないようですが、私はまだ理解しません。いくつかの例があります。非常に単純なARM命令をバイナリ/ヘキサに変換する

基本NOP:

 what goes here?   what goes here? 
      _↓_     _____↓____ 
      | |    |   | 
mov r0, r0 ; ????00?1101????????????????????? 
         |__||__| 
          ↑ ↑ 
       how do I express registers? 

他人のために同じ基本的な質問です。

cmp r1, r0 

が値を登録する即時の追加:

add r0, #0x1a 

オンラインこれらのチュートリアルのすべてがこのような命令を使用する方法を説明で優れているが、私は持っている何もできていない2つのレジスタの比較

実際にARM命令をアセンブルされるバイナリ/ヘキサ/マシンコードに変換する方法を見てみましょう。

ご協力いただきありがとうございます。ここで

+2

大きな質問;残念ながら、リンクは死んでいます。渡す人のために、ここには簡単な[Webアーカイブリンク](https://web.archive.org/web/20150426195854/http://www.nyx.net/~troddis/ARM.html) – Asu

答えて

29

は、データ処理命令が符号化されている方法です。

ARM data processing instructions

あなたはあなたのそのページに条件コードテーブルを持っています。レジスタは00001111と記述されています。

すべての例は同じカテゴリに該当します。画像は私のHDDのある文書から抽出されましたが、私はそれをgoogleで見つけることもできました。これらの命令を記述するのは退屈な作業です。

ので、mov r0, r0は次のように行く必要があります。

1110 00 0 0 1101 0000 0000 00000000 

それは実際にMOVには適用されませんので、私は、0にRnのを置きます。 CMPの場合、Sは常に1となります。

5

すべての手順については、エンコーディングについてのARM ARMのコピーが必要です。

ほとんどのARM命令は、条件付きコードの上位4ビットを使用します。条件付きで命令を実行したくない場合は、擬似条件AL(1110)を使用してください。

エンコーディングの最初のレジスタ(Rn)はMOV命令では使用されず、ARM ARMで定義されているように0000に設定する必要があります。

第2のレジスタが宛先である、あなたの場合には、それはまた、あなたがR4のために、destinalとしてR0を使用しているので、それが0100

だろう0000になるので、ここであなただけの、レジスタ番号を符号化します残りの部分は非常に柔軟ないわゆるシフター・オペランドです。あなたの場合(r0)のような単純なレジスタであってもかまいません。最後の4ビットが再びレジスタをエンコードするのは0000 0000 0000です。また、さまざまなタイプのシフトをエンコードし、データ処理のためのレジスタまたは即値で回転することもできます。

ただし、8ビットがボトムビットでエンコードされ、最初の4ビットが2ビットステップで右ローテートを定義する場合は、即時にすることもできます。この場合、bit25も1になります。それ以外の場合は0になります。

+5

ARM ARMは楽しい頭字語、それはGoogleの検索を行うのはひどいです。拡張は 'ARMアーキテクチャリファレンスマニュアル'であり、利用可能です[ここ](http://infocenter.arm.com/help/topic/com.arm.doc.subset.architecture.reference/index.html#reference )無料登録後に。 –

+0

@Kevinいいえ、拡張は実際には**高度な(命令セットコンピューティングの削減)マシンアーキテクチャリファレンスマニュアルです。しかし、それは良いGoogle検索ではありません:) –

9

最初に、infocenter.arm.comのARMアーキテクチャリファレンスマニュアル(ARM ARM)、リファレンスマニュアル、最古のものを入手する(armv5または何でも)。命令セットはそこによく定義されています。

第2に、いくつかの手順を組み立てて何が起こるかを見てみましょう。

;@test.s 
cmp r1, r0 
add r0, #0x1a 

どんなクロスアセンブラお持ち(ちょうどそのスクリプトでのbinutilsスルーアップの実行、スクリプトのビルドgccのディレクトリにあるhttp://github.com/dwelch67/raspberrypiを参照)腕 - 対

arm-none-linux-gnueabi-as test.s -o test.o 
arm-none-linux-gnueabi-objdump -D test.o 

アームなし - のlinux-gnueabiいずれ-ELFアームエルフなどVSは、すべての条件フィールドを参照して、完全な32ビットARM命令(不親指)の上位4ビットの条件コードである同じ

Disassembly of section .text: 

00000000 <.text>: 
    0: e1510000 cmp r1, r0 
    4: e280001a add r0, r0, #26 

を実行し、このために重要でいけませんARM ARMのセクションを参照してください。 0xEは常にこの命令を実行することを意味します。 0b0000は、zフラグがセットされている場合にのみ実行され、0b0001は、zがクリアされている場合にのみ実行されます。

ARM命令でARM命令を実行し、アーム命令のアルファベット順のリストを検索してからcmpを検索しますcond 00I10101 rn sbzシフター

上記のcmp命令より、私たちは1110 000101010001を参照しています...私はゼロビットです15:12はゼロビットです27:26はゼロで、24:21は1010ですのでこれはcmpです命令

上記のビット19〜16は0b001であり、ARM ARMのシフタオペランドの場合はrn so rn = 1(r1)です。これは、アドレッシングモード1のデータ処理オペランドを参照するように指示し、pdf〜ページ

2番目のオペランドを単純にレジスタにすることを知っています。これはデータ処理オペランド - レジスタとページ番号です。そのページのそのページに移動します15:12はrd 11:4は0で3 :0はrmです。私たちはcmp命令から、15:12はゼロでなければならないことを知っています。気にするかどうか、cmpは結果をレジスタに格納しないので、rdは使用されません。 rmが使用され、この場合はr0が必要なので、0b0000は3:0になります。また、ビット27:25が0になっていることに注意してください。cmp命令25では、私たちはゼロを求めています。

CMPページと、このデータ処理の間

- ページを登録し、我々は全体像を持っている

1110 condition 
000 
1010 opcode 
1 S (store flags, that is a 1 for a cmp to be useful) 
0001 rn 
0000 rd/dont care/sbz 
00000 
000 
0000 rm 

cmp rn,rm 
cmp r1,r0 

addは似ていますが、即時に使用するため、命令のアルファ・リストに追加命令に進みます。私たちは今cmpからこのクラスの命令の24:21がオペコードであることを知っています。シフターオペランドの項目に直接行くことができます。

今回私たちは加算rd、rn、#immediate

ので

1110 condition, always 
001 (note the immediate bit is set) 
0100 (opcode for add for this type of instruction) 
0 (S not saving the flags, it would be adds r0,r0,#26 for that) 
0000 (rn = r0) 
0000 (rd = r0) 

今興味深い部分が来るで、我々は26の異なる方法でエンコードすることができ#immediate

とエンコーディングのためのページを探してください。ビット7:0は即値でビット11:8はローテート、26は0x1A、下位8ビットには0x1Aを入れ、回転を0に設定するだけでgnuアセンブラと同じことができます。おそらく下位8ビットに0x68を入れることができ、rotate_immフィールドの1101000は右に1 * 2ビット回転して11010 = 0x1A = 26となります。

関連する問題