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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
black_lizard
Встал на лапы
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

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

Сообщение black_lizard »

Есть адрес, например, 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 бита. Как так то блин?

Если приведёте пример кода, буду крайне благодарен.
Собираю самопальный мини-компьютер
Реклама
jcxz
Мудрый кот
Сообщения: 1726
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="black_lizard",url="/forum/viewtopic.php?p=3543227#p3543227"]Есть адрес, например, 0x08000BC1 (адрес реальной функции, на которую мне надо перейти).[/uquote]
Прочитайте про команду BX Rx и ваши переходы станут длинными и безфаултными. :))
Реклама
Ответить

Вернуться в «ARM»