3

I decompiled some ARM ELF Files and read the assembler code. But, I don't see how some codes are translated to the mnemonics. For example I get a code like this:

#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

So, you can clearly see the opcode for push is 0xb4 or 0xb5 if pushing multiple values. But how is then the list of registers created ?

The first example is very clear, r7 is coded by the 8th bit, which is set. But, why does the second opcode also pushes lr? Is there no bit flag for that ?

4

2 回答 2

6

PUSHThumb 模式下的指令有三种编码方式。第一个是 16 位长,自 ARMv4T(原始 Thumb 实现)以来就存在:

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

由于register_list是 8 位,它只能将寄存器推R0送到R7(并且LR,如果M设置了位)。

在 Thumb-2(ARMv6T2、ARMv7 和更高版本)中,又添加了两种编码。它们都是 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 位,所以它可以推R0R12LR

我不会列出第三种编码,但它可以推送任何单个寄存器。

顺便说一句,POP编码非常相似。

16 位POP

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

可以弹出R0R7PC(位P)。

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 |

可以弹出R0R12, PC(bit P) 和LR(bit M)。

于 2013-07-24T09:48:11.933 回答
0

AFAIR,16 位 Thumb 指令 PUSH 只能压低 8 个寄存器(R0-R7)。LR在这里是个例外。0xB480 和 0xB580 之间的不同位是该指令的 push_LR_register 位...

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01
 1  0  1  1  0  1  0  R  L  L  L  L  L  L  L

这里标记为 L 的位是 register_list <0-7>。标记为 R 的位是为 LR 寄存器保留的...

于 2013-07-24T08:10:54.117 回答