Есть адрес, например, 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 бита. Как так то блин?
Если приведёте пример кода, буду крайне благодарен.
Как сформировать адрес для long branch with link в thumb
- black_lizard
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вс сен 23, 2012 05:51:35
Как сформировать адрес для long branch with link в thumb
Собираю самопальный мини-компьютер
- Реклама
Re: Как сформировать адрес для long branch with link в thumb
[uquote="black_lizard",url="/forum/viewtopic.php?p=3543227#p3543227"]Есть адрес, например, 0x08000BC1 (адрес реальной функции, на которую мне надо перейти).[/uquote]
Прочитайте про команду BX Rx и ваши переходы станут длинными и безфаултными.
Прочитайте про команду BX Rx и ваши переходы станут длинными и безфаултными.
