Я пытаюсь написать простую программу, подытожить данные в массиве, но я получаю эту ошибкуОшибка сборки ARM: A1898E: Цель не может быть перемещена. Нет подходящее перемещение не существует для этой инструкции
error: A1898E: Target cannot be relocated. No suitable relocation exists for this instruction
Вот мой код
AREA SUMARRAY, CODE, READONLY
EXPORT __main
ENTRY
__main
LDR r2, LENGTH
SUB r2, r2, #1 ; r2 contains (LENGTH-1)
MOV r6, #0 ; r6 sum set to 0
FOR_INIT MOV r1, #0 ; r1 index I set to 0
ADR r3, ARRAY ; start r3 with address of A[0]
FOR_CMP CMP r1, r2 ; compare I and (LENGTH-1)
BGT END_FOR ; drop out of loop if I < (LENGTH-1)
LDR r4, [r3],#4 ; load r4 with A[I] then walk r3 down ARRAY
ADD r6, r6, r4 ; update sum with A[I]
ADD r1, r1, #1 ; increment I
B FOR_CMP ; loop back to for-loop check
END_FOR
STR r6, SUM ; store result in SUM
STOP B STOP
AREA my_data, DATA, READWRITE
ALIGN
SUM DCD 0XFFFFFFFF
ARRAY DCD 1,5,20,32,13,66,3,5,23,64,112,66,22
LENGTH DCD 13
Компилятор говорит, что проблема находится в этой строке
ADR r3, ARRAY ; start r3 with address of A[0]
Что не так с этим кодом? Может ли кто-нибудь объяснить, почему эта ошибка появляется? И как я могу это исправить?
Спасибо.
UPDATE
AREA Sorting, CODE, READONLY
EXPORT __main
ENTRY
__main
LDR r2, LENGTH
SUB r2, r2, #1 ; r2 contains (LENGTH-1)
MOV r6, #0 ; r6 sum set to 0
FOR_INIT MOV r1, #0 ; r1 index I set to 0
LDR r3, =ARRAY ; start r3 with address of A[0]
FOR_CMP CMP r1, r2 ; compare I and (LENGTH-1)
BGT END_FOR ; drop out of loop if I < (LENGTH-1)
LDR r4, [r3],#4 ; load r4 with A[I] then walk r3 down ARRAY
ADD r6, r6, r4 ; update sum with A[I]
ADD r1, r1, #1 ; increment I
B FOR_CMP ; loop back to for-loop check
END_FOR
STR r6, SUM ; store result in SUM
STOP B STOP
LTORG
AREA my_data, DATA, READWRITE
ALIGN
SUM DCD 0XFFFFFFFF
ARRAY DCD 1,5,20,32,13,66,3,5,23,64,112,66,22
LENGTH DCD 13
Но в этом случае я получаю ошибки
Error: L6286E: Relocation #REL:0 in sorting.o(SUMARRAY) with respect to LENGTH. Value(0x3fffff18) out of range(0 - 0xfff) for (R_ARM_LDR_PC_G0)
Error: L6286E: Relocation #REL:1 in sorting.o(SUMARRAY) with respect to SUM. Value(0x3ffffeb4) out of range(0 - 0xfff) for (R_ARM_LDR_PC_G0)
Теперь вам нужно загрузить 'LENGTH' и' SUM' в регистр перед их использованием. Т.е. замените 'LDR r2, LENGTH' на' LDR R2, = LENGTH \ nLDR r2, [r2] '. Вы также можете попробовать «adrl» с оригиналом (но я думаю, что исправление его просто показало еще две проблемы с привязкой). –
что это за инструмент? –
если ldr rx, = адрес не работает, то не делайте компоновщик делать это сами. в gnu это будет my_label: .word ARRAY, тогда замена adr будет ldr r3, my_label. my_label должен находиться в том же разделе, что и инструкция ldr. в основном это проблема, которую вы испытываете в целом. (это не так .data это .text, где вы хотите эту константу в основном) –