вот ещё простые примеры
 :arrow: 
;Сложение 1-байтных чисел
	#include <p16f84.inc>	;Включаемый файл
	__config	b'11111111110001'	;Конфигурация
	org	0		;Вектор сброса
	clrf	PCLATH		;
	bcf	STATUS,RP1	;
	bcf	STATUS,RP0	;установка банка №0
	goto	start
	org	4		;Вектор прерывания
	goto	start		;
	;Определение констант
S1	equ	d'200'	;1-е слагаемое
S2	equ	d'100'	;2-е слагаемое
	
	;Определение переменных
	;)присвоение имён двум РОН:
RESULT	equ	0ch	;Переменная для хранения результата
CARRY	equ	0dh	;Переменная для хранения переноса
start	movlw	S1	;Сложение S1 и S2
	addlw	S2	;	)флаг переноса изменён:.
	movwf	RESULT	;Сохранение результата, оно
			;	не влияет на флаг переноса.
	btfss	STATUS,C	;Бит переноса установлен? –
	goto	no_car	;	–нет{ 	Перейти на метку no_car.
	clrf	CARRY	;	–да{ 	Запись единицы
	incf	CARRY,F	;		в CARRY.
	goto	end_prog	;Переход на конец программы.
no_car	clrf	CARRY	;Запись нуля в CARRY.
end_prog	nop		;Конец программы.
	end
 :arrow: 
;Умножение 1-байтных чисел)результат - 2 байта:
	#include <p16f84.inc>	;Включаемый файл
	__config	b'11111111110001'	;Конфигурация
	org	0		;Вектор сброса
	clrf	PCLATH
	bcf	STATUS,RP1	;
	bcf	STATUS,RP0	;установка банка №0
	goto	start
	org	4	;Вектор прерывания
	goto	start	;
	;Определение констант
number1	equ	d'100'	;1-й множитель
number2	equ	d'3'	;2-й множитель
	;Определение переменных
	cblock	00ch	;Блок переменных
N1	;1-й множитель	 )адрес=00ch:
N2	;2-й множитель	 )адрес=00ch+1 , т.е. 00dh:
RES_L	;Младший байт результата )адрес=00ch+2 , т.е. 00eh:
RES_H	;Старший байт результата )адрес=00ch+3 , т.е. 00fh:
	endc		;Завершение блока переменных
start	movlw	number1	;Запись 
	movwf	N1	;констант
	movlw	number2	;в
	movwf	N2	;ОЗУ.
	clrf	RES_L	;Очистка регистров
	clrf	RES_H	; хранения результата.
	incf	N1,F	;Для правильной работы алгоритма.
	;Основной цикл
loop	decf	N1,F	;Уменьшение N1.
	btfsc	STATUS,Z	;Если N1 стал = 0,
	goto	end_prog	;	то конец умножения
	movf	N2,W	;Складываем N2 
	addwf	RES_L,W	;	с младшим байтом результата 
	movwf	RES_L	;
	btfsc	STATUS,C	;Если был перенос,
	incf	RES_H,F	;	то увеличиваем старший байт результата на 1
	goto	loop	;
end_prog	nop
	end
 :arrow: 
;Работа с портами
	#include <p16f84.inc>
	__config	b'11111111110001'
	org	0	;Вектор сброса
	clrf	PCLATH
	bcf	STATUS,RP1	;
	bcf	STATUS,RP0	;установка банка №0
	goto	start
	org	4	;Вектор прерывания
	goto	start	;
			
start	bsf	STATUS,RP0	;установка банка №1
	movlw	b'00000000'	;Настройка
	movwf	TRISA		;портов.
	movlw	b'00011111'	;
	movwf	TRISB		;
	bcf	STATUS,RP0	;установка банка №0
loop	movf	PORTB,W	;Чтение из PORTB.
	movwf	PORTA	;Запись в PORTA.
	goto	loop	;
	end
 :arrow: 
есть хитрый способ организовать небольшую табличку с помощью RETLW,
	org	5
read_array
	clrf	PCLATH	
	addwf	PCL,F
	retlw	0x23
	retlw	0x45
	retlw	0xFF
	retlw	0xAA
	retlw	0x17
	retlw	0x2D
	retlw	0x2D
label1	retlw	0x6A
	retlw	0x76
	retlw	0x88
или то же самое
	org	5
read_array;подпрограмма чтения из массива
	;   Вход{ W= номер элемента.
	;  Выход{ W= значение элемента.
	clrf	PCLATH	
	addwf	PCL,F
	dt	23, 45, 0ffh, 0xaa	;шестнадцатеричные константы
	dt	.23, .45, d’45’	;десятичные константы
label1	dt	33+.55, .33+55, 33+55,	;смешанные константы
главное тут - чтобы массив не оказался в разных страницах - иначе в PCLATH будет указана не та страница. Поэтому в данном примере массив расположен в самом начале программы - тогда (так как он недлинный) гарантированно он окажется в нулевой странице - и мы просто очищаем PCLATH  (clrf PCLATH) перед тем как перейти на строку с адресом, загружаемым  в PCL.