Jump to content
    

AzardCry

Участник
  • Posts

    12
  • Joined

  • Last visited

Reputation

0 Обычный

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Доброго времени! При программировании на ассемблере возникло две сложности, которые самому не удалось решить, прошу подсказать: 1. В документации на МК (1986ВЕ4У) есть используемая в нём система команд THUMB и список всех команд, которые используются, в том числе команда AND. При работе в Keil использование выражения "AND Rx, #0xXXXXXXXX" компилятор сообщает, что такая команда в наборе команд THUMB (указанным мной в начале файла) не существует (error: A1618E: Specified instruction is not supported by the current instruction set). Для справки, данной командой отчищаю часть регистра. Замена на ANDS не выручает. При этом ORRS работает. 2. Команда POP {LR} также не работает со следующей ошибкой (error: A1875E: Register Rn must be from R0 to R7 in this instruction). Я так понимаю у меня соответствующий регистр 16-битный и мне придётся всё же использовать дополнительный регистр для копирования туда значения LR перед заходом в процедуру (так как в LR на данном этапе будет помещён другой адрес возврата)?
  2. Доброго дня, Aaarrr! Благодарю за ответ! Не подскажете ли в завершение этого вопроса, как мне понять (В документе AAPCS сказано, что аргументы переносятся в регистры R0-R3, а возвращаемое значение - в R0...): 1. Куда я возвращаю значение в Си или как мне вернуть значение в переменную Си, я хочу в дальнейшем результат вычислений использовать как аргумент в цикле, внутри которого мигает светодиод (а команды return и переменной (напр. return RetVal), куда будет возвращаться значение, в коде Си нет... 2. SimpleSum в итоге есть адрес ячейки в памяти программ (что видно при отладке) и выполнение программы переходит на него. Где заканчивается выполнение этой функции? В конце процедуры start (т.е. в ассемблере данный символ является просто меткой в процедуре, где компилятор обозначает конец её "тела")? 3. Keil пишет, что GLOBAL и EXPORT в ассемблере - синонимы. Есть ли разница в использовании. которая определяет применение каждой директивы в том или ином случае? Мой код Си в заголовочном файле: extern int SimpleSum(int Value); Вызов функции в исполняемом файле: SimpleSum(FirstNum); //помещаю значение переменной FirstNum для использования в вычислениях Часть ассемблерного кода в области DATA: GLOBAL SimpleSum Часть ассемблерного кода в области CODE start PROC SimpleSum ....Здесь ассемблерный код (два цикла с метками Loop1(2) и командами между ним)... MOV R0, R3 ;Move value to R0 to return ENDP ALIGN END
  3. Доброго времени, Arllex! Благодарю за пример! Не подскажите, как сделать ту же функцию, но только принимающую значение из .c-файла и возвращающую в него же результат: Насколько я успел понять до этого времени, аргументы функции переносятся в регистры с 0-го по N-ый соответственно по порядку из записи в "()", а вернуть их можно с помощью команды RET. На сайте ПО (сайт Keil) написано, что эта (RET) команда возвращает данные из стека (также в примерах фигурирует BX LR). Собственно, как именно передать условный аргумент "FirstNum" и вернуть из RegSum.s в main.c значение, присвоив его какой-либо переменной, чтобы потом использовать его далее, остаётся не ясным. Прошу пояснить или указать мне на материалы, которые проясняют данный вопрос. Также интересно, почему для того, чтобы функция "видела себя" в различных файлах, в .s необходима "EXPORT", а в Си (.h-файле) никакой директивы для этого не предусмотрено. "Никак. Потому как ассемблер и си - это разные языки. И файлы *.s и *.c имеют разный формат." - Касательно несогласия вас и jcxz - уже вижу, что разногласий нет. Скорее я неверно сформулировал вопрос, изначально, конечно, имелись ввиду вызовы функций из файлов различного формата, пример чего вы и предоставили.
  4. Доброго времени, Arlleex, jcxz, Darth Vader! 2. Arlleex, а можно короткий пример того, как процедура из файла RegSum.s будет перенесена в main.c? jcxz, Arlleex, судя по всему, не согласен с вами, либо имеет ввиду что-то другое (мне сложно сказать). Darth Vader, я исключительно в образовательных целях хочу создать три файла: два .c, один .s; один .c (main) основной; из второго .c (PortInit) я делаю своего рода библиотеку для выноса части кода; третий .s (RegSum) схож по назначению с PortInit.c, но на языке ассемблера. Функцию на Си написать могу, но тогда образовательная ценность моей задумки упадёт. Задача в том чтобы из PortInit и RegSum вставлять функции в main.c, но как сделать это для последнего я не знаю, потому что не работал с ассемблером до сих пор. 3. jcxz, может и галиматью, заранее прошу прощения за ошибки в терминологии, сам пока не до конца разобрался :)
  5. Здравствуйте, Arlleex! 1. Неужели всё настолько сложно и плохо, что новичку даже мигание светодиодом в симуляторе (для указанных камней) не сделать?
  6. Здравствуйте! Как писал в одной из тем, имею на руках 1986ВЕ4(У) и STM32F(407VE6). Обнаружил, что в Keil есть симулятор и для отладки моих программ мне не обязательно сразу подключать отладочную плату. Но после путешествия по форуму выяснил, что симулятор не простой и часто за просто так работать не желает (в т.ч. потому, что симулирует ядро, а не периферию), либо желает, но с ошибками вроде невозможности симуляции сигнала переменной (вывод порта ввода-вывода, например) и т.д. 1. Если у кого-либо имеется опыт работы с указанными выше камнями, прошу указать тонкости настройки симулятора для них.
  7. Здравствуйте! В своём проекте создал 5 файлов - main (.c, .h), PortInit (.c, .h), RegSum (.s). Собственно, весь вопросы в том, что: 1. А так вообще кто-то делает, или намного легче через __ASM написать всё в .c-файле? 2. Как правильно организовать включение текста файла RegSum.s (на языке ассемблера) в main.c, с учётом того, что это именно отдельный файл в дереве проекта, а не вставка в main.c 3. Судя по некоторым темам на форуме, есть трудности при организации функции, телом которой является .s-файл (напр, команды среды END, ENDP), разве среда не должна их выкинуть при компиляции, оставив только "железные" команды? 4. Также, немного не в теме вопроса, но: "Если хотя бы один из ISR, на которые ссылается таблица прерываний, определён в другом файле (а не в этом .asm), то указатель на него будет не константой. Он будет браться на этапе компоновки из таблиц экспорта .obj-файлов. А значит на этапе компиляции он неизвестен. "А зачем там пролог? __attribute__((naked)) скорее" З.Ы. имеется ввиду пролог функции. Собственно, это цитаты из различных тем, которые кажутся мне интересными. Когда я читаю про таблицы экспорта, вектора прерываний, прологи функций - я понимаю, что моих знаний о том, как функционирует среда программирования и как работают устройства - маловато. Подскажите, если это возможно, хорошую литературу (Ру, Анг), которая сможет (относительно) без лишних слов дать мне представление о том, как это всё взаимосвязано. Пособия и книги, которые я видел до сих пор не дали мне представления о таких вещах. Признаюсь, стандарты языков и документацию на Keil до конца не читал.
  8. Забыл, спасибо! Всё работает Для тех, у кого такая ошибка возникнет - в секции CODE: AREA |.text|, CODE, READONLY EXPORT __main __main Start PROC ...
  9. Честно говоря, не совсем понятно, что необходимо сделать. При попытке добавить таковой символ в код в качестве метки (в моём понимании я пытаюсь создать "реализацию" некоторой функции, которая будет являться моей программой) или переменной ошибка не устраняется, при использовании двух одинаковых символов в одной программе появляется соответствующая ошибка... При этом в иных примерах вообще никто "main" не использует. Словом, проблема всё ещё актуальна для решения (и лично для меня остаётся частично загадкой, особенно с учётом того что доступ к ряду библиотек, на которые как на источники реализации функций ссылаются другие библиотеки (речь в т.ч. о Си) попросту недоступны).
  10. Данный способ вызывает дополнительные ошибки: .\Objects\ASMSimple.axf: Error: L6218E: Undefined symbol __main (referred from startup_mdr1986be4.o). .\Objects\ASMSimple.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from startup_mdr1986be4.o). .\Objects\ASMSimple.axf: Error: L6218E: Undefined symbol __aeabi_uidivmod (referred from system_mdr1986be4.o).
  11. Как это сделать? Можно какую-нибудь инструкцию по исправлению?
  12. Здравствуйте! В собственных интересах разбираюсь с Keil uVision и уже второй раз встречаюсь с ошибкой вида "Error: L6218E: Undefined symbol referred from __rtentry2.o", в данном случае при попытке написать файл на языке ассемблера. В предыдущий раз ошибка подобного рода звучала как "Error: L6218E: Undefined symbol referred from main.o" при написании на языке Си (было исправлено, не хватало библиотечного файла). В проектах используются 1986ВЕ4У, аналогично в наличии STM32F4 (Discovery board). При настройках, аналогичных сделанным авторами в сети при программировании последнего (на ASM), ошибка никуда не исчезает. Не могу понять, в чём дело и какого файла (декларации) не хватает линковщику. *Полная строка ошибки ".\Objects\ASMSimple.axf: Error: L6218E: Undefined symbol main (referred from __rtentry2.o)." - файл называется "main.s", может это связано? После прочтения ряда тем с подобным вопросом проверил основные причины, которые могли бы вызвать данное сообщения, относящееся к линковщику: 1. Все библиотеки подключены к проекту (в данном случае CORE, Startup для проекта на ASM, где последний запускает тактирование ядра). Внутри main.s, как я понял, указаний на включение текстов библиотек может не быть. 2. Кроме латинских букв в папках и подпапках проекта из подозрительного существуют только пробелы. 3. Все возможные библиотечные файлы дублированы в папке с проектом (хотя их исходники должны лежать и в папке Keil * ""/<>). 4. Вкладка Linker ПО настроена по умолчанию, что вполне позволяло писать программы на Си. 5. Написание "USE_STDPERIPH_DRIVER" (одно из предложений для решения данной проблемы для написания на Си) не помогло. 6. Создание нового проекта/пересборка не помогли, ошибка остаётся. Прошу помочь в решении данной трудности, а также подсказать: 1. Что это за файл __rtentry2.o (.O: Relocatable object files - справка с сайта Keil)? 2. Влияет ли вложенность папки проекта в другие папки на компиляцию? Заранее благодарен! Проект прикрепляю. ASM Simple.7z
×
×
  • Create New...