|
про PCLATH вопрос |
|
|
|
Aug 22 2018, 16:08
|
Участник
Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792
|
Спасибо, друзья , за ценные замечания ! всё-таки один момент мне не стал понятнее, как по команде ADDWF PCL программа перейдет на нужную RETLW, если при выполнении ADDWF произойдет запись в PCH из PCLATH, в котором адресный байт другого сегмента. ? Цитата(Марк_Я @ Aug 18 2018, 13:40) При выполнении команды 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.
|
|
|
|
|
Aug 23 2018, 10:26
|
Местный
Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081
|
Цитата(balk @ Aug 22 2018, 21:08) после addwf программа перепрыгивает на выделенный жирным nop В PCLATH - ноль (а в реале может быть любое число, поскольку нет инициализации регистра), вот он и подставляется в старший байт адреса. Что ж тут непонятного? Вставьте перед movlw Код mowlw high table movwf PCLATH,0 И попадёте куда нужно. P.S.: Только конструкция всё-равно кривая. И для записи листинга программы на форуме пользуйтесь тэгом code (см. кнопочки вверху окна сообщения).
|
|
|
|
|
Aug 27 2018, 13:06
|
Участник
Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792
|
спасибо! вопросы остаются, но свернём тему , чтоб по второму кругу не начинать.
|
|
|
|
|
Aug 28 2018, 12:51
|
Участник
Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792
|
Цитата(balk @ Aug 27 2018, 17:06) вопросы остаются Smenв смежной теме Вы предложили вернуться к PCLATH. Кстати вопрос у меня остался такой в Вашем коде Код movlw high table movwf PCLATH,0 используются две команды, кроме того ещё задействован регистр W, который должен передавать в таблицу вектор перехода, соответственно нужно предусматривать дополнительные манипуляции с W. В коде Код movff tosh,pclath addwf pcl,1,0 не нахожу ничего такого, чем бы он уступал Вашему .
|
|
|
|
|
Aug 28 2018, 13:12
|
Местный
Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081
|
Цитата(balk @ Aug 28 2018, 16:51) Вы предложили вернуться к PCLATH Возвращаться я не предлагал, мне просто показалась несколько странной последовательность Ваших действий. Цитата(balk @ Aug 28 2018, 16:51) не нахожу ничего такого, чем бы он уступал Вашему Команда movff занимает два МЦ и два слова памяти программ, ровно столько же, сколько и в/у две команды (читайте уже наконец даташит), так что с точки зрения времени выполнения/размера обе конструкции одинаковы. А вот относительно логики. В моей последовательности загружается адрес таблицы, а в Вашей, указатель стека. Разницу чувствуете? Насчёт волнений по поводу аккумулятора, вообще не понятно. На то он и аккумулятор, что б его активно использовать. У Вас следом пойдёт ещё одна movlw, так какая разница, что там в аккумуляторе будет находиться?
|
|
|
|
|
Aug 28 2018, 13:36
|
Участник
Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792
|
Цитата(Smen @ Aug 28 2018, 17:12) Команда movff занимает два МЦ да, но я имел ввиду краткость кода при том же времени исполнения, к тому же оставляю за скобками команды, которые нужно внедрить для манипуляций с аккумулятором. Цитата(Smen @ Aug 28 2018, 17:12) В моей последовательности загружается адрес таблицы, а в Вашей, указатель стека. Разницу чувствуете? Извините, здесь, должен признаться, не чувствую разницы. Был бы признателен за разъяснения и мне кажется в этом контексте уместней говорить не "загружается", а читается
|
|
|
|
|
Aug 29 2018, 05:26
|
Местный
Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081
|
Цитата(balk @ Aug 28 2018, 18:36) я имел ввиду краткость кода Если Вы имеете ввиду про то, что в/у команда пишется в одну строчку, так какая разница, будет в программе 3000 строк, или 3001? Вообще, говорить о краткости листинга, используя АСМ как-то стрёмно. Переходите уж тогда на СИ. Про "команды, которые нужно внедрить для манипуляций с аккумулятором" я что-то вообще не понял. Что Вы там ещё внедрять хотите? Кроме в/у двух команд ничего не требуется. Кстати, Ваши двойные вызовы ПП вовсе не сокращают листинг, да вдобавок ещё и стэк забивают, а ведь он не резиновый. Цитата(balk @ Aug 28 2018, 18:36) не чувствую разницы Это очень плохо. Попробую ещё раз пояснить. В PCLATH необходимо загрузить (именно "загрузить") адрес "таблицы переходов". В моём примере он туда и загружается, а в Вашем в него загружается указатель вершины стэка, в котором оказывается нужное значение. Сейчас это сработало, но когда-нибудь может в указателе оказаться совсем не то, что нужно, а вот адрес таблицы всегда останется адресом. Я уже молчу о совместимости кода с другими семействами. И если Вы возразите, что никуда его переносить не собираетесь, то я отвечу, что тогда Вам вообще нужно использовать команды табличного чтения.
|
|
|
|
|
Aug 29 2018, 06:57
|
Участник
Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792
|
спасибо Smen приятно получить развернутый ответ с изложением тонких мест.
|
|
|
|
|
Aug 30 2018, 05:29
|
Частый гость
Группа: Свой
Сообщений: 178
Регистрация: 19-09-07
Из: М.О. г.Фрязино
Пользователь №: 30 656
|
Цитата(balk @ Aug 29 2018, 09:57) приятно получить Чуть добавлю. Смысл команды movff совсем не в краткости записи. Эта команда, не модифицирует контекст (аккумулятор и флаги состояния АЛУ). И именно в таком качестве ее следует применять. Если аккумулятор и флаги могут быть произвольно изменены, то нет никакого практического смысла в применении movff.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|