Sirius' blog Sirius' blog
首页
  • 学习笔记

    • 《C++》
    • 《MATLAB》
    • 《Python》
  • 学习笔记

    • 《Git》
    • 《CMake》
  • 技术文档
  • 博客搭建
  • 学习
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Sirius0v0

怕什么真理无穷,进一寸有一寸的欢喜
首页
  • 学习笔记

    • 《C++》
    • 《MATLAB》
    • 《Python》
  • 学习笔记

    • 《Git》
    • 《CMake》
  • 技术文档
  • 博客搭建
  • 学习
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 学习笔记

  • 技术文档

    • Markdown使用教程
    • Linux相关技术

    • LaTeX学习入门
    • yaml语言教程
    • 51微控制器
      • 数据传送类
        • 内部数据存储器间数据传送指令
        • 外部数据存储器间数据传送指令
        • 程序存储器向累加器A传送数据指令
        • 数据交换指令
        • 堆栈操作类指令
      • 算数运算类指令
        • 加法运算
        • 减法运算
        • 乘法运算
        • 除法运算
        • 十进制调整指令
      • 逻辑运算及移位类指令
        • 基本逻辑与清零
        • 移位指令
      • 控制转移类指令
        • 无条件转移
        • 条件转移
        • 子程序调用及返回指令
        • 位操作类指令
      • 其他
        • 空操作指令(单字节)
      • 伪指令
        • ORG伪指令
        • END伪指令
        • DB伪指令
        • DW伪指令
        • DS伪指令
        • EQU伪指令
        • bit伪指令
      • 程序设计方法
  • 博客搭建

  • 技术
  • 技术文档
Sirius0v0
2020-09-29
目录

51微控制器

# MCS-51微控制器汇编语言与指令格式

寻址方式 寻址空间
立即寻址 程序存储器ROM
直接寻址 片内RAM低128B和特殊功能寄存器
寄存器寻址 工作寄存器R0~R7和A,B,C,DPTR
寄存器间接寻址 片内RAM低128B[@R0];片外RAM(@R0, @R1, @DPTR)
变址寻址 程序存储器(@A+PC,@A+DPTR)
相对寻址 程序存储器256B范围(PC+偏移量)
位寻址 片内RAM的20H~2FH字节地址,部分特殊功能寄存器

# 数据传送类

# 内部数据存储器间数据传送指令

MOV 目的操作数, 源操作数

MOV		A, Rn
MOV		A, direct
MOV		A, @Ri
MOV		A, #data

MOV		Rn, A
MOV		Rn, direct
MOV		Rn, #data

MOV		direct, A
MOV		direct, Rn
MOV		direct, direct
MOV		direct, @Ri
MOV		direct, #data

MOV		@Ri, A
MOV		@Ri, direct
MOV		@Ri, #data

MOV		DPTR, #data16
  • 目的操作数和源操作数不能有Rn和@Ri配对

# 外部数据存储器间数据传送指令

MOVX 	A, @DPTR
MOVX 	@DPTR, A
MOVX 	A, @Ri
MOVX 	@Ri, A

# 程序存储器向累加器A传送数据指令

MOVC 	A, @A+DPTR
MOVC 	A, @A+PC

# 数据交换指令

XCH 	A, Rn
XCH 	A, direct
XCH 	A, @Ri

XCHD 	A, @Ri			;A与(Ri)低四位交换
SWAP 	A				;A低四位和高四位交换

# 堆栈操作类指令

PUSH 	direct			;SP <-- (SP+1),(SP) <-- (direct)
POP 	direct			;(direct) <-- (SP),(SP) <-- (SP-1)

# 算数运算类指令

加法和减法的执行结果将影响程序状态标志寄存器PSW的进位位CY、溢出位OV、辅助进位位AC和奇偶校验位P;

乘、除指令的执行结果将影响PSW的溢出位OV、进位位CY和奇偶校验位P;

加1、减1指令的执行结果只影响PSW的奇偶校验位P。

# 加法运算

;不带进位
ADD 	A, Rn
ADD 	A, direct
ADD 	A, @Ri
ADD 	A, #data

;带进位
ADDC 	A, Rn
ADDC 	A, direct
ADDC 	A, @Ri
ADDC 	A, #data

;加1指令
INC 	A
INC 	Rn
INC 	direct
INC 	@Ri
INC 	DPTR

# 减法运算

;带借位
SUBB 	A, Rn
SUBB 	A, direct
SUBB 	A, @Ri
SUBB 	A, #data

;减1指令
DEC 	A
DEC 	Rn
DEC 	direct
DEC 	@Ri

# 乘法运算

MUL 	AB			;高字节 --> B  低字节 --> A

# 除法运算

DIV 	AB			;商 --> A   余数 --> B

# 十进制调整指令

  • 只用在ADD,ADDC后面
DA 		A

它的调整过程为: (1)若累加器A的低四位为十六进制的A~F或辅助进位标志AC为1,则累加器A中的内容作加06H调整。 (2)若累加器A的高四位为十六进制的A~F或进位标志CY为1,则累加器A中的内容作加60H调整。

# 逻辑运算及移位类指令

# 基本逻辑与清零

与:ANL
或:ORL
异或:XRL

; 只能对累加器A进行求反与清零
求反:CPL
清零:CLR

# 移位指令

RL 		A
RR 		A
RLC 	A
RRC 	A

RL与RR

RLC与RRC

# 控制转移类指令

# 无条件转移

# 长转移指令

LJMP 	addr16			;PC <-- addr16

# 绝对转移指令(2B)

AJMP 	addr11			;PC10~0 <-- addr11,低11位

# 相对转移指令(2B)

SJMP 	rel				;rel取值范围-128~127

SJMP 	$				;原地等待

# 间接转移指令

JMP 	@A+DPTR

# 条件转移

# 累加器A判零条件转移指令

JZ 		rel				;为零转移
JNZ 	rel				;非零转移

# 比较转移指令

CJNE 	A, #DATA, rel
CJNE 	Rn, #data, rel
CJNE 	@Ri, #data, rel
CJNE 	A, direct, rel

“大零小一”:大于则C=0,小于则C=1

# 减一不为零转移指令(3B)

DJNZ 	Rn, rel
DJNZ 	direct, rel

通常用DJNZ指令来构造循环结构,实现重复处理。DJNZ的指令长度为3个字节

# 子程序调用及返回指令

# 长调用指令

LCALL 	addr16

执行过程:(PC)←(PC)+3 SP← SP + 1 (SP)←(PCL) SP ← SP + 1 (SP)←(PCH) (PC)←addr16

# 绝对调用指令

ACALL 	addr11

执行过程:(PC)←(PC)+2 SP ← SP + 1 (SP)←(PC)7~0 (SP)← SP + 1 (SP)←(PC)15~8 (PC)10~0←addr11

# 子程序返回指令

RET

# 中断返回指令

RETI				;会清除中断的优先级触发器

# 位操作类指令

位地址的表示方法:

  1. 直接用位地址: D4H
  2. 用特殊功能寄存器名加位数: PSW.4
  3. 用位名称: RS1
  4. 用bit定义的有名字的位地址

# 位传送指令

MOV 	C, bit
MOV 	bit, C
  • 必须使用位运算器C进行传送

# 位置位指令

位清零
CLR 	C
CLR 	bit

位置1
SETB 	C
SETB 	bit

# 位逻辑指令

+ 位逻辑
    + 求反
    CPL 	C
    CPL 	bit

    + 位与
    ANL 	C,bit
    ANL 	C, /bit
    
    + 位或
    ORL 	C, bit
    ORL 	C, /bit

# 位条件转移指令

  • 以C为条件的位转移指令
JC 		rel				;C=1转移
JNC 	rel				;C=0转移
  • 以bit为条件的位转移指令
JB 		bit, rel		;(bit)=1转移
JNB 	bit, rel		;(bit)=0转移
JBC 	bit, rel		;(bit)=1转移 且 (bit) <-- 0

# 其他

# 空操作指令(单字节)

NOP

# 伪指令

# ORG伪指令

用于指明程序或数据从程序存储空间什么位置开始存放

# END伪指令

该指令放于程序最后位置,用于指明汇编语言源程序的结束位置

# DB伪指令

用于定义字节数据

		ORG 	3000H
TAB1:	DB 		12H, 34H
		DB  	'5', 'A', 'abc'

DB伪指令

# DW伪指令

与DB相似,但用于定义字数据

		ORG 	3000H
TAB2: 	DW 		1234H,5678H

DW伪指令

# DS伪指令

保留一定数量的字节单元,保留存贮空间主要为以后存放数据

		ORG 	2000H
TAB1: 	DB 		12H,34H
		DS 		4H
		DB 		'5'

# EQU伪指令

符号 EQU 项			;将项赋值给符号

TAB1 EQU 1000H

# bit伪指令

符号 bit 位地址			;将位地址用符号重新起名

PLG	bit	P1.0
之后P1.0可以用PLG使用

# 程序设计方法

		ORG 	0000H      ;主程序入口
		AJMP 	MAIN
		ORG 	0003H		;中断子程序入口
		AJMP 	INTR0
MAIN: 	MOV R2,#10H			;主程序
LOOP: 	LCALL F1
        JB 70H,LOP1
        LCALL F2
LOP1: 	LCALL F3
        AJMP LOOP
F1: 	NOP					;子程序
   		RET 
F2: 	NOP
      	RET
F3:     NOP  
        RET
INTR0: 	NOP 				;中断子程序
        RETI

编辑 (opens new window)
#汇编
上次更新: 2023/08/09, 13:21:24
yaml语言教程
使用Gitalk实现静态博客无后台评论系统

← yaml语言教程 使用Gitalk实现静态博客无后台评论系统→

最近更新
01
ipopt优化库配置及使用
07-21
02
ubuntu离线安装包的方法
07-21
03
其它控件的使用
03-05
更多文章>
Theme by Vdoing | Copyright © 2020-2024 Sirius0v0 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式