Перейти к содержанию
    

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

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

как по команде 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

            mowlw  high table
            movwf  PCLATH,0

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

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

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вопросы остаются

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

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

в Вашем коде

            movlw  high table
            movwf  PCLATH,0

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

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

В коде

            movff tosh,pclath
            addwf pcl,1,0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Команда movff занимает два МЦ

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

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

 

 

 

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

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

 

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

 

 

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

приятно получить

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...