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.
'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. –