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。

相关推荐
Invinciblenuonuo2 小时前
STM32八股【5】----- TIM定时器
stm32·单片机·嵌入式硬件
selenia88602 小时前
如何成功点亮LED灯并实现闪烁效果
单片机·嵌入式硬件
禾川兴 132424006883 小时前
国产芯片解析:龙讯HDMI Splitter系列:多屏共享高清
单片机·fpga开发·适配器模式
猫猫的小茶馆5 小时前
【PCB工艺】软件是如何控制硬件的发展过程
开发语言·stm32·单片机·嵌入式硬件·mcu·51单片机·pcb工艺
柒月玖.8 小时前
基于AT89C52单片机的轮胎压力监测系统
单片机·嵌入式硬件·mongodb
多多*9 小时前
Java设计模式 简单工厂模式 工厂方法模式 抽象工厂模式 模版工厂模式 模式对比
java·linux·运维·服务器·stm32·单片机·嵌入式硬件
云山工作室11 小时前
基于FPGA的智能垃圾分类装置(论文+源码)
单片机·fpga开发·毕业设计·毕设
leluckys14 小时前
逆向-ARM64汇编二
汇编
小麦嵌入式16 小时前
Linux驱动开发实战(九):Linux内核pinctrl_map详解与优势分析
linux·c语言·汇编·驱动开发·stm32·嵌入式硬件·硬件工程
淬渊阁18 小时前
汇编学习之《指针寄存器&大小端学习》
汇编·学习