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