Например TDA7294

Форум РадиоКот • Просмотр темы - Ассемблер 8051. Инструкция mov A, @A+PC
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт апр 19, 2024 03:36:24

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Ассемблер 8051. Инструкция mov A, @A+PC
СообщениеДобавлено: Чт авг 20, 2020 00:56:15 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Вс окт 20, 2019 13:03:56
Сообщений: 227
Рейтинг сообщения: 0
Не работает как предполагается. Никогда ей особо не интересовался и не пользовался (типа, зачем она нужна), думал что это просто аналог mov A, @A+DPTR, но с укороченной, 8-битной адресацией. Но щас вот решил попробовать, и получилась ерунда. Написал программку чтоб проверить:
Код:
   org   0
data0   equ   0x20
lenght   equ   strend-string

main:   mov   R0, #data0
      mov   R1, #string
      mov   R7, #lenght
loop:  clr   A
      mov   A, R1
      movc   A, @A+PC
      mov   @R0, A
      inc   R0
      inc   R1
      djnz   R7, loop
      sjmp   $

string:   db   'Hello World'
strend:
      end

Программа копирует строку из памяти программ, и помещает в оперативную память. Но, при прошагивании в отладчике, инструкция берет только два последних символа в строке. Понятно, что неправильное смещение, понятно что с момента когда я положил адрес строки в регистр и до этой инструкции, программный счетчик успел насчитать. Но зачем тогда эта инструкция, если она всегда неправильно работает?
Я нашел два плохих решения - посмотреть в листинге что там натранслировалось, и откорректировать часть адреса которая в A, второе - заставить ассемблер считать "коэффициент коррекции": Добавлена метка после MOVC, а в регистр R1 кладется результат выражения, составленного из меток. Так заработало.
Код:
   org   0
data0   equ   0x20
lenght   equ   strend-string

main:   mov   R0, #data0
      mov   R1, #string-movc_a-main
      mov   R7, #lenght
loop:   clr   A
      mov   A, R1
      movc   A, @A+PC
movc_a:   mov   @R0, A
      inc   R0
      inc   R1
      djnz   R7, loop
      sjmp   $

string:   db   'Hello World'
strend:
      end

Мне кажется ненормальным городить такой огород. Может, я чего-то не понял, и есть более очевидный способ. Или нет?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер 8051. Инструкция mov A, @A+PC
СообщениеДобавлено: Чт авг 20, 2020 01:27:54 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 607
Зарегистрирован: Ср дек 24, 2008 09:58:58
Сообщений: 3715
Рейтинг сообщения: 0
Медали: 3
Мявтор 1-й степени (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
Цитата:
зачем тогда эта инструкция, если она всегда неправильно работает?
Инструкция работает всегда правильно, просто для Вашей цели первый вариант кода был неправильный. Но Вы уже сами нашли выход N2, который мне совсем не кажется огородом. См. здесь пример использования этой инструкции для организации lookup-table.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер 8051. Инструкция mov A, @A+PC
СообщениеДобавлено: Чт авг 20, 2020 08:53:57 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14056
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
MOVC a,@a+PC штука довольно редкоиспользуемая.
Собственно предназначена для разных перекодировок по содержимому аккумулятора.
Однако имеет хитрости применения, связанные с содержимым А и РС на момент исполнения...
Ибо за самой командой обычно следует или RET или SJMP rel (ajmp addr, ljmp addr)- иначе слопаем изменение содержимого аккумулятора и покатимся далее по счетчику адресов.
А при А=0 начало таблицы есть адрес следующего байта за MOVC a,@a+PC...
Т.е.
один из вариантов применения:
Код:
..........
inc a ; соответствующая длине команды после movc a,@a+pc корректировка содержимого А
movc a,@a+pc
point_zero: ret ; sjmp rel, ajmp addr, ljmp addr
                      ; это точка продолжения исполнения программы в любом случае и
                      ; точка размещения возвращаемых в аккумулятор данных при А=0
                      ; без внесения предварительного  дополнительного поправочного коэффициента
table:
................

Обычно оформляется или в виде подпрограммы acell prog --- ret или завершается командой перехода при соответствующей предварительной коррекции содержимого А перед исполнением movc a,@a+pc (когда применяем sjmp rel, ajmp addr, ljmp addr)
8)

Чуть не забыл самую вкусняшку:
Код:
.........
inc a ;
movc a,@a+pc
point_zero: JMP @A+DPTR ;
table:
................

:wink:


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y