1)Это как бы и не совсем внешний файлы, так сказать, куски кода, которые по отдельности легче отлаживать. Место где они будут описываться в "Main" файле тоже, как бы особого значения не имеет. Их описание в начале файла придавало-бы тексту читабельности, на мой взгляд.
Вставить их после области векторов прерываний и перепрыгнуть "rjmp" - вопросов нет., это если куски кода имеют вид законченных подпрограмм. Возьмем, например, подпрограмму задержки, и уберем последний "ret" (возврат из подпрограммы) - и у нас получится функционально законченный кусок кода, который можно вставлять в нужные ( и не очень

) места. Описать его в начале (либо в другом месте), а вливаться ему в программу по указанной метке. (Но это уже, наверное, из области макросов в коих я пока вообще никак.)
2)Опять эти макросы... в файле "m8def.inc" меня "вдохновили" многочисленные строки:
; ***** BOOTLOADER DECLARATIONS ******************************************
.equ NRWW_START_ADDR = 0xc00
......
.equ SMALLBOOTSTART = FIRSTBOOTSTART
.equ LARGEBOOTSTART = FOURTHBOOTSTART
мне и подумалось, что если им можно, то почему мне нельзя?, ан-нельзя, видать умом пока еще не вышел

А так хотелось - указал в начале (либо в другом месте) программы, что нулевой пин порта "B" - это здесь и далее по тексту обозначается как "pinRS", - то при замене на любой другой вывод, надо только переназначить "pinRS" и не гонятся по всему тексту за "portB,0".
А на счет "GNU-ассемблер" - мне бы хотя бы с макросами разобраться... Может есть чего почитать про макросы, обязательно с примерами, и поближе к AVR-кам?