2013-04-02 2 views

ответ

3

Существует четыре способа, три документально оформлены по адресу Sourceware's Gnu Assembler manual. Я предполагаю, что лейбл что-то вроде,

target: 
    .long 0xfeadbeef 
  1. adr r0,target
  2. adrl r0,target
  3. ldr r0,=target
  4. sub r0,pc,#(.+8-target)

Первые два очень похожи и генерировать sub r0,pc,#offset. 3-й ставит длинный в буквальном бассейне и загружает это через ldr r0,[pc,#offset2] или он может использовать mov, если ассемблер находит оно может (как правило, выровненную этикетку, как на 0x8000). Последняя версия предназначена для расчета вручную.

Разница между adr и adrl происходит от непосредственных операндов. Они 8бит повернуты кратным двум. Таким образом, если адрес далеко, возможно, потребуется выполнить две команды, которые, как правило, будут быстрее, чем вариант с 3-ем ldr которые получают полный 32 бит с помощью кэша данных или памятей.

См. Также: Relocation in assembler

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