51单片机的五类指令(一)——数据传送类指令

发布于:2025-03-31 ⋅ 阅读:(19) ⋅ 点赞:(0)

目录

一、内部数据存储器(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。


网站公告

今日签到

点亮在社区的每一天
去签到