Вся информация, которую вы ищете, находится в ARM Architecture Reference Manual. Если вы посмотрите инструкцию b
, вы увидите ее кодировку и как она работает. Вот конкретные инструкции, вы заботитесь о:
The E
это поле условие, которое вы можете посмотреть в этой таблице:
Для вас, это "выполнять всегда" , Затем A
, который в двоичном формате является 1010
для соответствия битам 27:24 (у вас есть инструкция ветвления, а не ветвь &). Наконец, остальная часть инструкции является полем немедленного смещения. Это смещение относительно ПК, поэтому оно закодировано как 0x00004b
.
Давайте рассмотрим ваш конкретный пример. У вас есть инструкции:
b 0x00002B78
, расположенной по адресу 0x00002a44
. Ок, отлично. Поэтому прежде всего, мы можем вставить в Опкод биты:
cccc 101L xxxx xxxx xxxx xxxx xxxx xxxx
Теперь L
бит равен нулю, для нашего случая:
cccc 1010 xxxx xxxx xxxx xxxx xxxx xxxx
Мы хотим, чтобы выполнить эту команду безоговорочно, поэтому мы добавим AL
биты кода состояния:
1110 1010 xxxx xxxx xxxx xxxx xxxx xxxx
И теперь все, что нам нужно сделать, это рассчитать смещение.PC будет 0x2a4c
, когда эта команда выполняется (ПК всегда «текущая команда + 8» в ARM), так что наш относительный скачок должен быть:
0x2b78 - 0x2a4c = 0x12c
Великий - теперь мы применяем обратное преобразований описано в вышеуказанной документации, rightshifting 0x12c
на два:
0x12c/4 = 0x4b = 0b1001011
И это последнее поле:
1110 1010 0000 0000 0000 0000 0100 1011
Повернувшись, что бен ичная инструкция обратно в шестнадцатеричный дает команду кодирующей Вы искали:
0xea00004b
@PaulSullivan Я вроде понял, что тоже, но как же на самом деле 004B коррелирует между 0x2A44 и 0x2B78? –
В то время, когда ветвь берется, 'PC' будет на 8 байтов впереди текущей команды из-за предварительной выборки. Поэтому возьмите адрес назначения (0x2B78), вычтите 0x2A44 + 8 (0x2A4C) и получите 0x12C. Разделите на 4 (так как смещение, сохраненное в инструкции, будет сдвинуто влево на 2 бита), и вы получите 0x4B. – Michael
@Michael Спасибо за этот бит о «prefetching» Мне было интересно, почему ПК будет на 8 байт впереди. –