我创建了一个表,我有各种数据。 我需要从这个表中取出数据,改变它,然后把它写回到同一个位置,但是,由于某种原因,数据没有写到位置
这是我的代码
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;
for(;;)var + = 20;
答案 0 :(得分:1)
通常,8x51微控制器不允许代码写入MOVC指令从中读取数据的地址空间。一些基于8x51的控制器或系统允许通过MOVX指令访问该空间,但可能要求某些寄存器以某种方式设置以启用它。