2013-08-20 3 views
2

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

К примеру, у меня есть строка о том,

b 0x00002B78 

, который расположен по адресу памяти 0x00002A44. Как это преобразуется в EA00004B (представление байта выше сборки)? У меня создается впечатление, что «EA00» означает ветвящуюся часть «b» сборки, но как насчет «004B»? Если кто-то может дать общее представление об этом и ресурсы для поиска конверсий и т. Д., Это будет оценено по достоинству. Я пробовал это, но я действительно не уверен, что именно Google. То, что я искал, не помогло.

+0

@PaulSullivan Я вроде понял, что тоже, но как же на самом деле 004B коррелирует между 0x2A44 и 0x2B78? –

+1

В то время, когда ветвь берется, 'PC' будет на 8 байтов впереди текущей команды из-за предварительной выборки. Поэтому возьмите адрес назначения (0x2B78), вычтите 0x2A44 + 8 (0x2A4C) и получите 0x12C. Разделите на 4 (так как смещение, сохраненное в инструкции, будет сдвинуто влево на 2 бита), и вы получите 0x4B. – Michael

+0

@Michael Спасибо за этот бит о «prefetching» Мне было интересно, почему ПК будет на 8 байт впереди. –

ответ

6

Вся информация, которую вы ищете, находится в ARM Architecture Reference Manual. Если вы посмотрите инструкцию b, вы увидите ее кодировку и как она работает. Вот конкретные инструкции, вы заботитесь о:

excerpt from ARM docs

The E это поле условие, которое вы можете посмотреть в этой таблице:

condition fields

Для вас, это "выполнять всегда" , Затем 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 
+0

Я собирался прокомментировать другой вопрос, прежде чем вы только что отредактировали, но это очень тщательный и полезный ответ! Большое вам спасибо за то, что вы писали об этом (и спасибо за ссылку). –

+0

Счастливые помочь; сообщите мне, если есть что-нибудь, что я могу прояснить дальше. –

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