К продолжению...
Относительно NOPов и кольцевых счетчиков...
Применимы оба варианта в зависимости от ситуации.
Кольцевой счетчик удобен в большинстве случаев, когда интервал измерения хотя бы на 4-5 машинных циклов более длительности суммарного тела счетчика (включая предсохранение в стеке регистра счетного интервала и команды вызова/возврата).
При типовой "стандартной по умолчанию" частоте 0,000001S/одноцикловую команду интервалы в 10-15 микросекунд предпочтительно отлаживать на NOPах.
То же касается и задержек, кои я ставил в драйвере для WS2812 (при 0,0000000625S/одноцикловую команду).
Относительно .dseg во "вкладных файлах"...
Не путайте вкладыши для ассемблерных вставок при работе под СИ (или иным компилятором) и работу под "чистым ассемблером" в AVRстудио!!!
Ибо в одном случае таки есть линкер (хоть и скрытый) который используется компилятором Си, а во втором - "чистый" двупроходный ассемблер...
Так воть...
Ниже примерчик... тестовый (к самим прожкам нет смысла придираться - ибо таки работают, хоть и не "заоптимизированы").
Ежли мы закомментируем в заголовке test.asm определение:
Код: Выделить всё
mul_a: .byte 3 ; множимое /младшая часть результата 3 байта
mul_c: .byte 3 ; старшая часть результата 3 байта
mul_b: .byte 3 ; множитель 3 байта
и откроем в заголовке файла mul24.txt соответственно эти строчки:
Код: Выделить всё
; .dseg
; mul_a: .byte 3 ; множимое /младшая часть результата 3 байта
; mul_c: .byte 3 ; старшая часть результата 3 байта
; mul_b: .byte 3 ; множитель 3 байта
то AVRstudio 4.19 выдаст нижеследующее сообщение:
т.е имеют место три ошибки, запрещающие дальнейшую работу.
Если вернем все на старое место - определения ячеек ОЗУ будет выполнено в заголовке основного файла проекта (test.asm),
а в mul24.txt закомментируем все назад, то компиляция пройдет без замечаний.
Причем такое действо абсолютно не зависит был ли файл умножителя назван mul24.txt или mul24.asm...
Ну и при желании можно будет протестироват в дебаггере работу умножителя и делителя, вводя значения во вкладке карты регистров ОЗУ.
Единственно чего там нету - предпроверки правильности данных и переполнения результата в делителе.
Причины таких "нюансов" разбирать... Это уже вопрос разработки компилятора...
А мне интереснее, как такую бяку без особого заморачивания обойти - вот потому и разговор о применении во "вкладных файлах" переразметки через #define.
Тем более, что такой прием одинаково работает и для avrasm2 и для c51asm и для mpasm.
