Да, поскольку BX
занимает 32-битный регистр, нет никакой необходимости в veeners, потому что вы можете охватить все адресное пространство.
Конечно, вам нужно будет загрузить 32-битное значение в регистр, что обычно означает постоянный пул, поэтому, если вы хотите выжать каждый цикл из него, а ваша программа не слишком велика, вам лучше с относительными ветвями. Как отмечает @Notlikethat, если у вас еще нет адреса в регистре, нет смысла использовать BX
, когда вы можете просто LDR PC, ...
(если вам не нужна поддержка ARMv4T).
Относительные, условные, 32-разрядные ветви Thumb имеют 24-битное пространство адресации, поэтому вы можете достичь +/- 16MB (для других см. here). Если вы делаете ELF, будьте действительно осторожны с 16-битными относительными ветвями Thumb. 32-разрядная ветвь будет генерировать 24-битное перемещение, и компоновщик будет вставлять веер, если цель не может быть адресована с 24 битами. 16-разрядная ветвь генерирует 11-битное перемещение, а ELF for ARM указывает, что компоновщик равен , а не, необходимых для генерации veeners для них, так что вы рискуете выйти из диапазона разветвления.
Как правило, компоновщик собирается начать облицовку ветвей, когда цели находятся слишком далеко - насколько большой ваш код? – Notlikethat
И для случая шпона межсетевого взаимодействия ARMv4T (который я забыл, это было), лучшее решение, скорее всего, либо «не нацелено на ARMv4T», либо «не беспокоиться с кодом Thumb», в зависимости от того, что именно вам нужно поддерживать. Обсуждаем ли мы код C (в этом случае вы не можете точно выбрать инструкции в любом случае) или код сборки (в этом случае вы должны быть в состоянии просто использовать 'blx', где это необходимо) здесь? – Notlikethat
Это, по сути, стек gpu, поэтому адреса могут быть далеко друг от друга. Инструкция BX решает мою проблему, и, как предложила Андреа, будет использоваться относительный прыжок. Спасибо Notlikethat :) – Larry