将值移动到目标地址(C51系列)

时间:2015-06-02 00:11:13

标签: assembly 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;

for(;;)var + = 20;

1 个答案:

答案 0 :(得分:1)

通常,8x51微控制器不允许代码写入MOVC指令从中读取数据的地址空间。一些基于8x51的控制器或系统允许通过MOVX指令访问该空间,但可能要求某些寄存器以某种方式设置以启用它。