Не работает как предполагается. Никогда ей особо не интересовался и не пользовался (типа, зачем она нужна), думал что это просто аналог 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
Мне кажется ненормальным городить такой огород. Может, я чего-то не понял, и есть более очевидный способ. Или нет?