Декодирование инструкции BLX на ARM / Thumb (IOS) - PullRequest
3 голосов
/ 18 января 2012

Я прочитал большую часть документации ARM, но все еще не могу расшифровать инструкцию BLX. Вот два примера:

__text:0000347C 02 F0 B2 ED                 BLX             _objc_msgSend

__text:0000469C 01 F0 A2 EC                 BLX             _objc_msgSend

Оба они должны идти в одно и то же место, виртуальный адрес 0x5FE4, как показано здесь:

__symbolstub1:00005FE4 38 F0 9F E5                 LDR             PC, =__imp__objc_msgSend

Однако я не могу понять, какие вычисления используются для получения по двум указанным выше адресам (0x347C и 0x469C), используя их байты инструкций. Согласно документации ARM, это должен быть относительный скачок с использованием сдвига вправо на 2, но цифры не работают.

Кто-нибудь может помочь?

1 Ответ

7 голосов
/ 18 января 2012

Сначала инструкция печатается в виде двух 16-битных полей с прямым порядком байтов. Чтобы соответствовать порядку байтов в справочном руководстве ARM, вам необходимо поменять байты в каждом из полей. Для первой инструкции это дает:

F0 02 ED B2

или

11110000000000101110110110110010.

Это кодировка T2 инструкции BLX. Разбивая это на поля, указанные в ARM:

11110  0  0000000010  11  1  0  1  1011011001  0  
       S    imm10H        J1    J2   imm10L

Затем следуйте инструкциям по интерпретации полей:

I1 = NOT(J1 EOR S) = 0
I2 = NOT(J2 EOR S) = 0

imm32 = SignExtend(S:I1:I2:imm10H:imm10L:00)
      = SignExtend(0000000000010101101100100)
      = 0x00002b64

Это точно 0x5FE4 - 0x3480 (помните, PC на 4 байта вперед в Thumb / Thumb 2).

Полагаю, вы можете сами разобраться со вторым примером.

...