2017-07-12 11 views
0

私は腕の逆アセンブラーを作り始めました。 Iバイナリ "48 00 4F E2"アーム分解 - ADRまたはSUB?

イダ有する:

ROM:00000040 48 00 4F E2 ADR R0、sub_0

QEMU:

e24f0048サブr0、pc、#72

前と後のコマンドが同じように見えるので、BE/LEの問題だと思ってください。

どうしますか?あなたが(BTW命令セットを学ぶために非常に良い運動、続ける)逆アセンブラを書いているので、そう

+0

'adr'と' sub'は同じ命令になります。 'adr'は疑似操作です。 IDAはよりスマートにしようとし、 'add/sub Rn、pc、#offset'を見て、これは一定の負荷のように見えるので、' adr'を表示します。 –

答えて

0

あなたはそれをしようとした場合...

.word 0x48004FE2 
.word 0xe24f0048 

0: 48004fe2 stmdami r0, {r1, r5, r6, r7, r8, r9, r10, r11, lr} 
    4: e24f0048 sub r0, pc, #72 ; 0x48 

を与えるが。あなたが気づいた最初のことは条件コードです。あなたが見た結果のどちらもそれに関連する「mi」を持っていないので、彼らはアームとアームの両方のモードを逆アセンブルしていると仮定しても、それをトップニブルとして見ませんでした。 0xeは常に注意されていません。

あなたはまた、ADRは

cccc0010010x1111またはcccc0010100x1111 0xX24F 0xX28F

で始まり、それはRnが1111されることなく、サブですが、1つの逆アセンブラは、擬似的であるADRを尊重することを選んだことを自分の腕のマニュアルの参照他の1つはそれをサブとしてデコードしました。あなたが指定したアーキテクチャーも重要です。より新しいアームアームでは、ADRはarmv4tがオンにサポートされていることを示していますが、古いアームアーム(armv4およびarmv5およびarmv6)はADR命令を示していません。それは単にサブを示しています。 CCCC私はここではいくつかのケースでは、ゼロ又は1とすることができる条件コード cccc00I0010SNNNN

は、S保存フラグまたはではなく、NNNNはRnにあるように開始

サブ(指揮)(S)Rdを、Rnの、シフターオペランド

ことが

サブR0、PC、shifter_operandあるので、あなたは0xE24Fを持っています。

Iは1ですので、32ビットの即値です。 0x48は0x0の回転で、小数点第二位は72(16進0x48)です。

0x40-0x48 + 8(アドレス0x0000)の値は何ですか?それはラベルsub_0ですか?

彼らは両方とも正しく指示を逆アセンブルしたように見えます。

あなたが本当に逆アセンブラを作っているのであれば、あなたはすでにあなたの前で必要なものすべてを持っていたので、この質問をする必要はありませんでした。

+0

このような疑問を熟考するとき、アーム命令がこのように明白でなかった場合、または好奇心が強い場合、親指モードで0x4800または0x4FE2を調べて、逆アセンブルしていないかどうかを調べることができました。それらは親指モードでADRと並んでいません。 –

関連する問題