2017-07-12 6 views
0

Ich fing an, einen Arm Disassembler zu bauen. Ich habe die binäre "48 00 4F E2"Arm Demontage - ADR oder SUB?

Ida:

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

Qemu:

e24f0048 sub r0, pc, # 72

ich nicht Ich denke, es ist ein BE/LE-Problem, weil die Befehle, die davor und danach kamen, gleich aussehen würden.

Was passiert?

+0

'adr' und' sub' können die gleiche Anweisung sein. 'adr' ist eine Pseudo-Op. IDA versucht, schlauer zu sein und schaut auf 'add/sub Rn, pc, # offset' und sagt, das sieht nach einer konstanten Last aus, also werde ich' adr' zeigen. –

Antwort

0

so, wenn Sie es nur versuchen ...

.word 0x48004FE2 
.word 0xe24f0048 

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

gibt aber da Sie einen Disassembler schreiben (sehr gute Übung eine Anweisung BTW gesetzt zu lernen, halten zu gehen). ..die erste Sache, die Sie bemerken, ist der Zustandscode. Keines der Ergebnisse, die Sie gesehen haben, ist mit "mi" assoziiert, so dass weder angenommen wird, dass beide den Arm- und Arm-Modus demontieren, noch dass 4 als das oberste Halbbyte angesehen wird. Die 0xe wird immer so nicht notiert.

Sie auch in Ihrem Arm-Dokumentation, die adr beginnt mit

cccc0010010x1111 oder cccc0010100x1111 0xX24F 0xX28F

und es ist ein Unter ohne die Rn 1111 zu sein, aber ein Disassembler wählte ADR zu ehren, die eine pseudo Anweisung, der andere entschlüsselte es gerade als ein Sub. Es kann auch wichtig sein, welche Architektur Sie angegeben haben. Im neueren Armarm zeigt ADR, dass er von armv4t unterstützt wird, aber der ältere Armarm (Armv4 und Armv5 und etwas Armv6) zeigt keine ADR-Anweisung. Es zeigt nur das Sub.

die beginnt, als cccc00I0010SNNNN

wo cccc ist der Bedingungscode ich eine Null in einigen Fällen sein kann, oder eine 1 in diesem Fall S die Flags speichern ist oder nicht, und NNNN ist Rn.

sub (cond) (s) Rd, Rn, Shifter Operand

Sie haben 0xE24F so dass

Unter r0 ist, pc, shifter_operand.

I ist eine 1, so dass ein 32-Bit-sofort ist. 0x48 mit einer Drehung von 0x0, was eine Dezimalzahl 72 (hex 0x48) ist.

was ist bei 0x40-0x48 + 8 (Adresse 0x0000)? ist das das Label sub_0?

Es sieht so aus, als ob beide den Befehl korrekt demontiert haben.

Wenn Sie wirklich einen Disassembler machen, dann sollten Sie diese Frage nicht stellen müssen, da Sie bereits alles, was Sie benötigen, vor sich haben.

+0

Wenn Sie über eine Frage wie diese nachdenken, wenn die Armanweisung nicht offensichtlich ist, wie es in diesem Fall ist, oder wenn nur neugierig, Sie 0x4800 oder 0x4FE2 im Daumenmodus untersucht haben könnten, um zu sehen, ob man das zerlegte, aber eine schnelle Überprüfung dort und Sie finden diese sind nicht mit ADR im Daumenmodus ausgerichtet. –

Verwandte Themen