Понимание расчета смещения ответвления рука ассемблера - PullRequest
2 голосов
/ 19 июля 2011

Я не понимаю смещения, рассчитанного для инструкций перехода (b и bl по адресам 0x00011004 и 0x00011010), связанных с разобранным кодом, перечисленным ниже.Мне интересно, что в списке шестнадцатеричных кодов смещения кажутся 0x000001 и 0x000002.Коды операций для условий b (EA) и bl (EB) были такими, как я ожидал.

Спасибо за каждую подсказку заранее

MyAssemblerFunc:
00011000  stmdb       sp!, {r0 - r3, lr} 
00011004  b           00011010 
00011008  mov         r0, r0 
0001100C  mov         r0, r0 
00011010  bl          |PrintHelloWorld ( 11020h )| 
00011014  ldmia       sp!, {r0 - r3, lr} 

Связанный шестнадцатеричный код

0x00011000  0f 40 2d e9  .@-é
0x00011004  01 00 00 ea  ...ê
0x00011008  00 00 a0 e1  .. á
0x0001100C  00 00 a0 e1  .. á
0x00011010  02 00 00 eb  ...ë
0x00011014  0f 40 bd e8  .@.è
0x00011018  00 00 a0 e1  .. á
0x0001101C  00 00 a0 e1  .. á

Ответы [ 2 ]

6 голосов
/ 19 июля 2011

Поскольку в режиме ARM инструкции можно размещать только на границах слов, нет необходимости кодировать два младших бита адреса (они будут равны 0). Таким образом, непосредственным значением в инструкции B является дельта, сдвинутая на 2 бита. Для первой ветви значение delta равно ( target - PC ) >> 2. target равно 00011010 и PC равно 00011004 + 8 = 0001100C. Итак, delta = (00011010-0001100C) >> 2 = 4 >> 2 = 1. Вы можете самостоятельно выполнить математику для второго.

1 голос
/ 23 июля 2014

8-байтовое смещение является постоянным из-за предварительной выборки ARM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...