Agree that C does it for you.
In Assembly, it might be worth noting that neither the 16F877 nor 16F628 recognize "banksel." The 16F887 and later (including all enhanced 16F1xxx and 16f1xxxx) chips do.
One little tidbit: The .inc file defines registers such as PORTA and LATA as offsets. So, if you are in the wrong bank and write something to affect a bit of a register in another bank, it will change that bit in the register of the current bank with the same offset.
One consequence of that is when disassembling a hex file, you will get warnings about checking banks and a lot of misnamed registers in other banks. Consider the 16F877 that you use. If you are in Bank1 and write something like bsf PORTA,1, that will actually change PORTA,1 to an input, as TRISA has the same offset in that bank as PORTA has in Bank0.
I write in Assembly almost exclusively for enhanced and later 16F chips. When doing anything involving banks, I keep track of the memory bank in a far right column, e.g., "<code> ; <comment> |B0 ." That avoids unnecessary use of "banksel" with almost every instruction. I also tend to use the actual instruction, "movlb <bank#> " rather than banksel. That's just a personal way to remind me of what bank I am in. Eventually, it becomes almost automatic.