Ранее писал на ассемблере в avr studio 4.
Но потребовалось добавить возможность чтения данных с SD-карты
Решил не заморачиваться, ибо посчитал что реализовывать работу с SPI, обмен данными с SD-картой и с файловой системой на ассемблере - это извращение, и проще воспользоваться готовой библиотекой. Поэтому решил перевести все в среду ардуино. Но код для работы с остальными устройствами, в частности с Олед-дисплеем решил оставить на ассемблере, ибо существующие библиотеки и ужасно тормозные и не обладают требуемыми возможностями и весьма громоздки, так как содержат в себе кучу ненужных мне вещей.
Но сразу напоролся на такую штуку:
Вот кусок кода на ассемблере из авр студио:
Но если я его переношу в ардуино (файл с расширением .S) компилятор ругается:
sketch\oled.S: Assembler messages:
sketch\oled.S:28: Error: garbage at end of line
sketch\oled.S:29: Error: garbage at end of line
exit status 1
Ошибка компиляции для платы Arduino Uno.
Подскажите, как правильно такое написать.
В авр студио у компилятора имелись функции low() и high() для выделения байтов из слова. Как быть с этим в среде ардуино?
Код надо приводить полностью. Вот как по Вашему куску понять на какие именно строки ругается?
Теперь по сути. Дело тут не в avr-студии и IDE, а в том как у Вас сконфигурирован тулчейн.
Судя по директиве .db, в студии Вы используете AVRASM. А в IDE используется GNU Assembler. Это совершенно разные ассемблеры. Например, в GNU Assembler нет никакого .db.
Так что Вам надо или перенастраивать тулчейн, или переписывать код на GNU ассемблер.
Ну вообще-то я это у Вас и пытаюсь спросить, в надежде внести ясность для себя в данную ситуацию.
А что касается сдвига, то понятно что он умножает на 2, т.е. в моем случае преобразует адрес слова, скажем так: из 16-битного представления программной памяти ячейки в адрес байта, если память представить как массив 8-битных ячеек.
В AVRASM сдвиг нужно было делать. А вот в GNU не знаю, но подозреваю что не нужно.
Хорошо. скажем по другому. память 16-разрядная. Адрес адресует слова. Но при работе с программной памятью как с данными, можно обращаться к отдельным байтам в слове. Т.е. адрес в регистре должен быть сдвинут влево, а в 0 бите должен быть номер байта в слове.
Я не знаю адрес ячейки. Потому что он определяется компилятором.
Все. верно. В AVRASM сдвиг нужен был, я его делал и все работало как нужно.
Т.е. если данные то нужен сдвиг влево, а если например адрес например для косвенного перехода то сдвиг не нужен.
Но в среде ардуино операции сдвига влево нет. Вернее компилятор на него ругается если он не в с-шном коде а в ассемблерном.
И у меня есть подозрение, что в GNU в случае с данными сдвиг не нужен, а в случае с переходами нужен сдвиг вправо (иначе зачем тогда существует функция pm() )
Но это пока предположение, и хотелось бы 100% быть уверенным да или нет.
Сегодня нет возможности, но завтра попробую проверить это на железе.
А еще лучше подскажите где взять дизасемблер, чтобы убедиться что компилятор компилирует так как это мне нужно.
Или можно ли в ардуино получить подробный листинг компиляции.
Честно говоря, так ли это, - не знаю, я всегда пользуюсь только своими библиотеками (кстати - возможно. Должна же быть причина, пор которой я пользуюсь только своими!), но неужели Вы думаете, что “тормознутость” связана с языком, на котором они написаны?
Есть и еще одна (очень существенная) причина не писать на Ассемблере. По крайней мере, для Ардуино.
Ардуино - это платформа, которая включает AVR, SAM3, STM32, ESPxxx и кучу других вариантов, ОБЩЕГО ассемблера для которых попросту не существует.
Стало быть, писать для Ардуино на Ассемблере - невозможно.
Одно из следствий: тема об Ассемблере на форуме Ардуино - оффтопик.
И, кстати, почему слова “Ассемблер” не фигурирует в названии темы?
Передавать параметры конечно придется, но думаю там проблем не должно возникнуть. Да и не настолько много у меня будет параметров что их нельзя будет передать исключительно через регистры.
Не полностью, конечно, но частично да. Ибо ни один компилятор не в состоянии настолько оптимизировать генерируемый код, насколько это может сделать человек, напрямую пишущий инструкции для процессора.