Переместить значение по адресу назначения (семейство C51)
Я создал таблицу, где у меня есть различные данные. Мне нужно вынуть данные из этой таблицы, изменить их, а затем записать обратно в ту же позицию, однако по какой-то причине данные не записываются в позицию
Вот мой код
CSEG AT 3h
precos: DB 100, 200, 150, 170
Lookup:
MOV DPTR, #precos ; DPTR points to the start of the lookup table
MOV A, #0 ; A is the offset from the start of the lookup table
MOVC A, @A + DPTR ; Moves the (A+1)th item into the Accumulator
ADD A, #20
MOV R1, #precos
MOV @R1, A
JMP Lookup
Когда я перебираю код, A переходит от 0 до 100 к 120, затем он должен записать его по адресу 3 (позиция 0 из таблицы), вернуть его снова, добавить еще 20 и т. Д. Работает так:
A = 0 - first iteration
A = 100
A = 120
A = 0 - second iteration
A = 100
A = 120
etc
Что мне действительно нужно, так это способ получить доступ к позиции в памяти, изменить ее, а затем обновить. Это:
A = 0 - first iteration
A = 100
A = 120
A = 0 - second iteration
A = 120
A = 140
etc
Я читал различные материалы, но не смог найти ответ, который работает. Здесь, например, он показывает инструкции, но не дает примеров вывода: http://www.keil.com/support/man/docs/is51/is51_mov.htm
Изменить: мне не обязательно использовать именно таким образом. Мне просто нужен способ иметь переменную, как в C, и сделать что-то вроде этого:
int var = 100;
для (;;) var += 20;
1 ответ
В общем, микроконтроллеры 8x51 не позволяют писать код в адресное пространство, из которого инструкция MOVC считывает данные. Некоторые контроллеры или системы на основе 8x51 разрешают доступ к этому пространству с помощью инструкции MOVX, но могут потребовать, чтобы для определенных регистров был установлен определенный способ включения этого.