腕の指導と親指の指導の見分け方は?例えば:
add r1, r2, r3 ;add r2 and r3, then store the result in r1 register
上記の指示は、腕と親指の指示に関してどのように機能しますか?
腕の指導と親指の指導の見分け方は?例えば:
add r1, r2, r3 ;add r2 and r3, then store the result in r1 register
上記の指示は、腕と親指の指示に関してどのように機能しますか?
infocenter.arm.comにアクセスして、問題のアーキテクチャのアーキテクチャリファレンスマニュアルを入手するか、ARMv4から現在までのすべての命令コーディングを含むARMv7マニュアル(-Mではなく-Aまたは-R)を入手してください。親指と最も成熟したthumb2拡張機能を含むARMv7。(アームマニュアルで指示のエンコードがヒットまたはミスするため、複数のアーキテクチャリファレンスマニュアルおよび/またはテクニカルリファレンスマニュアルが必要になる場合があります)
サム命令の下で、レジスタベースのADD命令を見てください。すべてのサムバリアント(ARMv4Tから現在(ARMv4T、ARMv5、ARMv6、ARMv7、場合によってはARMv8))としてリストされている3つのレジスタエンコーディングT1を持つ1つのエンコーディングがあります。
ビット15〜9は0b0001100 rmの3ビット、rnの3ビットおよびrdの3ビットです(通常、thumb命令はエンコードに3ビットを必要とするr0-r7に制限され、thumb2拡張といくつかの特別なthumb命令により、より大きな番号のレジスタが可能になります(4エンコーディングのビット))。
命令は、説明にADDS rd、rn、rmとしてリストされています。Sは、thumb命令の派生元である親ARM命令からのフラグを保存することを意味します。ARM命令の場合、フラグを変更するかどうかを選択できます。thumb命令そうではありません(thumb2にはこれを制御する方法がありますが、(add命令に対して)制限があります)。
ADDS rd、rn、rm
0001100 rm rn rd
したがって、ADDS r1、r2、r3はこのビットのチャンクになります
0001100 011 010 001 = 0001100011010001 = 0001 1000 1101 0001 = 0x18D1
ARMモードでADD命令を見ると、条件フィールドから開始します。質問を書いたので、これは常にまたは1110パターン(常に実行)です。また、質問を書いたので、追加しないので、フラグを保存しません。エンコーディングではsビットはゼロです
したがって、rd、rn、shifterオペランドを追加し、ビットパターン0b111000I01000から開始し、次にrnの場合は4ビット、rmの場合は4、シフターオペランドの場合は11を追加します。はい、それは私が1つではなく25のビット位置です。Iはシフターオペランドエンコーディングの一部です
次に、シフターオペランドのエンコードについて説明しているマニュアルのセクションに移動します。レジスタrmであるエンコーディングはビット25(Iビット)はゼロであり、11から4はゼロであり、3から0はrmであるため、rd、rn、rmを追加します。
1110 00 0 01000 rn rd 00000 000 rm
1110 00 0 01000 0001 0010 00000 000 0011 = 1110 0000 1000 0001 0010 0000 0000 0011 = 0xE0812003
これでテストできます。このプログラムを受講してください
add r1,r2,r3
.thumb
add r1,r2,r3
それをadd.sアセンブルと呼び、次にアセンブルします
arm-none-eabi-as add.s -o add.o
arm-none-eabi-objdump -D add.o
取得します
Disassembly of section .text:
00000000 <.text>:
0: e0821003 add r1, r2, r3
4: 18d1 adds r1, r2, r3
これは手のエンコーディングと一致します。
さて、バイトのチャンクを分解しようとしているが、それらがどのようなものかわからない場合、それは別の話ですが、これはせいぜい非常に難しい場合があります。理想的には、実行とモードの変更に従ってバイナリ全体を分解したいです(実行をシミュレートしないと理解できない場合があります)。1つの手がかりは、ARM命令は通常、命令の先頭で0xEであるALways条件を使用するため、0xExxxxxxxの形式で32ビットワードが多数表示される場合、それらはarm命令であり、データではなく、thumb命令ではない可能性があります。純粋な親指には、0x6xxxや0x7xxxなどの一般的なパターンはありませんが、他のすべての開始値が混在しています。