Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Как сформировать адрес для long branch with link в thumb

Пн янв 07, 2019 20:09:41

Есть адрес, например, 0x08000BC1 (адрес реальной функции, на которую мне надо перейти).

По адресу 0x0800A000(например) есть две команды long branch with link (thumb), смотрю в этот мануал:
https://ece.uwaterloo.ca/~ece222/ARM/AR ... al-pt3.pdf

Нужно с помощью этой команды перехода (двух точнее) перейти на 0x08000BC1. Вопрос в том, что в эти две команды, мне нужно поместить этот адрес.

Пытаюсь его высчитать так
p = (int)cmd - (int)PC - 4;
Где cmd - адрес нужной функции
PC - адрес первой из двух команд перехода или то, где будет PC в момент вызова
4 - по мануалу The branch offset must take account of the prefetch operation, which causes the PC to be 1 word (4 bytes) ahead of the current instruction

p1 = (p >> 12) & 0x07ff;
p2 = (p >> 1) & 0x07ff;
Оба эти кусочка адреса загоняю в адрес перехода. Получается, например, 0xFFFEF338.

То есть p он не 23 бита, которые я могу загнать в адрес. Он получается по этой формуле, например, 0xE7FFE671.

Мне вообще не понятно, как самб может в принципе переходить назад на близкие дистанции, ведь отрицательные числа мелкие, они все очень большие и не влезают в 23 бита. Как так то блин?

Если приведёте пример кода, буду крайне благодарен.

Re: Как сформировать адрес для long branch with link в thumb

Пн янв 07, 2019 20:50:26

Есть адрес, например, 0x08000BC1 (адрес реальной функции, на которую мне надо перейти).

Прочитайте про команду BX Rx и ваши переходы станут длинными и безфаултными. :))
Ответить