Не е точно така.
Имах нещо написано по въпроса и ще го копна.
При PIC 16F8xx, 16F8x програмния брояч е 13 битов това позволява да се адресират 8192 думи от програмната памет (8к).При различните процесори физически в чипа е реализирана част от тази памет. Тези 8к програмна памет логически е разделена на страници от по 2к , които пък от своя страна са разделени на блокове от 256 думи. Тази логическа организация е наложена от архитектурата на процесора. При модифициране съдържанието на програмния брояч( промяна на хода на линейното изпълнение на програмата) т.е при извършване на изчислен преход, преход към даден адрес или извикване на подпрограма е необходимо да се зареди нова стойност в програмния брояч за всеки от изброените случаи това става по различен начин. При тези процесори целия програмния брояч не е директно програмно достъпен,достъпен е само неговия младши байт PCL, а промяната на старшия байт на брояч се осъществява чрез буфериращия регистър PCLATH. При прилагане на изчислен goto резултата получен от АЛУ е осем битов. Този резултат може да се запише в младшия байт на програмния брояч едновременно със самото записване на PCL в PCH се прехвърля стойността на PCLATH. При начално установяване на процесора в PCLATH се записва 0x00, така че без промяна на PCLATH може да се използва изчислен goto само в рамките на първия блок от 256 думи от програмната памет. За да се използва прехода за цялата програмна памет е необходимо да се следи за преминаването в друг блок и съответно да се коригират битовете от 0-4 на PCLATH педи записа в на PCL.
При изпълнение на инструкции goto или call в програмния брояч се зарежда отново само част от адреса само че в този случаи млад6ите 11 бита от адреса на прехода които се съдържат в кода на самата инструкция. Тъй като програмния брояч е 13 битов старшите два байта се прехвърлят в PCH от 4 и 3 бит на PCLATH. Ако не се променя PCLATH преходите и извикванията на подпрограмите могат да стават само в рамките на една страница от програмната памет т.е 2к тъй като толкова може да се адресира с 11бита. Ако трябва да се извърши преход към адрес от друга страница различна от 0 или да се стартира подпрограма трябва преди съответната инструкция да се избере правилната страница чрез PCLATH 3:4. Трябва да се има предвид че веднъж избрана друга страница тя остава избрана докато не се промени чрез PCLATH 3:4. Това е много важно за6тото примерно ако имаме следния случаи:
Програмата се изпълнява и конкретната инструкция за стартиране на подпрограма е на адрес < 0x800 т.е е от страница 0. Но подпрограмата е разположена на адрес >0x800 т.е е от страница 1 за да се стартира коректно преди CALL трябва да се зададе страница 1 (BSF PCLATH ,3). Но това не е достатъчно за коректното изпълнение на програмата защото след края на подпрограмата и RETURN автоматично ще се възстанови само състоянието на програмния брояч от стека но няма да се промени PCLATH. А това предпоставка за проблем. Главната програма ако извика следваща подпрограма която е от страница 0 CALL 0x100 примерно няма да се стартира тази подпрограма а ще се стартира такав с адрес 0x900 което би объркало хода на изпълнението тотално и от този момент процесора ше се държи напълно неадекватно на заложения алгоритъм. За да се избегне това трябва задължително преди CALL 0x100 да се избере страница 0. (BCF PCLATH ,3).
Точно това съобщение не е за пренебрегване това 4е програмата се компилира успе6но
въоб6те не значи че ще се държи адекватно от един момент може да се омаже тотално.
Писането на asm за даден процесор, позволява да се използват най пълноценно всичкия му ресурс но предполага познаването в детайли на неговата архитектура и особеност. На asm може да се изцеди всичко от един процесор до границите на възможността му но това е за сметка на труда при писането на програмата не е като да го драснеш на C и да не задълбаваш точно как се изпълнява.
Успех.