Что означает «A1114E: Ожидаемое относительное выражение регистра»?

#assembly #arm #addressing-mode

Вопрос:

Привет, я пытаюсь вызвать подпрограмму ассемблера из c и получаю эту ошибку. На веб-сайтах Arm просто указано, что эта ошибка существует.. Код C

 #include lt;stdint.hgt; extern void out_word(uint32_t out_address, uint32_t out_value); extern uint32_t in_word(uint32_t in_address); int main(void){  uint32_t value = in_word(0x60000200);  uint32_t address = 0x60000100;  out_word(address,value);  return (0); }  

Код ассемблера

 PRESERVE8  AREA myCode, CODE, READONLY  EXPORT in_word  EXPORT out_word  in_word PUSH {R1-R7}  LDR R1, R0 ; line which produces the problem  LDR R0, [R1]  POP {R1-R7}  BX LR     out_word STR R1, [R0]  BX LR    END  

Комментарии:

1. LD это инструкция по загрузке из памяти . Для копирования между регистрами вам нужно использовать (возможно, неправильно названную) инструкцию перемещения MOV .

2. R0 это не режим адресации памяти. Ваш [R1] на следующей строке. Ты же знаешь, что мог ldr r0, [r0] бы, если бы захотел, верно? Я тоже не понимаю, почему вы нажимаете/открываете так много регистров.

3. @PeterCordes Я тоже не знаю, я удалил его сейчас, и он все еще работает. Спасибо

4. Если вы хотите опубликовать свой рабочий код, опубликуйте фактический ответ , а не редактирование вопроса. На 100% нормально ответить на свой собственный вопрос, если он написан как реальный ответ.

Ответ №1:

Вы используете неправильную инструкцию. LDR — Загрузка с немедленным смещением, предварительно проиндексированным немедленным смещением или послеиндексированным немедленным смещением

Вам нужно использовать mov инструкцию

Комментарии:

1. Спасибо, это сработало

Ответ №2:

Окончательное решение, которое работает

 PRESERVE8  AREA myCode, CODE, READONLY  EXPORT in_word  EXPORT out_word  in_word LDR R0, [R0]  BX LR     out_word STR R1, [R0]  BX LR    END