目录
一、内部数据存储器(RAM)传送指令
1、以累加器 A 为目的操作数的指令
2、以寄存器 Rn 为目的操作数的指令
3、以直接地址为目的操作数的指令
二、外部数据存储器(RAM)传送指令
1、读外部数据存储器指令
2、写外部数据存储器指令
三、程序存储器传送指令
四、数据交换指令
1、字节交换指令
2、半字节交换指令
五、堆栈操作指令
1、进栈指令
2、出栈指令
单片中寻址是为了找到操作数,而各类指令则是为了对操作数进行操作。本篇文章将介绍51单片机中的第一类指令 —— 数据传送类指令。
51 单片机的数据传送类指令是汇编语言编程里极为重要的一类指令,其主要功能是把数据从源地址传送到目的地址。下面将详细介绍常见的数据传送类指令。
一、内部数据存储器(RAM)传送指令
这类指令的操作码都是mov,即move,意为移动。在此引申为传送。
mov 的指令格式是:mov 目的操作数 源操作数。源操作数可以是:A、Rn、@Ri、direct、#date;目的操作数可以是:A、Rn、@Ri、direct。
它的作用是将源操作数的内容传送到目的操作数。
1、以累加器 A 为目的操作数的指令
这类指令会把源操作数传送到累加器 A 中。
MOV A, Rn ; 将寄存器Rn中的数据传送到累加器A,n = 0 - 7
MOV A, direct ; 将直接地址单元中的数据传送到累加器A
MOV A, @Ri ; 将以Ri内容为地址的内部RAM单元中的数据传送到累加器A,i = 0, 1
MOV A, #data ; 将立即数data传送到累加器A
示例:
MOV R0, #30H ; 将立即数30H传送到寄存器R0
MOV A, R0 ; 将寄存器R0中的数据(30H)传送到累加器A
2、以寄存器 Rn 为目的操作数的指令
这类指令会把源操作数传送到寄存器Rn中。
MOV Rn, A ; 将累加器A中的数据传送到寄存器Rn,n = 0 - 7
MOV Rn, direct ; 将直接地址单元中的数据传送到寄存器Rn
MOV Rn, #data ; 将立即数data传送到寄存器Rn
示例:
MOV A, #20H ; 将立即数20H传送到累加器A
MOV R1, A ; 将累加器A中的数据(20H)传送到寄存器R1
3、以直接地址为目的操作数的指令
这类指令会把源操作数传送到直接地址单元中。
MOV direct, A ; 将累加器A中的数据传送到直接地址单元
MOV direct, Rn ; 将寄存器Rn中的数据传送到直接地址单元
MOV direct1, direct2 ; 将直接地址单元direct2中的数据传送到直接地址单元direct1
MOV direct, @Ri ; 将以Ri内容为地址的内部RAM单元中的数据传送到直接地址单元
MOV direct, #data ; 将立即数data传送到直接地址单元
示例:
MOV A, #40H ; 将立即数40H传送到累加器A
MOV 30H, A ; 将累加器A中的数据(40H)传送到内部RAM的30H单元
4、以间接地址为目的操作数的指令
这类指令会把源操作数传送到以 Ri 内容为地址的内部 RAM 单元中。
MOV @Ri, A ; 将累加器A中的数据传送到以Ri内容为地址的内部RAM单元
MOV @Ri, direct ; 将直接地址单元中的数据传送到以Ri内容为地址的内部RAM单元
MOV @Ri, #data ; 将立即数data传送到以Ri内容为地址的内部RAM单元
示例:
MOV R0, #30H ; 将立即数30H传送到寄存器R0
MOV A, #50H ; 将立即数50H传送到累加器A
MOV @R0, A ; 将累加器A中的数据(50H)传送到内部RAM的30H单元
二、外部数据存储器(RAM)传送指令
MOVX表示访问的是片外RAM/I/O端口。
DPTR是指针,所以@DPTR表示寄存器间接寻址,DPTR 表示的是操作数的指针,通过这个指针找到数据;如果操作数直接是DPTR,并对其赋值,则指针DPTR指向的地址就是这个值。
即对@DPTR操作,改变的是指针指向内存单元的数的大小;对DPTR进行操作,改变的是指针的值,即其指向的地址。
1、读外部数据存储器指令
MOVX A, @DPTR ; 将以DPTR内容为地址的外部RAM单元中的数据传送到累加器A
MOVX A, @Ri ; 将以Ri内容为低8位地址(P0口输出),P2口输出高8位地址的外部RAM单元中的数据传送到累加器A
示例:
MOV DPTR, #1000H ; 将立即数1000H传送到数据指针DPTR
MOVX A, @DPTR ; 将外部RAM的1000H单元中的数据传送到累加器A
2、写外部数据存储器指令
MOVX @DPTR, A ; 将累加器A中的数据传送到以DPTR内容为地址的外部RAM单元
MOVX @Ri, A ; 将累加器A中的数据传送到以Ri内容为低8位地址(P0口输出),P2口输出高8位地址的外部RAM单元
示例:
MOV DPTR, #2000H ; 将立即数2000H传送到数据指针DPTR
MOV A, #60H ; 将立即数60H传送到累加器A
MOVX @DPTR, A ; 将累加器A中的数据(60H)传送到外部RAM的2000H单元
三、程序存储器传送指令
这类指令用于读取程序存储器中的数据表格。
MOVC A, @A+DPTR ; 将以A+DPTR内容为地址的程序存储器单元中的数据传送到累加器A
MOVC A, @A+PC ; 将以A+PC内容为地址的程序存储器单元中的数据传送到累加器A
示例:
MOV DPTR, #TABLE ; 将表格首地址TABLE传送到数据指针DPTR
MOV A, #0 ; 将立即数0传送到累加器A
MOVC A, @A+DPTR ; 将程序存储器中TABLE+0单元的数据传送到累加器A
TABLE: DB 10H, 20H, 30H ; 定义一个数据表格
四、数据交换指令
XCH很简单,就是进行两个操作数之间的数据交换。XCHD则是进行两个操作数之间,低4位的数据交换。
1、字节交换指令
XCH A, Rn ; 将累加器A中的数据与寄存器Rn中的数据交换
XCH A, direct ; 将累加器A中的数据与直接地址单元中的数据交换
XCH A, @Ri ; 将累加器A中的数据与以Ri内容为地址的内部RAM单元中的数据交换
示例:
MOV A, #70H ; 将立即数70H传送到累加器A
MOV R2, #80H ; 将立即数80H传送到寄存器R2
XCH A, R2 ; 交换累加器A和寄存器R2中的数据
2、半字节交换指令
XCHD A, @Ri ; 将累加器A的低4位与以Ri内容为地址的内部RAM单元的低4位交换
示例:
MOV R0, #30H ; 将立即数30H传送到寄存器R0
MOV A, #12H ; 将立即数12H传送到累加器A
MOV @R0, #34H ; 将立即数34H传送到内部RAM的30H单元
XCHD A, @R0 ; 交换累加器A和内部RAM 30H单元的低4位
五、堆栈操作指令
1、进栈指令
(1)指令格式:PUSH direct
(2)功能:先将堆栈指针 SP 的值加 1,然后把直接地址单元(direct)中的数据传送到 SP 所指向的堆栈单元中。
(3)示例代码:
MOV SP, #60H ; 设置堆栈指针SP为60H
MOV A, #90H ; 将立即数90H传送到累加器A
PUSH ACC ; 将累加器A中的数据压入堆栈
(4)代码解释
① MOV SP, #60H:将堆栈指针 SP 初始化为60H,意味着堆栈从60H地址开始。
② MOV A, #90H:把立即数90H传送到累加器 A。
③ PUSH ACC:执行进栈操作,先将 SP 的值加 1,变为61H,然后将累加器 A 中的90H传送到61H单元。
2、出栈指令
(1)指令格式:POP direct
(2)功能:先把 SP 所指向的堆栈单元中的数据传送到直接地址单元(direct)中,然后将堆栈指针 SP 的值减 1。
(3)示例代码:(需结合进栈指令的代码)
POP ACC ; 将堆栈顶部的数据弹出到累加器A
(4)代码解释
假设执行此指令前,SP 指向61H单元,且该单元存储的数据为90H。执行POP ACC后,会将61H单元中的90H传送到累加器 A,然后 SP 的值减 1,变为60H。