2013-07-24 4 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 

Таким образом, вы можете ясно видеть опкод для push является 0xb4 или 0xb5, если толкая несколько значений. Но как же тогда создается список регистров?

Первый пример очень прост, 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 бит, он может только толкать регистры R0 к R7LR, если 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 бит, поэтому он может подтолкнуть R0 к R12 и LR.

Я не буду перечислять третью кодировку, но она может подтолкнуть любой отдельный регистр.

BTW, POP кодировки очень похожи.

16-бито POP:

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

Может поп R0 в R7 и PC (бит 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 | 

Может поп R0 к R12, PC (бит P) и LR (бит M).

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

+0

В моем наборе инструкций pdf он читает следующее: «Push Multiple Registers сохраняет подмножество (или, возможно, все) регистров общего назначения R0-R12 и LR в стек». http://web.eecs.umich.edu/~prabal/teaching/eecs373-f10/readings/ARMv7-M_ARM.pdf , так что да, может быть, это бит, который имеет M-регистр LR? – reox

+1

@reox: Да, в кодировке T1, M - бит для регистра LR. Я видел это на более раннем PDF-файле ... – Malkocoglu

Смежные вопросы