8051单片机共有111条指令,指令按功能进行分类,分为5类:
1、数据传送类指令(28条)
2、算术运算类指令(24条)
3、逻辑运算和移位类指令(25条)
4、位操作类指令(17条)
5、控制转移类指令(17条)
数据传送类指令
数据传送类指令:把源操作数传送到指令锁指定的目标地址
助记符 | 功能 | 使用 |
---|---|---|
MOV | 访问内部RAM、访问特殊功能寄存器 | MOV A,Rn ;(Rn)→A,表示将Rn中的内容给A |
MOVX | 访问外部RAM | MOVX A,@DPTR ;((DPTR))→A MOVX @DPTR,A ;(A)→(DPTR) MOVX A,@Rn ;((Rn))→A MOVX @Rn,A ;(A)→(Rn) |
MOVC | 访问程序存储器 | MOVC A,@A+DPTR ;((A)+(DPTR))→A MOVC A,@A+PC;((A)+(PC))→A |
XCH | 字节交换 | XCH A,Rn;(A)→Rn,(Rn)→A XCH A,direct;(A)→direct,(direct)→A XCH A,@Rn;(A)→(Rn),(Rn)→A |
XCHD | 半字节交换 | XCHD A,@Rn;高4位不变,低4位交换; (A)3-0→(Rn)3-0,((Rn))3-0→A 3-0 |
PUSH | 入栈操作 | PUSH direct ;(SP)+1 → SP,(direct)→(SP) |
POP | 出栈操作 | POP direct ;(direct)→(SP),(SP)+1 → SP |
算术运算类指令
算术运算类指令共有24条,包括加、减、乘、除4种基本算术运算指令。算术指令用到的助记符共有8种:ADD、ADDC、INC、SUBB、DEC、DA、MUL、DIV。
1、普通加法指令(ADD)
ADD | A,Rn | ;A←(A)+(Rn) 累加器中数据与寄存器中数据相加送入累加器 |
ADD | A,direct | ;A←(A)+(direct) 累加器与直接寻址单元中数据相加送入累加器 |
ADD | A,@Ri | ;A←(A)+((Ri)) 累加器与间接寻址单元中数据相加送入累加器 |
ADD | A,#data | ;A←(A)+data 累加器中数据直接与立即数相加送入累加器 |
2、带进位加法指令
ADDC | A,Rn | ;A←(A)+(Rn)+(Cy) |
ADDC | A,direct | ;A←(A)+(direct)+(Cy) |
ADDC | A,@Ri | ;A←(A)+((Ri))+(Cy) |
ADDC | A,#data | ;A←(A)+data+(Cy) |
3、加1指令
INC | A | ;A←(A)+1 累加器(A)中数据+1 |
INC | Rn | ;Rn←(Rn)+1 寄存器中数据+1 |
INC | direct | ;direct←(direct)+1 直接寻址单元中数据+1 |
INC | @Ri | ;Ri←((Ri))+1 间接寻址单元中数据+1 |
INC | DPTR | ;DPTR←(DPTR)+1 数据指针+1 |
4、带借位减法指令
SUBB | A,Rn | ;A←(A)-(Rn)-(Cy) |
SUBB | A,direct | ;A←(A)-(direct)-(Cy) |
SUBB | A,@Ri | ;A←(A)-((Ri))-(Cy) |
SUBB | A,#data | ;A←(A)-data-(Cy) |
5、减1指令
DEC | A | ;A←(A)-1 累加器(A)中数据-1 |
DEC | Rn | ;Rn←(Rn)-1 寄存器中数据-1 |
DEC | direct | ;direct←(direct)-1 直接寻址单元中数据-1 |
DEC | @Ri | ;Ri←((Ri))-1 间接寻址单元中数据-1 |
6、乘法指令
MUL | AB | ;(A)×(B)→ BA |
7、除法指令
DIV | AB | ;(A)/(B)→ A(商)B(余数) |
逻辑操作类指令
逻辑操作类指令包括:逻辑运算指令和移位类指令。
1、累加器A清零与取反指令
CLR | A | ;对累加器A清“0” |
CPL | A | ;对累加器A按位取反 |
2、逻辑与指令
ANL | A,Rn | ;A←(A)∧(Rn) 累加器与寄存器数据相与送入累加器 |
ANL | A,direct | ;A←(A)∧(direct) 累加器与直接寻址单元数据相与送入累加器 |
ANL | A,@Ri | ;A←(A)∧(Ri) 累加器与间接寻址单元数据相与送入累加器 |
ANL | A,#data | ;A←(A)∧data 累加器与立即数相与送入累加器 |
ANL | direct,A | ;direct←(direct)∧(A) 累加器与直接寻址单元数据相与送入直接寻址单元 |
ANL | direct,#data | ;direct←(direct)∧data 直接寻址单元内容中数据与立即数相与送入直接寻址单元 |
3、逻辑或指令
ORL | A,Rn | ;A←(A)∨(Rn) 累加器与寄存器数据相或送入累加器 |
ORL | A,direct | ;A←(A)∨(direct) 累加器与直接寻址单元数据相或送入累加器 |
ORL | A,@Ri | ;A←(A)∨(Ri) 累加器与间接寻址单元数据相或送入累加器 |
ORL | A,#data | ;A←(A)∨data 累加器与立即数相或送入累加器 |
ORL | direct,A | ;direct←(direct)∨(A) 累加器与直接寻址单元数据相或送入直接寻址单元 |
ORL | direct,#data | ;direct←(direct)∨data 直接寻址单元内容中数据与立即数相或送入直接寻址单元 |
4、逻辑异或指令
XRL | A,Rn | ;A←(A)⊕(Rn) 累加器与寄存器数据相异或送入累加器 |
XRL | A,direct | ;A←(A)⊕(direct) 累加器与直接寻址单元数据相异或送入累加器 |
XRL | A,@Ri | ;A←(A)⊕(Ri) 累加器与间接寻址单元数据相异或送入累加器 |
XRL | A,#data | ;A←(A)⊕data 累加器与立即数相异或送入累加器 |
XRL | direct,A | ;direct←(direct)⊕(A) 累加器与直接寻址单元数据相异或送入直接寻址单元 |
XRL | direct,#data | ;direct←(direct)⊕data 直接寻址单元内容中数据与立即数相异或送入直接寻址单元 |
5、移位类指令
RL | A | ;累加器A的内容向左循环移位1位 |
RLC | A | ;累加器A的内容带进位标志向左循环移1位 |
RR | A | ;累加器A的内容向右循环移1位 |
RRC | A | ;累加器A的内容带进位标志向右循环移1位 |
循环左移指令示例图:RL A A7←A6←A5←A4←A3←A2←A1←A0 ↓ →---------------------------------------------↑
带进位循环右移指令示例图:RRC A
CY→A7→A6→A5→A4→A3→A2→A1→A0
↑ --------------------------------------------------←↓
位操作类指令
89C51单片机具有丰富的位操作指令,可以完成以位变量为对象的传送、运算、控制转移等操作。
1、位数据传送指令
MOV | C,bit | ;Cy←(bit) 将直接寻址位的内容送入累加器CY中 |
MOV | bti,C | ;bit→(Cy) 将CY 的内容传送到直接寻址位 |
注意: 两个可寻址位之间没有直接的传送指令,若要完成这种传送,可通过CY作为媒介间接传送。
例子:若要将30H位的数传送到20H位,则要执行下列指令:
MOV C,30H;
MOV 20H,C;
2、位变量修改指令
CLR | bit | ;bit←0 对位地址清零 |
CPL | C | ;Cy←(Cy取反) 对位累加器CY取反 |
CPL | bit | ;bit←(bit取反) 对位地址取反 |
SETB | C | ;Cy←1 对位累加器CY置1 |
SETB | bit | ;bit←1 对位地址置1 |
**3、位变量逻辑指令**
ANL | C,bit | ;Cy←(Cy)∧(bit) 位累加器CY与位地址相与送入位CY中 |
ORL | C,bit | ;Cy←(Cy)∨(bit) 位累加器CY与位地址相或送入位CY中 |
控制转移类指令
控制转移类指令的功能主要是控制程序从原来顺序执行地址转移到其他指令地址上。这种转移可以通过程序跳转、调用子程序、子程序返回等途径完成。
1、无条件转移指令
无条件转移指令功能是:当程序执行无条件转移指令时,程序就无条件地转移到该指令所提供的地址上去。
指令 | 说明 |
---|---|
JMP rel | 默认情况下等同于 SJMP rel |
SJMP rel | Rel 是8位带符号数,转移范围为当前PC值的-128~+127共256个单元 |
AJMP addr11 | addr11 送入PC10~PC0,而PC15~PC11保持不变,转移范围2KB |
LJMP addr16 | addr16 装入PC,转移范围64KB |
2、条件转移指令
条件转移指令是依某种特定条件转移的指令。
条件满足时转移到新地址(标号处)。
条件不满足时则按顺序执行下一条指令。
分类 | 指令 | 说明 |
---|---|---|
累加器A 判0转移 | JZ rel | (A) = 0转移 到PC+rel处执行,否则顺序执行 |
累加器A 判0转移 | JNZ rel | (A) ≠ 0转移 到PC+rel处执行,否则顺序执行 |
判位(bit)状态转移 | JB bit,rel | bit = 1转移到PC+rel处执行,否则顺序执行 |
判位(bit)状态转移 | JNB bit,rel | bit ≠ 1转移到PC+rel处执行,否则顺序执行 |
判位(bit)状态转移 | JBC bit,rel | bit = 1转移到PC+rel处执行,并将该位请0,否则顺序执行 |
判位(bit)状态转移 | JC rel | 进位位CY = 1转移到PC+rel处执行,否则顺序执行 |
判位(bit)状态转移 | JNC rel | 进位位CY ≠ 1转移到PC+rel处执行,否则顺序执行 |
3、比较转移指令
CJNE | A,direct,rel | ;(A) ≠ (direct)转移 |
CJNE | A,#data,rel | ;(A) ≠ data转移 |
CJNE | Rn,#data,rel | ;(Rn) ≠ data转移 |
CJNE | @Ri,#data,rel | ;((Ri)) ≠ data转移 |
4、循环转移指令
DJNZ | Rn,rel | ;寄存器Rn减1不为0循环转移 |
DJNZ | direct,rel | ;直接寻址单元direct减1不为0循环转移 |
指令时间计算
单片机每执行一条指令需要消耗一定的时间才能完成。假定执行一条指令需要时间T,则循环执行N次该指令就需要时间N×T,实际编程中,我们常用DJNZ这条指令实现软件演示的效果。
例:假定一条DJNZ指令需2us,一条MOV指令需1us,执行下面程序后,请问总共需要多长时间?
MOV R7,#200 ;执行1次 DL1: MOV R6,#250 ;执行200次 DL2: DJNZ R6,DL2 ;执行200×250次 DJNZ R7,DL1 ;执行200次1234
从上面可推断出,整个程序运行的时间
T = 201×1+200×251×2=100601us=100.601s
子程序调用及返回指令
在程序设计中,通常把具有一定功能的公用程序段编成子程序,当子程序需要使用时调用指令CALL,而在子程序的最后安排一条子程序返回指令RET,以便执行完子程序后能返回主程序继续执行。
1、调用指令CALL
调用指令CALL在发生程序转移前,先将PC的当前值压入堆栈,然后将子程序入口地址送入PC,使CPU转向执行子程序。
指令 | 说明 |
---|---|
CALL rel | 默认情况下等同于 ACALL rel |
ACALL addr11 | addr11 送入PC10~PC0,而PC15~PC11保持不变,转移范围2KB |
LCALL addr16 | addr16 装入PC,转移范围64KB |
2、子程序返回指令RET** 子程序返回指令是把栈顶相邻两个单元的内容弹出送到PC,SP的内容减2,程序返回PC值所指的指令处执行。RET指令通常安排在子程序的末尾,使程序能从子程序返回到主程序。
3、中断返回指令RETI** RETI这条返回指令与RET指令完成的功能一样,都是使得子程序返回到主程序中来。但RETI指令比RET指令多做一件事情,就是在主程序返回之前,该条指令还将清除相应的中断标志位,以表示该中断已经响应完成了。
4、空操作指令NOP** 空操作也是CPU控制指令,它没有使程序转移的功能。只消耗一个机器周期的时间,即此时PC+1。常用于程序的等待或时间的延迟。 ``` ******************************************************************/ *
【课程4】 ****单片机汇编指令系统的应用*********** *
【说 明】 ****通过本例程了解单片机的汇编指令系统,并进行程序的编写 *
【描 述】 ****实现两个立即数FCH和52H相加 ******************************************************************/ ORG 0000H Start: MOV A,#0FCH ;计算FCH+52H=? MOV R0,#52H ADD A,R0 JC L1 ;判断CY,如果CY=1,跳到L1处执行 MOV 30H,#00H JMP L2 L1: MOV 30H,#01H L2: MOV 31H,A
MOV A,#0FCH ANL A,R0 ;计算两数相与 MOV P0,A MOV A,#0FCH ORL A,R0 ;计算两数相或 MOV P1,A MOV A,#0FCH XRL A,R0 ;计算两数异或 MOV P2,A MOV A,#0FCH CPL A ;对FCH数取反 MOV P3,A RL A ;左移1位 RL A ;左移1位 RL A ;左移1位 RL A ;左移1位 MOV P3,A END
上一篇:贰:第一个51单片机的汇编实验
下一篇:肆:IO端口的输出应用
推荐阅读最新更新时间:2024-11-14 17:52
设计资源 培训 开发板 精华推荐
- LTC6990IS6#TRMPBF 直接压电报警驱动器的典型应用。调整频率以获得最大警报声压(最大干扰以获得最佳效果)
- OP413ESZ精密称重传感器秤放大器的典型应用
- 3D打印机屏幕 OLED控制器(mini12864)
- 使用 ON Semiconductor 的 MPIC2151P 的参考设计
- #第六届立创电赛#基于CI-1122的离线语音控制红外遥控
- LDFM33PVR、5V/0.5A超低压降稳压器的典型应用电路
- LT1121IS8-3.3 5V 低压差稳压器的典型应用电路,用于具有关断的电池供电电源
- LT8330HS6 4V 至 36V 输入、-12V 反相转换器的典型应用电路
- TDA8932B D 类音频功率放大器的对称电源单声道 BTL 配置
- STEVAL-IPFC12V1、2kW 2 通道交错式 PFC 评估套件,基于具有数字浪涌电流控制的 STNRGPF12 数字控制器
- 在线直播 意法半导体工业峰会2022
- 逛工业自动化展TE Connectivity网上展厅,答题赢好礼!
- 电源小课堂—AC/DC电源设计的选型
- 【已结束】有奖直播【TI 全新CC2340无线 MCU,助力低功耗蓝牙应用】
- 调查 | 电机驱动的那些坎儿,我们帮你过!
- TI 高精度实验室信号链精品课大作战——你学习我送礼!
- 只为汽车更安全,下载 TI DRV3000系列产品手册,抢楼截图入好礼喽!
- 有奖直播报名中|基于英飞凌AIROC™ CYW20829低功耗蓝牙芯片的无线组网解决方案
- 安世半导体&世平集团 Nexperia 在5G基础架构的应用 下载赢好礼!
- 有奖直播:现代电动工具的设计挑战与英飞凌解决之道
- 2030年中国的锂电池回收和二次利用市场将达到450亿美元
- 伊顿推出电动车新高压保护装置 能将电池与其它部分迅速断开
- 新思科技推出原生汽车解决方案,高效实现自动驾驶和ADAS芯片设计
- 艾拉比与翱捷科技合作,推出LoRa技术下的OTA差分升级
- 一秒开机!高德发布红外测温新品
- 第三方开发者立功,Lumia 950 XL刷入了微软Surface Hub OS系统
- iPhone 12 mini、iPhone 12 Pro Max在11月13日交付日前发货
- iPhone 12/mini/Pro专用MagSafe皮革保护套售价惹争议
- 华为鸿蒙OS 2.0手机版将上线,12月18日开放Beta测试版本
- 安徽立德半导体引线框架和AMOLED高精度金属掩模板项目合作