MOVX A,@Ri
MOVX @Ri,A
MOVX A,@DPTR
MOVX @DPTR,A
阐明:
1)在51系列单片机中,唯一与外部存储器RAM打交道的是A累加器。 所有需要传输到外部RAM的数据都必须通过A发送,所有需要读取外部RAM中的数据也必须通过A读取。这里我们可以看到内部RAM和外部RAM的区别。 数据可以在内部 RAM 之间直接传输,但不能在外部 RAM 之间传输。 例如,要将外部 RAM 中的某个单元(设置为 0100H 单元的数据)发送到另一个单元(设置为 0200H 单元),也必须先将 0100H 单元的内容读入 A,然后再传输到单元0200H。
要读取或写入外部 RAM,当然还必须知道 RAM 地址。 在最后两条微控制器指令中,地址直接放在DPTR中。 至于前两条指令,由于Ri(即R0或R1)只是一个8位寄存器,因此只提供了低8位地址。 因为有时扩展的外部RAM数量比较少,小于等于256个,所以只需要提供8位地址即可。
使用时,应先将要读写的地址发送到DPTR或Ri中,然后再使用读写命令。
举例:将单片机外部RAM 中100H 单元的内容发送到外部RAM 中200H 单元。
MOV DPTR,#0100H
MOVX A,@DPTR
MOV DPTR,#0200H
MOVX @DPTR,A
程序存储器将指令传送到累加器A
MOVC A, @A+DPTR 该指令是将ROM中的数字发送给A。该指令也称为单片机查表指令。 该指令通常用于检查 ROM 中已准备好的表描述:
该指令引入了一种新的寻址方法:变址寻址。 该指令是在ROM的地址单元中查找数据。 显然,必须知道该单元的地址。 该单元的地址确定如下:执行该指令时,DPTR 中有一个数字,A 中有一个数字。 Execute 执行该指令时,将 A 和 DPTR 中的数字相加,即成为要查找的单元的地址。
查找到的结果放在A 中。因此,该指令执行前后A 中的值不一定相同。
例:R0中有一个数字,要求查表确定其平方值(该数字的取值范围为0-5)
MOV DPTR,#TABLE
MOV A,R0
MOVC A,@A+DPTR
表:DB 0,1,4,9,16,25
假设R0中的值为2并发送到A,DPTR中的值为TABLE。 那么最终ROM单元的地址就是TABLE+2。 就是你去这个单位取数的时候,得到的是4.,显然正好是2的平方。 其他数据也可类推。
标签的真正含义:从这个地方也可以看出另一个问题。 我们用标签来代替具体的单位地址。 事实上,标签的真正含义是地址值。 这里代表ROM中存储的数据0、1、4、9、16、25的起始位置。 在我们之前学过的LCALL DELAY单片机指令中,DELAY代表的是ROM中存储的标有DELAY的程序的起始地址。 其实CPU就是通过这个地址找到这个程序的。
您可以通过以下例程查看标签的含义:
MOV DPTR,#100H
MOV A,R0
MOVC A,@A+DPTR
组织0100H。
数据库0,1,4,9,16,25
如果R0中的值为2,则最终地址为100H+2,即102H和在单元格102H中找到的4。 你能明白这一点吗?