Инструкция STR и LDR в сборке ARM

Я пытаюсь перенести простую ОСРВ, написанную для arm926ejs, на ARM Cortex-A9. Ссылаясь на переключение контекста, я натолкнулся на следующие инструкции:

_userIntrStackPtr:
    .word   0x0  

STR     sp,_userIntrStackPtr

LDR     r0,__userStackPtr2Ptr

Но когда я пытаюсь скомпилировать код, я получаю сообщение об ошибке

Error: internal_relocation (type: OFFSET_IMM) not fixed up

Может кто-нибудь объяснить приведенную выше инструкцию? Также, когда я ссылался на другие коды, я видел похожие инструкции, например,

LDR     r0,=__userStackPtr2Ptr

В чем разница между этими двумя методами? Как я могу использовать эти метки с инструкциями str и ldr? Я плохо разбираюсь в сборке. Пожалуйста помоги..


person Ajeesh    schedule 22.11.2016    source источник


Ответы (1)


Данная форма инструкций использует относительную адресацию ПК, и некоторые ассемблеры могут накладывать на них ограничения, например, символы должны находиться в одном разделе, чтобы смещение было известно. Тем не менее, приведенный выше код, как показано, ассемблируется с помощью ассемблера gnu 2.24.51.20131021. Я предполагаю, что вы не предоставили настоящий MCVE.

Что касается второй части вопроса: = загружает адрес, поэтому вам понадобится еще _2 _ / _ 3_ для выполнения операции с памятью. Например:

LDR r0, =_userIntrStackPtr
STR sp, [r0]
LDR r0, =__userStackPtr2Ptr
LDR r0, [r0]
person Jester    schedule 22.11.2016
comment
Спасибо за ответ шуту. Поменял разделы и теперь ошибка ушла. Хотя все относилось к разделу .text в компоновщике, один был в .text, а остальные - в .text.vectors. Я изменил как на .text, так и на его компиляцию. Работу не тестировал, но ошибка исчезла. - person Ajeesh; 22.11.2016