2016-11-01 3 views
0

Я пытаюсь написать простую программу, подытожить данные в массиве, но я получаю эту ошибкуОшибка сборки 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) 
+0

Теперь вам нужно загрузить 'LENGTH' и' SUM' в регистр перед их использованием. Т.е. замените 'LDR r2, LENGTH' на' LDR R2, = LENGTH \ nLDR r2, [r2] '. Вы также можете попробовать «adrl» с оригиналом (но я думаю, что исправление его просто показало еще две проблемы с привязкой). –

+0

что это за инструмент? –

+0

если ldr rx, = адрес не работает, то не делайте компоновщик делать это сами. в gnu это будет my_label: .word ARRAY, тогда замена adr будет ldr r3, my_label. my_label должен находиться в том же разделе, что и инструкция ldr. в основном это проблема, которую вы испытываете в целом. (это не так .data это .text, где вы хотите эту константу в основном) –

ответ

3

От the documentation for ADR:

If expression is program-relative, it must evaluate to an address in the same code area as the ADR pseudo-instruction. Otherwise the address may be out of range after linking.

Так один из способов фиксации проблемы может быть двигаться ARRAY к тому же коду AREA как инструкция ADR, которая ссылается на ARRAY.

Другим возможным решением было бы использовать псевдо-версию LDR для загрузки адреса. То есть вместо ADR r3,ARRAY используйте LDR r3,=ARRAY (отметьте знак =).
Таким образом, вы должны удержать ARRAY по данным AREA. Обратите внимание, что вам, возможно, придется поместить an LTORG directive после окончания вашей функции main.

+0

Для того, чтобы 'LDR r2, LENGTH' работать,' LENGTH' должен был находиться в радиусе действия для относительной нагрузки на ПК. Поскольку он находится в другом «AREA», он, скорее всего, не находится в пределах диапазона. Сначала загрузите его адрес в другой регистр, затем загрузите значение, например: «LDR r0, = LENGTH',' LDR r2, [r0] '. И аналогично для 'STR r6, SUM'. – Michael

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

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