все ваши проблемы именно в том, что вы, начитавшись непонятно каких книжек, используете неверный подход. если бы вы использовали рекомендованный мной способ с директивами
ORG - минимум половины проблем у вас не возникло, а может и вообще ни одной (с векторами). поясню, в чем суть.
от модели к модели количество используемых векторов прерываний, их размер и т.п. могут меняться, как вы справедливо заметили. поэтому если вы будете
считать команды
rjmp или
jmp в таблице векторов, надеясь попасть на нужное место - вам не избежать проблем при портировании кода с одной модели МК на другую. выход в принципиально ином системном подходе:
надо максимально абстрагироваться от конкретной аппаратной платформы и работать с символьными константами. Эти константы определяют адреса каждого вектора, описаны они в соответствующем inc-файле. главное: значения констант могут быть разные, но символьные имена остаются прежними. т.е. вектор прерывания по переполнению таймера 0 будет иметь название
TMR0_OV_VECT (я привожу
абстрактный пример, т.к. не помню точное название константы) для любого МК. если вы напишите в программе
то компилятор разместит команду перехода на подпрограмму-обработчик прерывания
Vect_Func именно по тому адресу, который соответствует вектору - для одного МК это будет ячейка, предположим, 2, для другого - 4, для третьего - 8. вы знать не будете, какая именно ячейка соответствует вектору, но программа будет работать верно! если какие-то векторы вам не нужны - просто не описывайте их - никаких
nop-ов в таблице векторов не надо! если вы будете использовать "короткие" переходы
rjmp - вы никогда не ошибетесь!
есть такое простое правило, которым пренебрегают программисты-любители: чем меньше конкретных чисел в вашей программе - тем лучше. т.е. вместо чисел используйте заранее описанные символьные константы (если вы задумаетесь, то все "названия" регистров не более, чем четкое следование этому подходу).
подумайте над сказанным и не ошибайтесь впредь!