Декодирование инструкции BLX на ARM/Thumb (IOS)
Я прочитал большую часть документации 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 ответ
Во-первых, инструкция печатается в виде двух 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).
Я надеюсь, что вы можете проработать второй пример самостоятельно.