Код: Выделить всё
; ГРУППА КОМАНД ПРЕОБРАЗОВАНИЯ ДВОИЧНО-ДЕСЯТИЧНОГО КОДА В КОД 7-СЕГМЕНТНОГО ИНДИКАТОРА
TABLE
org 0x100
andlw 0x0F
addwf PC,F ; Содержимое счетчика команд PC увеличивается
; на величину содержимого аккумулятора W.
retlw b'00111111' ; ..FEDCBA = 0 Происходит скачек по таблице
retlw b'00000110' ; .....CB. = 1 на строку со значением,
retlw b'01011011' ; .G.ED.BA = 2 записанным в аккумуляторе,
retlw b'01001111' ; .G..DCBA = 3 и далее - возврат по стеку.
retlw b'01100110' ; .GF..CB. = 4
retlw b'01101101' ; .GF.DC.A = 5
retlw b'01111101' ; .GFEDC.A = 6
retlw b'00000111' ; .....CBA = 7
retlw b'01111111' ; .GFEDCBA = 8
retlw b'01101111' ; .GF.DCBA = 9
retlw 0
retlw 0
retlw 0
retlw 0
retlw 0
retlw 0
;**********************************************************************************************
end ; Конец программы.Чтобы не было проблем со стеком, каждому CALL должен следовать соответствующий RETURN (или RETLW), причем допускается не более 8 вложений подпрограмм.
В вашей программе, если вызвать ее со значением например, 10 (0x0A) в W, возврата из CALL'а не последует, стек будет нарушен, дальнейшее правильное выполнение программы будет невозможно.
По расположению таблицы в памяти программ: у PIC'ов (по меньшей мере, у 16-й серии) есть дебильная особенность архитектуры по части адресации памяти программ. Заключается она в том, что PC - это вовсе не PC как он есть, а только младший его байт PCL; Старший байт PCH напрямую юзеру недоступен; переполнение PCL при действиях с ним напрямую не вызовет приращение PCH. Пример:
Код: Выделить всё
org 0xFE
movlw 5
addwf PCL,F ; PC станет 0x0005, а не 0x0105, как казалось вначале