Переместить значение по адресу назначения (семейство 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, но могут потребовать, чтобы для определенных регистров был установлен определенный способ включения этого.

Другие вопросы по тегам