51单片机寻址方式有7种:立即数寻址、直接寻址、寄存器寻址、寄存器间接寻址、寄存器变址寻址、相对寻址、位寻址。
- PUSH DPTR;是错误的指令,因为PUSH后面只能是直接寻址,即PUSH dir;而DPTR只能用于寄存器寻址或寄存器间接寻址或变址寻址。
- 寄存器寻址只有SFR中的A、DPTR、B(仅乘除法指令)和Rn。SFR中除了A、DPTR、B(仅乘除法指令)为寄存器寻址,其余都为直接寻址,指令中可用寄存器名表示直接地址。
- A既能直接寻址,又能寄存器寻址,直接寻址时为ACC。B在乘除法指令中为寄存器寻址,其余为直接寻址。DPTR可用于寄存器寻址,也可作寄存器间接寻址和变址寻址,注意变址寻址只能对ROM寻址,读取ROM中的数据用MOVC指令。
- MOVX A,2000H;这样的指令是错误的,因为MOVX只能用R0或R1或DPTR作间址寄存器进行间接寻址。即P2 R0或P2 R1或DPTR来构成16位地址,无论使用哪种方式构造16位外部地址,最终都是由P0口输出低8位地址,P2口输出高8位地址。
- MOV 20H,@DPTR;这条指令是错误的,因为DPTR作为间址寄存器时只能对片外RAM(此时应使用MOVX)寻址。如MOVX A,@DPTR,若DPTR的值为0,也是将片外RAM地址为0的内存单元的内容传送给A。
- 能够用于寄存器间址的有:R0、R1、DPTR,前面需要加@。
- MOVC只有两种形式:MOVC A,@A+DPTR或MOVC A,@A+PC,另外注意对ROM只能读不能写。
- MOV R1,R2;这条指令是错误的,Rn之间不能通过MOV传送数据,自己给自己传送数据的只有MOV dir,dir。另外ADD A,A是错误的指令,只能ADD A,ACC;此时源操作数为直接寻址。
- MOVX必须将A作为其中的一个操作数。
- 以A为目的操作数,@Rn、dir、Rn、#data为源操作数的算术运算和按位运算有:ADD、ADDC(进位加)、SUBB(借位减,减指令有借位减)、ANL(按位与)、ORL(按位或)、XRL(按位异或)。
- 以dir为目的操作数,A、#data为源操作数的按位运算有:ANL、ORL、XRL
- INC(加1)指令的操作对象有:A、@Rn、dir、Rn、DPTR。
- DEC(减1)指令的操作对象有:A、@Rn、dir、Rn。
- CPL(取反)、CLR(清零)、移位(仅对A操作)等操作对象为A和位地址。