Jump to content

    

про PCLATH вопрос

Я в курсе. Речь шла о Вашем упоминании.

Share this post


Link to post
Share on other sites

Спасибо, друзья , за ценные замечания !

всё-таки один момент мне не стал понятнее,

как по команде ADDWF PCL программа перейдет на нужную RETLW, если при

выполнении ADDWF произойдет запись в PCH из PCLATH, в котором адресный байт другого сегмента. ?

При выполнении команды RETLW в таблице, возврат произойдет БЕЗ ПРИВЯЗКИ К PCLATH,

в том то и дело , что до RETLW не доходим, а срываемся в другой сегмент.

вот собственно хребет , который всё наглядно может продемонстрировать

#include <p18f2550.inc>

org 0

goto start

nop

nop

nop

nop

 

org 0x20

start

call module

 

org 0x100

table

addwf PCL,1,0

retlw 0x50

retlw 0xde

retlw 0x62

retlw 0xc2

retlw 0xcc

retlw 0xc1

 

module

movlw 0x06

call table

nop

nop

END

после addwf программа перепрыгивает на выделенный жирным nop ,

а не возвращается в module.

Share this post


Link to post
Share on other sites
после addwf программа перепрыгивает на выделенный жирным nop
В PCLATH - ноль (а в реале может быть любое число, поскольку нет инициализации регистра), вот он и подставляется в старший байт адреса.

Что ж тут непонятного?

Вставьте перед movlw

            mowlw  high table
            movwf  PCLATH,0

И попадёте куда нужно.

P.S.: Только конструкция всё-равно кривая.

И для записи листинга программы на форуме пользуйтесь тэгом code (см. кнопочки вверху окна сообщения).

 

 

Share this post


Link to post
Share on other sites

спасибо! вопросы остаются, но свернём тему , чтоб по второму кругу не начинать.

Share this post


Link to post
Share on other sites
вопросы остаются

Smenв смежной теме Вы предложили вернуться к PCLATH.

Кстати вопрос у меня остался такой

в Вашем коде

            movlw  high table
            movwf  PCLATH,0

используются две команды, кроме того ещё задействован регистр W, который должен передавать в таблицу

вектор перехода, соответственно нужно предусматривать дополнительные манипуляции с W.

В коде

            movff tosh,pclath
            addwf pcl,1,0

не нахожу ничего такого, чем бы он уступал Вашему .

Share this post


Link to post
Share on other sites
Вы предложили вернуться к PCLATH
Возвращаться я не предлагал, мне просто показалась несколько странной последовательность Ваших действий. :rolleyes:

 

не нахожу ничего такого, чем бы он уступал Вашему
Команда movff занимает два МЦ и два слова памяти программ, ровно столько же, сколько и в/у две команды (читайте уже наконец даташит), так что с точки зрения времени выполнения/размера обе конструкции одинаковы.

А вот относительно логики. :rolleyes:

В моей последовательности загружается адрес таблицы, а в Вашей, указатель стека. Разницу чувствуете?

Насчёт волнений по поводу аккумулятора, вообще не понятно. На то он и аккумулятор, что б его активно использовать.

У Вас следом пойдёт ещё одна movlw, так какая разница, что там в аккумуляторе будет находиться?

 

Share this post


Link to post
Share on other sites
Команда movff занимает два МЦ

да, но я имел ввиду краткость кода при том же времени исполнения, к тому же оставляю за скобками команды,

которые нужно внедрить для манипуляций с аккумулятором.

 

 

 

В моей последовательности загружается адрес таблицы, а в Вашей, указатель стека. Разницу чувствуете?

Извините, здесь, должен признаться, не чувствую разницы. Был бы признателен за разъяснения

 

 

и мне кажется в этом контексте уместней говорить не "загружается", а читается

Share this post


Link to post
Share on other sites
я имел ввиду краткость кода
Если Вы имеете ввиду про то, что в/у команда пишется в одну строчку, так какая разница, будет в программе 3000 строк, или 3001? :rolleyes:

Вообще, говорить о краткости листинга, используя АСМ как-то стрёмно. Переходите уж тогда на СИ.

 

Про "команды, которые нужно внедрить для манипуляций с аккумулятором" я что-то вообще не понял.

Что Вы там ещё внедрять хотите? Кроме в/у двух команд ничего не требуется.

 

Кстати, Ваши двойные вызовы ПП вовсе не сокращают листинг, да вдобавок ещё и стэк забивают, а ведь он не резиновый.

 

 

не чувствую разницы
Это очень плохо. Попробую ещё раз пояснить.

В PCLATH необходимо загрузить (именно "загрузить") адрес "таблицы переходов".

В моём примере он туда и загружается, а в Вашем в него загружается указатель вершины стэка, в котором оказывается нужное значение.

Сейчас это сработало, но когда-нибудь может в указателе оказаться совсем не то, что нужно, а вот адрес таблицы всегда останется адресом.

Я уже молчу о совместимости кода с другими семействами.

И если Вы возразите, что никуда его переносить не собираетесь, то я отвечу, что тогда Вам вообще нужно использовать команды табличного чтения.

Share this post


Link to post
Share on other sites

спасибо Smen

приятно получить развернутый ответ с изложением тонких мест.

Share this post


Link to post
Share on other sites
приятно получить

Чуть добавлю.

Смысл команды movff совсем не в краткости записи. Эта команда, не модифицирует контекст (аккумулятор и флаги состояния АЛУ). И именно в таком качестве ее следует применять. Если аккумулятор и флаги могут быть произвольно изменены, то нет никакого практического смысла в применении movff.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now