2013-07-24 53 views
2

我反編譯了一些ARM ELF文件並讀取了彙編代碼。但是,我不明白一些代碼是如何轉換成助記符的。例如,我得到了這樣的代碼:ARM彙編程序中的編碼寄存器操作數是怎樣的?

#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 

所以,你可以清楚地看到操作碼爲push0xb40xb5如果推多個值。但是,那麼如何創建寄存器列表呢?

第一個例子是很清楚的,r7由第8位,這是設置編碼。但是,爲什麼第二個操作碼也推動lr?那有沒有標誌?

+0

你確定操作碼是兩個完整的字節嗎?它可能只有6/7位。 – hivert

回答

4

有在Thumb模式PUSH指令的三種編碼。第一種是16位長,並且由於與ARMv4T(原始拇指實現)存在:

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

由於register_list爲8位,它只能推寄存器R0R7(和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

我不會列出第三種編碼,但它可以推送任何單個寄存器。

BTW,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 | 

可以彈出R0R12PC(位P)和LR(位M)。

0

AFAIR,16位Thumb指令PUSH只能推下8個寄存器(R0-R7)。 LR在這裏是例外。的0xB480和0xB580之間的不同的一點是,指令的比特push_LR_register ...標記爲L

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 

這裏位是register_list < 0-7>。標記爲R,該位被保留用於LR寄存器...

+0

在我的Instruction Set pdf中,它讀取了以下內容:「Push Multiple Registers將通用寄存器R0-R12和LR的子集(或可能全部)存儲到堆棧中。」 http://web.eecs.umich.edu/~prabal/teaching/eecs373-f10/readings/ARMv7-M_ARM。pdf 所以是的,也許是與'LR'寄存器混合在一起的Bit? – reox

+1

@reox:是的,在編碼T1中,M是LR寄存器的位。我在一個較舊的PDF上看到了它... – Malkocoglu

相關問題