3

いくつかの ARM ELF ファイルを逆コンパイルし、アセンブラ コードを読みました。しかし、一部のコードがどのようにニーモニックに変換されているのかわかりません。たとえば、次のようなコードを取得します。

#hex code | #mnemonic             | #binary
0xb480    | push {r7}             | 1011 0100 1000 0000
0xb580    | push {r7, lr}         | 1011 0101 1000 0000
0xb5f0    | push {r4,r5,r6,r7,lr} | 1011 0101 1111 0000

そのため、複数の値をプッシュするpushis0xb4またはifのオペコードを明確に確認できます。0xb5しかし、レジスタのリストはどのように作成されるのでしょうか?

最初の例は非常に明確で、r7設定されている 8 番目のビットによってコード化されています。しかし、なぜ 2 番目のオペコードもプッシュするのlrでしょうか? そのためのビットフラグはありませんか?

4

2 に答える 2

6

PUSHThumb モードの命令には 3 つのエンコーディングがあります。最初のものは 16 ビット長で、ARMv4T (元の Thumb 実装) 以降に存在します。

15141312|11|109|8|      7..0    |
 1 0 1 1| 0| 10|M| register_list|

は 8 ビットであるため、レジスタを(ビットが設定されている場合は および ) にregister_listのみプッシュできます。R0R7LRM

Thumb-2 (ARMv6T2、ARMv7 以降) では、さらに 2 つのエンコーディングが追加されました。どちらも 32 ビット長です。

1514131211|109|876|5|4|3210||151413|    12 .. 0    |
 1 1 1 0 1| 00|100|1|0|1101|| 0 M 0| register_list |

この場合、register_listは 13 ビットなので、 および にプッシュR0できR12ますLR

3 番目のエンコーディングはリストしませんが、任意の 1 つのレジスタをプッシュできます。

ところで、POPエンコーディングは非常に似ています。

16 ビットPOP:

15141312|11|109|8|      7..0    |
 1 0 1 1| 1| 10|P| register_list|

and (ビット)R0にポップできます。R7PCP

32 ビットPOP倍数:

1514131211|109|876|5|4|3210||151413|    12 .. 0    |
 1 1 1 0 1| 00|010|1|0|1101|| P M 0| register_list |

、(bit ) および(bit )R0にポップできます。R12PCPLRM

于 2013-07-24T09:48:11.933 に答える