### 51汇编指令详解
#### 汇编指令基础概念
在开始介绍具体的51系列微控制器的汇编指令之前,我们首先需要了解一些基本的概念和术语:
- **Rn**: 表示当前寄存器组中的8个工作寄存器R0到R7。
- **Ri**: 表示当前寄存器组中的R0或R1,常被用作地址指针或间接寻址寄存器。
- **@**: 作为间接寻址的前缀,例如`@Ri`表示通过Ri寄存器间接寻址内存单元。
- **Direct**: 指的是8位内部数据存储单元的地址,可以是内部RAM的0-127地址,也可以是指特殊功能寄存器(SFR)的地址(128-255)。
- **A**: 累加器ACC,用于大多数算术和逻辑运算。
- **B**: 特殊功能寄存器,主要用于乘法和除法指令。
- **C**: 进位位Cy,在加法和减法等运算中使用。
- **#data**: 包含在指令中的8位立即数。如果采用十六进制表示,则以“H”结尾;若采用十进制则直接给出数值。
- **#data16**: 包含在指令中的16位立即数。
- **Addr16**: 16位的目标地址,用于`LCALL`和`LJMP`指令,覆盖整个64KB的地址空间。
- **Addr11**: 11位的目标地址,用于`ACALL`和`AJMP`指令,要求目标地址与下一条指令在同一页面内。
- **Rel**: 8位带符号的相对偏移量,用于`SJMP`和其他条件转移指令,取值范围-128到+127。
- **DPTR**: 数据指针,一个16位的地址寄存器,通常用于外部RAM的访问。
- **/**: 用于表示对位进行非运算。
- **Bit**: 表示内部可寻址位或特殊功能寄存器中的位。
- **`(x)`**: 表示寄存器或地址单元中的内容。
- **`((x))`**: 表示由x间接寻址的单元中的内容。
- **`←`**: 表示将箭头右侧的内容传送到箭头左侧的位置。
- **`$`**: 当前指令的地址。
#### 内部数据传送指令
1. **以累加器A为目的的传送指令**:
- `MOVA,#data`: `(A)←data`,即将立即数data传送到累加器A中。
- `MOVA,direct`: `(A)←(direct)`,即将直接地址direct所指向的内存单元的数据传送到A中。
- `MOVA,Rn`: `(A)←(Rn)`,即将寄存器Rn中的数据传送到A中。
- `MOVA,@Ri`: `(A)←((Ri))`,即将通过寄存器Ri间接寻址的内存单元中的数据传送到A中。
2. **以通用寄存器Rn为目的的传送指令**:
- `MOVRn,A`: `(Rn)←(A)`,即将A中的数据传送到寄存器Rn中。
- `MOVRn,direct`: `(Rn)←(direct)`,即将直接地址direct所指向的内存单元的数据传送到Rn中。
- `MOVRn,#data`: `(Rn)←data`,即将立即数data传送到寄存器Rn中。
3. **以直接地址为目的的传送指令**:
- `MOVdirect,A`: `(direct)←(A)`,即将A中的数据传送到直接地址direct所指向的内存单元中。
- `MOVdirect,Rn`: `(direct)←(Rn)`,即将Rn中的数据传送到直接地址direct所指向的内存单元中。
- `MOVdirect,direct2`: `(direct)←(direct2)`,即将直接地址direct2所指向的内存单元中的数据传送到直接地址direct所指向的内存单元中。
4. **以寄存器间接地址为目的的传送指令**:
- `MOV@Ri,A`: `((Ri))←(A)`,即将A中的数据传送到通过寄存器Ri间接寻址的内存单元中。
- `MOV@Ri,direct`: `((Ri))←(direct)`,即将直接地址direct所指向的内存单元中的数据传送到通过寄存器Ri间接寻址的内存单元中。
- `MOV@Ri,#data`: `((Ri))←data`,即将立即数data传送到通过寄存器Ri间接寻址的内存单元中。
#### 数据指针赋值指令
- `MOVDPTR,#data16`: 将16位立即数data16传送到DPTR中,用于外部RAM访问。
#### 片外数据传送指令
- `MOVXA,@Ri`: `(A)←((Ri))`,从外部RAM读取数据到A中。
- `MOVXA,@DPTR`: `(A)←((DPTR))`,从外部RAM读取数据到A中。
- `MOVX@Ri,A`: `((Ri))←(A)`,将A中的数据写入外部RAM中。
- `MOVX@DPTR,A`: `((DPTR))←(A)`,将A中的数据写入外部RAM中。
#### ROM数据访问指令
- `MOVCA,@A+DPTR`: `(A)←((A)+(DPTR))`,从程序存储器中读取数据到A中。
- `MOVCA,@A+PC`: `(A)←((A)+(PC))`,从程序存储器中读取数据到A中,并使程序计数器PC自增。
#### 堆栈操作指令
- `PUSHdirect`: `(SP)←(SP)+1,(SP)←(direct)`,将数据压入堆栈。
- `POPdirect`: `(direct)←(SP),(SP)←(SP)-1`,从堆栈弹出数据。
#### 数据交换指令
1. **整字节(8位)交换指令**:
- `XCHA,Rn`: A和Rn中的数互换。
- `XCHA,direct`: A和direct单元中的数互换。
- `XCHA,@Ri`: A和Ri间址单元中的数互换。
2. **半字节交换指令**:
- `XCHDA,@Ri`: A的低4位与Ri间接单元的低4位互换,高4位保持不变。
3. **累加器高低半字节交换指令**:
- `SWAPA`: A的高4位(D7~D4)和低4位(D3~D0)互换。
#### 加法指令
1. **不带Cy加法指令**:
- `ADDA,Rn`: `(A)←(A)+(Rn)`。
- `ADDA,direct`: `(A)←(A)+(direct)`。
- `ADDA,@Ri`: `(A)←(A)+((Ri))`。
- `ADDA,#data`: `(A)←(A)+data`。
2. **带进位加法指令**:
- `ADDCA,Rn`: `(A)←(A)+Cy+(Rn)`。
- `ADDCA,direct`: `(A)←(A)+Cy+(direct)`。
- `ADDCA,@Ri`: `(A)←(A)+Cy+((Ri))`。
- `ADDCA,#data`: `(A)←(A)+Cy+data`。
3. **加1指令**:
- `INCA`: `(A)←(A)+1`。
- `INCRn`: `(Rn)←(Rn)+1`。
这些指令构成了8051系列微控制器的基础,掌握它们对于学习和开发基于8051的嵌入式系统至关重要。通过理解这些指令的功能和用法,开发者可以有效地利用8051微控制器来实现各种复杂的任务。