2016-09-13 7 views
0

На ARMv7, который поддерживает Thumb, правильно ли мы можем избежать всех виниров, используя инструкцию BX?ARM Cortex A7: избегайте виниров памяти?

Поскольку эта инструкция занимает 32-разрядный регистр, мы хороши?

Если да, когда я вижу виниры в сгенерированном коде, я должен специализироваться на выходе для моей машины, верно?

Благодаря

+0

Как правило, компоновщик собирается начать облицовку ветвей, когда цели находятся слишком далеко - насколько большой ваш код? – Notlikethat

+0

И для случая шпона межсетевого взаимодействия ARMv4T (который я забыл, это было), лучшее решение, скорее всего, либо «не нацелено на ARMv4T», либо «не беспокоиться с кодом Thumb», в зависимости от того, что именно вам нужно поддерживать. Обсуждаем ли мы код C (в этом случае вы не можете точно выбрать инструкции в любом случае) или код сборки (в этом случае вы должны быть в состоянии просто использовать 'blx', где это необходимо) здесь? – Notlikethat

+0

Это, по сути, стек gpu, поэтому адреса могут быть далеко друг от друга. Инструкция BX решает мою проблему, и, как предложила Андреа, будет использоваться относительный прыжок. Спасибо Notlikethat :) – Larry

ответ

0

Да, поскольку 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 для них, так что вы рискуете выйти из диапазона разветвления.

+0

Точка. Спасибо Andrea – Larry

+0

Повторите второй абзац, если у вас еще нет адреса в регистре, тогда нет смысла использовать 'bx', когда вы можете просто« ldr pc, ... »непосредственно (за исключением маловероятной возможности чтобы поддерживать взаимодействие ARMv4T). – Notlikethat

+0

@Notlikethat Действительно, отредактировал ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^