Так меня порой за "отступление от стандартных наименований" и матюкают. В общем то ... Исходная проблема стандарта применения нескольких файлов вытекает из необходимости прописывать все файлы в запускающей командной строке компилятора... А мне то оченно вломуушки было... Да и работа с "быстрым переходом" между тремя компиляторами - mcs51, PIC и AVR требовала использования максимально удобного обобщения для работы с исходниками для всех применяемых компиляторов. Вроде таки получилось относительно удобненько. Для АВРок еще одно интересное замечание - "карта переназначения регистров регистрового банка" - собственно с теми регистрами можно выбрать модель, соответствующую раскладке и функционалу регистров других МК/МП (аналогия воде только у ПИК24 - но те я лишь очень бегло смотрел - могу и ошибиться). Плюс карты- подсказки по системам команд, чтоб быстрее вспоминалось "недавно забытое" и на закусь конспекты по самим МК и системам команд. Начну с той карты... Собственно добавляю ее в каждый проект в разделе дефайнов (или позже отдельным файлом дефайнов*) Спойлер
Код:
;_____ ;таблица объявленных имен - переназначение регистров РОН ; ; принята базовая модель: ; область ограниченного функционала ; .def mfr0 = r0 ; (математика и обмен с ПЗУ/самопрограммирование) ; .def mfr1 = r1 ; (математика и обмен с ПЗУ/самопрограммирование) ; .def = r2 ;(ограниченный функционал) ; .def = r3 ;(ограниченный функционал) ; .def = r4 ;(ограниченный функционал) ; .def = r5 ;(ограниченный функционал) ; .def = r6 ;(ограниченный функционал) ; .def = r7 ;(ограниченный функционал) ; .def = r8 ;(ограниченный функционал) ; .def = r9 ;(ограниченный функционал) ; .def = r10 ;(ограниченный функционал) ; .def = r11 ;(ограниченный функционал) ; .def = r12 ;(ограниченный функционал) ; .def = r13 ;(ограниченный функционал) ; .def = r14 ;(ограниченный функционал) ; .def = r15 ;(ограниченный функционал) ; область полного функционала .def tmp0 = r16 ; рабочий регистр (полный функционал) .def tmp1 = r17 ; рабочий регистр (полный функционал) ; .def = r18 ;(полный функционал) ; .def = r19 ;(полный функционал) ; .def = r20 ;(полный функционал) ; .def = r21 ;(полный функционал) ; .def = r22 ;(полный функционал) ; .def = r23 ;(полный функционал) ; .def = r24 ;("указатель базы" полный функционал) ; .def = r25 ;("указатель базы" полный функционал) ; Xl = r26 ; адрес сегмента Х (полный функционал) ; Xh = r27 ; адрес сегмента Х (полный функционал) ; Yl = r28 ; адрес сегмента Y (полный функционал) ; Yh = r29 ; адрес сегмента Y (полный функционал) ; Zl = r30 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование) ; Zh = r31 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование) ; регистры Xh:Xl, Yh:Yl, Zh:Zl определены в дефайне изготовителя и в системе команд ; изменение их имени хотя и возможно, но нежелательно - ; возникает путаница с интегрированной абревиатурой системы команд ; в случае с "малой моделью" допускающей/достаточной для размещения ВСЕХ ; используемых ВСЕМИ подпрограммами регистров в области СОЗУ регистрового ; файла одновременно (без "подкачки" наборов параметров через ОЗУ) ; рекомендовано переназначение индивидуальных имен регистров ; согласно текущей задачи ;
собственно регистру присваиваем условное имя для последующего использования в проекте уже по тому имени. Даже для тиньки 13 можно переделить так, как удобнее (с учетом особенности работы каждой группы регистров в системе команд АВР) для прикладного проекта. Можно модель распределения регистров и под 51ю и под 580 и под Z80 и под ПИК чего другого самодельного "прировнять"... А уж затем и применяемые алгоритмы легче переносить в другую систему команд. Воть как то так для начала... Если интересно - дальше продолжу...
Там много интересного можно делать - к примеру "область быстрого стека" с использованием mov/movw... Единственно аккуратно относиться к использованию R0-R1 и адресно - индексных R26-R31. Они могут в очень многих интересно-полезных случаях использоваться. Второй добавкой, является использование в заголовке главного файла описания конфигурационных бит применяемого МК как "по умолчанию", так и то, что в текущем проекте использоваться будет. Эта "шапка" заимствована из практики ПИКов. Хоть практически фузы не меняет - такой приятности у avrasm2 нету, но позволяет заранее знать конфигурацию проекта (и сохранить в документации). Минус - пришлось посидеть за даташитами на свой комплект "проработанных" МК... К примеру "шапки" шаблонов главного файла проекта для тинек:
Есть еще для нескольких МК, но те пока не проверялись в проектах. Ну и выкопировка *.inc файлов описания ресурсов из каталога ДИСК:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes это обычный минимум для любого варианта написания.
...Очень пригождается в математике, сравнении с нулем "младших" регистров (cp r2, rZero), оперативного обнуления переменных в памяти (sts var, rZero), в команде CPSE.
Тоже использую R15=0, главное не только дефайнить, но и обнулять его Для сравнения с 0 и определения знака использую команду TST. Нравится команда сравнения слова с нулем ADIW RL,0 (RL может R24, XL,Y,L,ZL)
Последний раз редактировалось akl Ср дек 11, 2024 15:10:34, всего редактировалось 2 раз(а).
Нет - ATtiny2313... AT90S2313 это вроде из самых старых... Такой даже в "пробниках" не было. Заготовки вот на эти (не факт, что без возможных ошибок - не проверял пока):
Просто делалось только то, на что распечатка док и сами кристаллы имелись. Собственно цель ассемблерных конструкций прикладная самодельная периферия. Далее уже было изменение самой структуры файлов проекта. Для "слишком мелких" простых конечно и одного файла достаточно. А вот для более крупных используется та шапка и несколько дополнительных файликов: собственно *.inc из комплекта компилятора (иногда и его корректировать приходится, но крайне осторожно) ; файл распределения ресурсов mdf_avr.txt (включает и карту регистров и карту разметки ОЗУ и чего там еще ...); Спойлер
Код:
; ; "mdf_avr.txt" файл объявленных имен, бит и констант ; (шаблон основного файла определений проекта) ; ;---------- ; variable definitions ;(таблица обьявленных имен) ; ; определение метки многофайлового проекта ; ставится только в основном файле определений проекта #ifndef disposit #define disposit #endif ; ; ;_____ ;таблица обьявленных имен - пользовательские константы ; ; .equ name/label = const / expr ; define datas
;_____ ; блок определений ; ;таблица обьявленных имен - переназначение регистров РОН ; ; ; принята базовая модель: ; область ограниченного функционала ; .def mfr0 = r0 ; (математика и обмен с ПЗУ/самопрограммирование) ; .def mfr1 = r1 ; (математика и обмен с ПЗУ/самопрограммирование) ; .def s_sreg = r2 ; зеркало SREG(ограниченный функционал) ; .def sys_flag = r3 ; системные флаги(ограниченный функционал) ; .def = r4 ; (ограниченный функционал) ; .def = r5 ; (ограниченный функционал) ; .def = r6 ; (ограниченный функционал) ; .def = r7 ; (ограниченный функционал) ; ; .def = r8 ; (ограниченный функционал) ; .def = r9 ; (ограниченный функционал) ; .def = r10 ; (ограниченный функционал) ; .def = r11 ; (ограниченный функционал) ; .def = r12 ;(ограниченный функционал) ; .def = r13 ;(ограниченный функционал) ; .def = r14 ;(ограниченный функционал) ; .def = r15 ;(ограниченный функционал) ; ; область полного функционала .def tmp0 = r16 ; рабочий регистр(полный функционал) .def tmp1 = r17 ; рабочий регистр(полный функционал) .def tmp2 = r18 ; рабочий регистр(полный функционал) .def tmp3 = r19 ; рабочий регистр(полный функционал) .def tmp4 = r20 ; рабочий регистр(полный функционал) .def tmp5 = r21 ; рабочий регистр(полный функционал) .def tmp6 = r22 ; рабочий регистр(полный функционал) .def tmp7 = r23 ; рабочий регистр полный функционал) ; .def Bl = r24 ; "указатель базы"(полный функционал) .def Bh = r25 ; "указатель базы"(полный функционал) ; Xl = r26 ; адрес сегмента Х (полный функционал) ; Xh = r27 ; адрес сегмента Х (полный функционал) ; Yl = r28 ; адрес сегмента Y (полный функционал) ; Yh = r29 ; адрес сегмента Y (полный функционал) ; Zl = r30 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование) ; Zh = r31 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование) ; регистры Xh:Xl, Yh:Yl, Zh:Zl определены в дефайне изготовителя и в системе команд ; изменение их имени хотя и возможно, но нежелательно - ; возникает путаница с интегрированной абревиатурой системы команд ; в случае с "малой моделью" допускающей/достаточной для размещения ВСЕХ ; используемых ВСЕМИ подпрограммами регистров в области СОЗУ регистрового ; файла одновременно (без "подкачки" наборов параметров через ОЗУ) ; рекомендовано переназначение индивидуальных имен регистров ; согласно текущей задачи ; ;_____ ;таблица обьявленных имен - секция флагов пользователя ; ; .equ name/label = expr ; ; флаги в регистре flags
файл макросов macros_proto.txt (или как-то иначе называть можно)... Спойлер
Код:
; ; "macross__proto.txt" ; файл описания макросов (шаблон) ; .macro xchrr ; псевдокоманда "обмен регистра/акумулятора/ с регистром" eor @0,@1 ; вызывается как xchrr rd,rs eor @1,@0 eor @0,@1 .endmacro ; .macro ldiw ; псевдокоманда "загрузка слова в регистровую пару /X,Y,Z/" ldi @0l,low(@1) ; вызывается как ldiw rp,0xnnnn или ldiw rp,name ldi @0h,high(@1) ; (где name=0xnnnn, rp=x,y,z) .endmacro ;
Далее собственно файлы программ подключаются - тоже с расширением*.txt Для расширения используются именно *.txt, а не *.inc, *.asm или *.s - чтоб компилятор их не путал и не матюкался. Собственно идет подстановка в *.asm файл текстовых вставок (компилятор их так и воспринимает). Сама папка проекта также разделена на несколько подразделов... К примеру вот такой проектик (из старых):
Правда из него вся графика и дополнительная документация удалены (слишком велики) - просто для понимания как все стыкуется и обзывается. Вобшчемссс... посмотрямс на интерес - может еще чего добавлю... Или выслушаю матюков со вниманием.
В своих проектах один из регистров "делаю нулевым" (для AVR)
в проектах для АТмега8 я нулевым делаю ZH, так как все данные у меня лежат в начале ОЗУ (0x60 - 0xFF), когда ZH = 0. поэтому у меня нет необходимости выделять отдельный регистр для нуля.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Мудро!!! Но в этом случае ИМХО лучше ограничить использование ОЗУ адресом (0xFF - 1), иначе может "что-то пойти не так" после команд RD Rx, Z+ / ST Z+, Rx. Хотя, обычно в конце ОЗУ стек, поэтому способ безопасный.
Нуль можно и в варианте константы определить. Да и весь младший блок регистров с ограниченным функционалом за исключением R0-R1 вполне сгодиться. Зачем полнофункциональные занимать?
А я бы советовал использовать распределение регистров полностью совпадающее с распределением GCC. Тогда меньше проблем, если вдруг приспичит поработать с ассемблерными модулями в Си.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Это хорошо, если используется модель АВР. Но ведь возможно и иное переназначение регистров файла под наиболее удобную модель распределения регистров... это все таки "чистый ассемблер". К примеру тот же "быстрый стек" под отдельные подпрограммы в младшей части регистрового банка...
С этой точки зрения и выбрал R15. Идея Старичка хороша тем, что при малом объеме ОЗУ ноль образуется "автоматически" (XH,YH,ZH) и вообще не нужно выделять отдельный регистр.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения