#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