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

目录

一、内部数据存储器(RAM)传送指令

[1、以累加器 A 为目的操作数的指令](#1、以累加器 A 为目的操作数的指令)

[2、以寄存器 Rn 为目的操作数的指令](#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 中。

XML 复制代码
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

示例:

XML 复制代码
MOV R0, #30H   ; 将立即数30H传送到寄存器R0
MOV A, R0      ; 将寄存器R0中的数据(30H)传送到累加器A
2、以寄存器 Rn 为目的操作数的指令

这类指令会把源操作数传送到寄存器Rn中。

XML 复制代码
MOV Rn, A      ; 将累加器A中的数据传送到寄存器Rn,n = 0 - 7
MOV Rn, direct ; 将直接地址单元中的数据传送到寄存器Rn
MOV Rn, #data  ; 将立即数data传送到寄存器Rn

示例:

XML 复制代码
MOV A, #20H    ; 将立即数20H传送到累加器A
MOV R1, A      ; 将累加器A中的数据(20H)传送到寄存器R1
3、以直接地址为目的操作数的指令

这类指令会把源操作数传送到直接地址单元中。

XML 复制代码
MOV direct, A      ; 将累加器A中的数据传送到直接地址单元
MOV direct, Rn     ; 将寄存器Rn中的数据传送到直接地址单元
MOV direct1, direct2 ; 将直接地址单元direct2中的数据传送到直接地址单元direct1
MOV direct, @Ri    ; 将以Ri内容为地址的内部RAM单元中的数据传送到直接地址单元
MOV direct, #data  ; 将立即数data传送到直接地址单元

示例:

XML 复制代码
MOV A, #40H    ; 将立即数40H传送到累加器A
MOV 30H, A     ; 将累加器A中的数据(40H)传送到内部RAM的30H单元

4、以间接地址为目的操作数的指令

这类指令会把源操作数传送到以 Ri 内容为地址的内部 RAM 单元中。

XML 复制代码
MOV @Ri, A      ; 将累加器A中的数据传送到以Ri内容为地址的内部RAM单元
MOV @Ri, direct ; 将直接地址单元中的数据传送到以Ri内容为地址的内部RAM单元
MOV @Ri, #data  ; 将立即数data传送到以Ri内容为地址的内部RAM单元

示例:

XML 复制代码
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、读外部数据存储器指令
XML 复制代码
MOVX A, @DPTR ; 将以DPTR内容为地址的外部RAM单元中的数据传送到累加器A
MOVX A, @Ri   ; 将以Ri内容为低8位地址(P0口输出),P2口输出高8位地址的外部RAM单元中的数据传送到累加器A

示例:

XML 复制代码
MOV DPTR, #1000H ; 将立即数1000H传送到数据指针DPTR
MOVX A, @DPTR    ; 将外部RAM的1000H单元中的数据传送到累加器A
2、写外部数据存储器指令
XML 复制代码
MOVX @DPTR, A ; 将累加器A中的数据传送到以DPTR内容为地址的外部RAM单元
MOVX @Ri, A   ; 将累加器A中的数据传送到以Ri内容为低8位地址(P0口输出),P2口输出高8位地址的外部RAM单元

示例:

XML 复制代码
MOV DPTR, #2000H ; 将立即数2000H传送到数据指针DPTR
MOV A, #60H      ; 将立即数60H传送到累加器A
MOVX @DPTR, A    ; 将累加器A中的数据(60H)传送到外部RAM的2000H单元

三、程序存储器传送指令

这类指令用于读取程序存储器中的数据表格

XML 复制代码
MOVC A, @A+DPTR ; 将以A+DPTR内容为地址的程序存储器单元中的数据传送到累加器A
MOVC A, @A+PC   ; 将以A+PC内容为地址的程序存储器单元中的数据传送到累加器A

示例:

XML 复制代码
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、字节交换指令
XML 复制代码
XCH A, Rn      ; 将累加器A中的数据与寄存器Rn中的数据交换
XCH A, direct  ; 将累加器A中的数据与直接地址单元中的数据交换
XCH A, @Ri     ; 将累加器A中的数据与以Ri内容为地址的内部RAM单元中的数据交换

示例:

XML 复制代码
MOV A, #70H    ; 将立即数70H传送到累加器A
MOV R2, #80H   ; 将立即数80H传送到寄存器R2
XCH A, R2      ; 交换累加器A和寄存器R2中的数据
2、半字节交换指令
XML 复制代码
XCHD A, @Ri    ; 将累加器A的低4位与以Ri内容为地址的内部RAM单元的低4位交换

示例:

XML 复制代码
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)示例代码:

XML 复制代码
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)示例代码:(需结合进栈指令的代码)

XML 复制代码
POP ACC       ; 将堆栈顶部的数据弹出到累加器A

(4)代码解释

假设执行此指令前,SP 指向61H单元,且该单元存储的数据为90H。执行POP ACC后,会将61H单元中的90H传送到累加器 A,然后 SP 的值减 1,变为60H。

相关推荐
编程墨客11 小时前
STM32F103C8T6单片机内部执行原理及启动流程详解
stm32·单片机·嵌入式硬件
qq_4112624213 小时前
整体无需占用任何硬件 UART,即可新增一条全双工软串口
单片机·嵌入式硬件
XINVRY-FPGA15 小时前
XCZU47DR-2FFVG1517I Xilinx FPGA AMD ZynqUltraScale+ RFSoC
人工智能·嵌入式硬件·fpga开发·信息与通信·信号处理·射频工程·fpga
Cyrus_柯15 小时前
单片机基础(STM32-DAY2(GPIO))
单片机·嵌入式硬件
努力的小帅16 小时前
STM32单片机_3
stm32·单片机·嵌入式硬件·学习·stm32c8t6
逼子格17 小时前
开关电源和线性电源Multisim电路仿真实验汇总——硬件工程师笔记
嵌入式硬件·硬件工程·硬件工程师·开关电源·multisim电路仿真·稳压电源·线性电源
SKYDROID云卓小助手17 小时前
无人设备遥控器之无线电频率篇
服务器·网络·单片机·嵌入式硬件·算法
逼子格19 小时前
振荡电路Multisim电路仿真实验汇总——硬件工程师笔记
笔记·嵌入式硬件·硬件工程·硬件工程师·硬件工程师真题·multisim电路仿真·震荡电流
云卓SKYDROID19 小时前
无人机三叶螺旋桨概述
单片机·无人机·遥控器·云卓科技·精准降落·螺旋桨
Do vis82419 小时前
STM32第十九天 ESP8266-01S和电脑实现串口通信(2)
stm32·单片机·嵌入式硬件