第 3章 MCS-51指令系统
第 3章 MCS-51指令系统
3.1 MCS-51指令系统
3.2 汇编语言程序设计基础
教学内容:
第 3章 MCS-51指令系统
1,了解并掌握单片机各类指令的使用方法
教学要求:
2、了解汇编语言编程特点,掌握基本程序设计。
第 3章 MCS-51指令系统
一,指令分类
按指令的功能,MCS -51 指令系统可分为下列 5 类,
(1) 数据传送 ;
(2) 算术运算 ;
(3) 逻辑运算 ;
(4) 位操作 ;
(5) 控制转移。
3.1 MCS-51指令系统
第 3章 MCS-51指令系统
(1) Rn(n=0~ 7):表示工作寄存器组 R7~ R0中的某一寄存器 。
二、使用下列符号及约定:
(2) @Ri(i=0~ 1):以寄存器 R0或 R1作为间接寻址,表示操
作数地址在寄存器 R0或 R1中,,@”是间接寻址标识符。
操作对象是外部 RAM或内部 RAM 00~ FFH单元
(3) @DPTR:以数据指针 DPTR(16位 )作为间接寻址,操作
数在外部 RAM中,,@”也是间接寻址标识符。
第 3章 MCS-51指令系统
(6) direct,8位直接地址, 内部 RAM 00~ 7FH单元字节地址以
及特殊功能寄存器的映象地址 。
(4) #data,8位立即数,其中,#”是立即数标识符。
(5) #data16,16位立即数,其中,#”也是立即数标识符,
用于初始化数据指针 DPTR。
第 3章 MCS-51指令系统
(7) /bit:在位操作中, 取出, bit”位信息后, 先取反, 然后
再参与运算, 但不改变 bit位的值, 其中, /”是位取反标识符 。
(8) rel:补码形式的 8位偏移地址,范围是 -128~ +127。
第 3章 MCS-51指令系统
(9) rrr:在操作码中, 表示 R7~ R0寄存器的编码, rrr编码
与寄存器 R7~ R0的对应关系如下:
rrr的编码 (二进制 ) 对应的工作寄存器名
000 R0
001 R1
010 R2
011 R3
100 R4
101 R5
110 R6
111 R7
第 3章 MCS-51指令系统
(10) addr11,11位目标地址, 用于 ACALL和 AJMP指令中,
转移范围为 2 KB。
(11) addr16,16位目标地址,用于 LCALL和 LJMP指令中,
转移范围为 64 KB。
(12) 操作数中的累加器 A写作,A”时,是寄存器寻址;
写作,Acc”时是直接寻址。
第 3章 MCS-51指令系统
(13) 累加器 A内容为 nn时, 用, A=nn”表示; ?地址编码为
mm的存储单元内容用, (mm)”表示 。
(14) 指令执行时间用“机器周期”度量。
(15) 指令机器码一律用二进制书写。
(16) 对于不常用或约束条件多、容易出错、不推荐
使用的指令,在指令表中加灰色背景。
第 3章 MCS-51指令系统
3.1.1 数据传送指令
(4) 堆栈操作指令 。
(5) 字节交换指令。
在 MCS-51指令系统中,数据传送指令包括:
(1) 内部 RAM与特殊功能寄存器之间的数据传送,,MOV”
(2) 外部 RAM与累加器 A之间的数据传送,,MOVX”
(3) 将程序存储器 ROM中某一单元的信息传送到累加器 A中
的指令,,MOVC”
第 3章 MCS-51指令系统
图 3-1 MCS-51数据传送示意图
内部 R A M ( 8 0 H - F F H )
内部 R A M ( 0 0 - 7 F H )
特殊功能寄存器
( 8 0 - F F H )
立即数 (8 位 )
累加器 A
立即数 ( 1 6 位 )
数据指针 D P T R
工作寄存器
R7 - R0
外部 R A M
程序存储器 R O M
第 3章 MCS-51指令系统
1,数据传送到累加器 A
MOV A,Rn A← Rn
MOV A,direct A← ( direct)
MOV A,@Ri A← (Ri)
MOV A,# data A ← data
这组指令的功能是:把源操作数的内容送入累加器 A。
例如, MOV A,# 10H,该指令执行时将立即数 10H送入累
加器 A中。
一,内部 RAM与特殊功能寄存器之间的数据传送
第 3章 MCS-51指令系统
2,数据传送到工作寄存器 Rn
MOV Rn,A Rn← A
MOV Rn,direct Rn← (direct)
MOV Rn,# data Rn← data
这组指令的功能是, 把源操作数的内容送入当前工作寄存器区的
R0~ R7中的某一个寄存器。指令中 Rn在内部数据存储器中的地址
由当前的工作寄存器区选择位 RS1,RS0 确定,可以是 00H~ 07H、
08H~ 0FH,10H~ 17H,18H~ 1FH。 例如, MOV R0,A,若当前
RS1,RS0 设置为 00,执行该指令时,将累加器 A中的数据传送至
工作寄存器 R0(内部 RAM 00H)单元中。
第 3章 MCS-51指令系统
3,数据传送到内部 RAM单元或特殊功能寄存器 SFR的指令
MOV direct,A (direct) ← A
MOV direct,Rn
MOV direct,direct
MOV direct,@Ri (direct )← (Ri)
MOV direct,# data
MOV @Ri,A
MOV @Ri,direct
MOV @Ri,# data
MOV DPTR,# data16 DPH← D15~D8
DPL← D7~D0
第 3章 MCS-51指令系统
这组指令的功能是:把源操作数的内容送入内部 RAM单元或特殊功
能寄存器。其中 MOV direct,direct 和 MOV DPTR,# data16
都是三字节指令。
MOV DPTR,# data16是将 16位的立即数送入数据指针寄存器
DPTR。
MOV direct,direct,能实现内部 RAM之间、特殊功能寄存器之间
或特殊功能寄存器与内部 RAM之间的直接数据传送。
第 3章 MCS-51指令系统
表 3-1 内部 RAM与特殊功能寄存器之间的数据传送指令
指令名称 指令格式 机器码 功能 指令周期
以累加器 A作为
目的操作数
MOV A,Rn 11101rrr A←Rn 1
MOV A,direct 11100101direct A←(direct) 1
MOV A,@Ri 1110011i A←(Ri) 1
MOV A,#data 01110100data A←data 1
第 3章 MCS-51指令系统
以 Rn寄存器作为
目的操作数
MOV Rn,A 11111rrr Rn←A 1
MOV Rn,direct 10101rrrdirect Rn←(direct) 2
MOV Rn,#data 01111rrrdata Rn←data 1
以直接地址 direct
作为目的操作数
MOV direct,A 11110101direct direct←A 1
MOV direct,Rn 10001rrrdirect (direct)←Rn 2
MOV
direct2,direct1
10000101
direct1
direct2
(direct2)←(dire
ct1) 2
MOV
direct,@Ri
1000011i
direct (direct)←(Ri) 2
MOV
direct,#data
01110101
direct
data
(direct)←data 2
第 3章 MCS-51指令系统
以 Ri寄存器间接
地址为目的操作

MOV @Ri,A 1111011i (Ri)←A 2
MOV
@Ri,direct
1010011i
direct (Ri)←(direct) 2
MOV
@Ri,#data
0111011i
data (Ri)←data 1
16立即数传送 MOV DPTR,#data16
10010000
D15~ D8
D7~ D0
DPH←D15 ~
D8
DPL←D7 ~
D0
2
第 3章 MCS-51指令系统
(1) 对前 128字节内部 RAM(即 00H~ 7FH)各单元之间, 以及特
殊功能寄存器可以直接传送, 不一定需要经过累加器 A,例如:
MOV 32H,90H ; 将特殊功能寄存器 90H单元中的 (即 P1口 )内容读到内
部 RAM 32H单元中,; 该指令中目的操作数 (内部 RAM)使用了直
接寻址方式, 源操作数 (特殊功能寄; 存器 90H单元 )也使用了直接寻址方式
MOV 32H,43H ; 将内部 RAM 43H单元内容读到内部 RAM
32H单元中
MOV 90H,0F0H ; 将特殊功能寄存器 0F0H单元 (即寄存器 B)
内容传送到特殊功能寄存器 90H; 单元 (即 P1口锁存器 )中
第 3章 MCS-51指令系统
(2) MCS-51指令系统约定:对于特殊功能寄存器, 只能用直
接寻址方式访问;对于高 128字节内部只能用寄存器间接寻址方
式 。 例如:
MOV @R0,0F0H ; 假设该指令执行前, R0内容为 90H,
则该指令的含义是将特殊功能寄存
器 0F0H单元 (即寄存器 B)内容传送到
内部 RAM的 90H单元中
第 3章 MCS-51指令系统
(3) 对于低 128字节内部 RAM,可以用直接寻址方式, 也可
以用寄存器间接寻址方式, 例如:
MOV 32H,#23H ; 将立即数 23H传送到内部 RAM的
32H单元中, 目的操作数使用了直
接寻址方式
MOV @R0,#23H ; 假设该指令执行前, R0中的内容
为 32H,则该指令的作用与上条指
令相同,; 也是将立即数 23H传送到内部 RAM
的 32H单元中, 只是目的操作数采
用寄 存器间接寻址方式
第 3章 MCS-51指令系统
(4) 对于特殊功能寄存器, 在指令中除了可以使用寄存器直
接地址外, 还可以引用寄存器名, 如, MOV P1,#23H”与
,MOV 90H,#23H”等价 。
(5) 由于存在多种寻址方式,因此实现同一操作可用不同的指令,
灵活性大。例如,,MOV 32H,#23H”与,MOV @R0,#23H (假
设此时 R0内容为 32H)”的功能相同,只是机器码不同。
第 3章 MCS-51指令系统
(6) 尽管寄存器 B是 CPU内寄存器, 但 MCS-51指令系统没有提
供 B寄存器的寄存器寻址方式 (只有乘法指令例外 ),例如, MOV
B,A”指令中目的操作数的寻址方式是直接寻址方式, 并不是寄
存器寻址方式 。
第 3章 MCS-51指令系统
(7) 在同一指令中, 只允许其中的一个操作数使用寄存器间
接寻址方式, 因而如下指令将是非法指令:
MOV @R0,@R1
52子系列内部 RAM高 128字节之间不能直接传送, 必须通过累
加器 A或内部 RAM作为中介, 例如将内部 RAM的 82H单元传送
到内部 RAM的 8FH单元时, 可用如下指令实现:
MOV R0,#82H
MOV A,@R0
MOV R0,#8FH
MOV @R0,A
第 3章 MCS-51指令系统
【 例 3.1】 用单步方式执行下列指令, 并观察指令执行前后,
内部 RAM有关单元内容和程序状态字 PSW中 Cy,Ac,OV,P等
标志位的变化, 了解数据传送指令对标志位的影响 。
MOV 30H,#01H ;把立即数 01H传送到内部 RAM
30H单元
MOV A,30H ;该指令执行后累加器 A内容为 01H,含有奇数个, 1”,
因此 P标志位为 1
MOV A,#03H ;该指令执行后累加器 Acc内容为 03H,含
有偶数个, 1”,因此 P标志位为 0
MOV 30H,#03H ;尽管执行后, 30H单元内容也是 03H,但
传送的目的地址不是累加器 Acc,因此标志
位没有变化
第 3章 MCS-51指令系统
二,外部 RAM数据传送
表 3-2 外部 RAM数据传送指令
指令名称 指令格式 机器码 功能 指令周期
累加器 A与外部
RAM之间的数
据传送
MOVX
A,@DPTR 11100000 A←(DPTR) 2
MOVX
@DPTR,A 11110000 (DPTR)←A 2
MOVX A,@Ri 1110001i A←(Ri) 2
MOVX @Ri,A 1111001i (Ri)←A 2
第 3章 MCS-51指令系统
(1) 通过 DPTR寄存器间接寻址方式读写外部 RAM及扩展 I/O端口 。
① 将 16位外部 RAM地址或 I/O端口地址放在数据指针 DPTR寄
存器中。
②以 DPTR作为间接寻址寄存器,通过累加器 A进行读写,这
时外部 RAM低 8位地址 A7~ A0通过 P0口输出,高 8位地址
A15~ A8通过 P2口输出。
第 3章 MCS-51指令系统
MOV DPTR,#3FFFH ; 将要读写的外部 RAM存储单元地址 3FFFH
以立即数方式传送到 DPTR寄存器中
MOVX A,@DPTR ; 将 DPTR指定的外部存储单元 3FFFH传送
到累加器 A中 (读外部 RAM)
例 读写的外部 RAM存储单元地址 3FFFH
MOVX @DPTR,A ; 将累加器 A输出到 DPTR指定的外部
存储单元 3FFFH中 (写外部 RAM)
第 3章 MCS-51指令系统
(2) 通过 R0或 R1寄存器间接寻址读写外部 RAM及扩展 I/O端口。
② 当外部 RAM容量大于 256字节时,以页面方式读写外
部 RAM时,P2口中没有使用的 I/O引脚,可作为输出引
脚使用。
① 外部 RAM低 8位地址 A7~ A0通过 P0口输出,寻址范围是
前 256个存储单元。在读写期间 P2口处于 I/O方式,且 P2口锁
存器不变。
第 3章 MCS-51指令系统
MOV P2,#3FH ; 将要读写的外部 RAM存储单元高 8位地址 3FH以立
即数方式传送到 P2口中 (写入 P2口锁存器 )
MOV R1,#0FFH ; 将要读写的外部 RAM存储单元低 8位地址 0FFH以立
即数方式传送到 R1寄存器中
MOVX A,@R1 ; 将 R1指定的外部存储单元低 8位地址 0FFH通过 P0口
输出, 由于 P2口保持不变, 结果外部 RAM的
3FFFH单 元被选中, 并读入累加器 A中
MOVX @R1,A ; 将 R1指定的外部存储单元低 8位地址 0FFH通过 P0口
输出, 由于 P2口保持不变, 外部 RAM的 3FFFH
单元被选中, 结果累加器 A的内容传 送到 3FFFH单元
(写入 )
第 3章 MCS-51指令系统
由于外部 RAM与内部 RAM之间不能直接传送, 因此当需
要将外部 RAM传送到内部 RAM时, 可通过累加器 A作为中介 。
例如,通过如下指令将外部 RAM 3FFFH单元内容传送到内部 RAM
2FH单元:
MOV DPTR,#3FFFH ; 将外部 RAM地址以立即数方式传送到数
据指针 DPTR中
MOVX A,@DPTR ; 将外部 RAM 3FFFH单元内容读到累加器 A中
MOV 2FH,A ; 将累加器 A中的内容传送到内部 RAM 2FH单元中
第 3章 MCS-51指令系统
【 例 3.2】 把外部 RAM的 2000H单元内容传送到 3000H单
元中 (两单元之间的数据传送 )。
MOV DPTR,#2000H ; DPTR←2000H 单元地址
MOVX A,@DPTR ; Acc←2000H 单元内容
MOV DPTR,#3000H ; DPTR←3000H 单元地址
MOVX @DPTR,A ; 3000H单元 ← Acc
第 3章 MCS-51指令系统
【 例 3.3】 将外部 RAM 2000H~ 201FH单元, 共 32字节传
送到以 3000H为首址的外部 RAM中 。
对于标准 MCS-51来说, 在外部 RAM之间进行批量数据传送
时, 可先将外部 RAM数据传送到内部 RAM中, 然后再传送到
外部 RAM目标地址 。
参考程序如下:; 先将外部 RAM数据传送内部 RAM 30H~ 4FH中
MOV R0,#30H
MOV R7,#20H
MOV DPTR,#2000H
第 3章 MCS-51指令系统
LOOP1:
MOVX A,@DPTR
MOV @R0,A
INC DPTR
INC R0
DJNE R7,LOOP1; 再将暂存于内部 RAM 30H~ 4FH中的数据送外
部 RAM目标地址中
MOV R0,#30H
MOV R7,#20H
MOV DPTR,#3000H
第 3章 MCS-51指令系统
LOOP2:
MOV A,@R0
MOVX @DPTR,A
INC DPTR
INC R0
DJNE R7,LOOP2
第 3章 MCS-51指令系统
利用增强型 MCS-51的双 DPTR指针, 实现外部 RAM不同区
域之间数据传送要简单得多, 如实现上述数据传送的参考程序
可改为:
MOV R7,#20H ; 设臵传送字节数; 初始化数据指针
MOV DPTR,#2000H ; 数据块在外部 RAM首地址
送第一个 DPTR指针
INC AUXR1 ; 切换数据指针
MOV DPTR,#3000H ; 外部 RAM目标地址送另一
DPTR指针
第 3章 MCS-51指令系统
LOOP:
INC AUXR1 ; 切换到第一个 DPTR指针
MOVX A,@DPTR ; 取外部 RAM数据
INC DPTR
INC AUXR1 ; 切换到第二个 DPTR指针
MOVX @DPTR,A ; 数据送外部 RAM目标地址
INC DPTR
DJNZ R7,LOOP ; 循环, 直到传送 20H字节
可见利用双 DPTR指针后,程序段结构简洁,也无须内部
RAM作缓冲区。
第 3章 MCS-51指令系统
三,累加器 A与程序存储器 ROM之间的数据传送指令
为了取出存放在程序存储器中的表格数据,MCS-51提供了
两条查表指令,这两条指令的操作码助记符为,MOVC”,其
中,C”的含义是,Code(代码 )”,表示操作对象是程序存储器。
指令名称 指令格式 机器码 功 能 指令周期
查表指令
MOVC
A,@A+DPTR 10010011 A←(A+DPTR) 2
MOVC A,@A+PC 10000011 A←(A+PC) 2
第 3章 MCS-51指令系统
MOVC A,@A+DPTR
这条指令的执行结果只与指针 DPTR及累加器 A的内容有关,与
该指令存放的地址无关 。
例如在程序存储器中,依次存放 0~ F的七段数码显示器的字
模码 3F,06,5B,4F,66,6D,7D,07,7F,6F,77,7C、
39,5E,79,71,则当需要在 P1口输出某一数码,如,3”时,
可通过如下指令实现:
第 3章 MCS-51指令系统
MOV DPTR,#2000H ;假设字模存放在 2000H开始的程序存储器中,
通过该指令将字模首地址传送到 DPTR寄存器中
MOV A,#03H ;把待显示的数码传送到累加器 A中
MOVC A,@A+DPTR ; 2000H+03H,即 2003H单元的内容 (4F)读
到累加器 A中
MOV P1,A ;将数码, 3”对应的字模码, 4F”输出到 P1口
ORG 2000H
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
第 3章 MCS-51指令系统
MOVC A,@A+PC
这条指令是以 PC作为基址寄存器,A的内容作为无符号数
和 PC的内容 ( 下一条指令的起始地址)相加后得到一个 16
位的地址,并将该地址指出的程序存储器单元的内容送到累
加器 A。
如 ( A) =30H,执行地址 1000H处的指令
1000,MOVC A,@ A+PC
本指令占一个字节,下一条指令的地址为 1001H,( PC)
=1001H再加上 A中的 30H,得 1031H,结果将程序存储器中
1031H的内容送 A。
这条指令的优点是不改变特殊功能寄存器和 PC的状态,只要根据 A
的内容就可以取出表格中的常数。缺点是表格只能放在该条查表
指令后面的 256 个单元之中,表格的大小受到限制,而且表格只能
被一段程序所利用。
第 3章 MCS-51指令系统
在 MCS -51 单片机的内部 RAM中,可以设定一个先进后出的
区域,称其为堆栈。
进栈指令的功能是, 首先将堆栈指针 SP的内容加 1,然后将直接地址
所指出的内容送入 SP指出的内部 RAM单元 ;
出栈指令的功能是, 将 SP所指出的内部 RAM单元的内容送入由直
接地址所指出的字节单元,接着将堆栈指针 SP的内容减 1。
四,堆栈操作指令
指令名称 指令格式 机器码 功 能 指令周期
数据入栈 PUSH direct 11000000direct SP←SP+ 1(SP) ←(direct) 2
数据出栈 POP direct 11010000direct (direct)←(SP)SP ←SP -1 2
第 3章 MCS-51指令系统
例 1:当 SP=60H,A=30H,B=70H时,执行下列指令
PUSH A
PUSH B
结果( 61H) =30H ( 62H) =70H SP=62H
例 2:当 SP=62H,( 62H) =70H,( 61H) =30H,执行下列
指令 POP DPH
POP DPL
结果 ( DPTR) =7030H ( SP) =60H
第 3章 MCS-51指令系统
堆栈操作应注意的问题:
(1) 由于 MCS-51堆栈操作指令中的操作数只能使用直接
寻址方式, 不能使用寄存器寻址方式, 如将累加器 A压入堆
栈时, 指令格式为:
PUSH Acc ; Acc是累加器 A的寄存器名, 本质上属于直接寻址
在堆栈操作指令中,累加器 Acc不能简写为 A。
第 3章 MCS-51指令系统
(2) PUSH和 POP指令必须成对, 且入栈顺序与出栈顺序相反,
因此子程序结构如下:
PUSH PSW ;保护现场
PUSH Acc
…… ;子程序实体
POP Acc ;恢复现场
POP PSW
RET ;子程序返回
第 3章 MCS-51指令系统
五,字节交换指令
指令名称 指令格式 机器码 功 能 指令周 期
字节交换
指令
XCH A,Rn 11001rrr A和 Rn内容对调 1
XCH
A,direct
11000101
direct
A和 (direct)
内容对调 1
XCH A,@Ri 1100011i A和 (Ri)内容对调 1
低 4位对调 XCHD A,@Ri 1101011i A低 4位和 (Ri)低 4位对调 1
累加器半
字节交换 SWAP A 11000100
A高 4位与 A低 4
位对调 1
第 3章 MCS-51指令系统
【 例 3.4】 假设累加器 A的内容为 12H,而 R0的内容为 34H,
则执行:
XCH A,R0
指令后,累加器 A的内容为 34H,R0的内容为 12H,即 A和 R0
的内容交换了,这与数据传送指令不同,数据传送指令执行
后,源操作数内容传送到目的操作数中覆盖了目的操作数原
来的内容。
第 3章 MCS-51指令系统
【 例 3.5】 设累加器 A为 1EH,R0的内容为 2FH,内部 RAM
2F单元的内容为 37H,则执行,
XCHD A,@R0
指令后,累加器 A的内容为 17H,内部 RAM 2FH单元的内容将
为 3EH,即 A与寄存器 R0指定的内存单元的低 4位对调,而高 4
位不变。
第 3章 MCS-51指令系统
3.1.2 算术运算指令
1,加法指令
指令名称 指令格式 机器码 功能 指令周期
不带进位
加法指令
ADD A,Rn 00101rrr A←A+Rn 1
ADD A,direct 00100101direct A←A+(direct) 1
ADD A,@Ri 0010011i A←A+(Ri) 1
ADD A,#data 00100100data A←A+data 1
带进位
加法指令
ADDC A,Rn 00111rrr A←A+Rn+Cy 1
ADDC A,direct 00110101direct A←A+(direct)+Cy 1
ADDC A,@Ri 0011011i A←A+(Ri)+Cy 1
ADDC A,#data 00110100data A←A+data+Cy 1
第 3章 MCS-51指令系统
(1) 所有加法指令的目的操作数均是累加器 A,源操作数支持寄
存器, 直接, 寄存器间接, 立即数等四种寻址方式, 因此可以
将内部 RAM(00~ FFH),特殊功能寄存器以及 8位立即数与累加
器 A相加, 结果存放在累加器 A中 。
(2) 执行加法指令将影响进位标志 Cy,溢出标志 OV,辅助进
位标志 Ac以及奇偶标志 P。
加法运算时,若 b7位有进位,则 Cy为 1;反之为 0。 b7有进
位,表示两个无符号数相加时,结果大于 255,累加器 A只能存
放和的低 8位。
第 3章 MCS-51指令系统
如果位 6 有进位而位 7 无进位或位 6 无进位而位 7 有进位,置位
溢出标志 OV,结果溢出, 否则清, 0”OV。
两数相加后, 若 b3位向 b4位进位, 则 Ac为 1;反之为 0。
由于奇偶标志 P总是体现累加器 A中,1”的奇偶性,因此 P也会
改变。
例 A=53H,R0=FCH,执行指令 ADD A,R0
结果为,01010011
+) 11111100
1 01001111
A=4F,CY=1,AC=0,OV=0,P=1
第 3章 MCS-51指令系统
例 A=85H,R0=20H,20H=AFH,执行指令:
ADD A,@R0
10000101
+) 10101111
1 00110100
A=34H,CY=1,AC=1,OV=1,P=1
第 3章 MCS-51指令系统
在执行加法时,还要将上一次进位标志 Cy的内容也一起加进去,
对于标志位的影响也与普通加法指令相同。 设置带进位加法指
令的目的是为了实现多字节加法运算。
ADDC A,Rn
ADDC A,direct
ADDC A,@Ri
ADDC A,# data
第 3章 MCS-51指令系统
MOV A,30H ;将被加数低 8位传送到累加器 A中
ADD A,32H ;与加数低 8位, 即 32H单元内容相加, 结果存放在 A中
MOV 30H,A ;将和的低 8位保存到 30H单元中
MOV A,31H ;将被加数高 8位传送到累加器 A中
ADDC A,33H ;与加数高 8位, 即 33H单元内容相加, 结果存放在累加器 A中
MOV 31H,A ;将和的高 8位保存到 31H单元中
例如,可通过如下指令将存放在 30H,31H单元中的 16位二进制
数与存放在 32H,33H单元中的 16位二进制数相加 (假设结果存
放在 30H,31H中 ):
第 3章 MCS-51指令系统
2,减法指令
表 3-7 MCS-51减法指令
指令名称 指令格式 机器码 功 能 指令周期
带借位
减法指令
SUBB A,Rn 10011rrr A←A - Rn -Cy 1
SUBB A,direct 10010101direct A←A - (direct)- Cy 1
SUBB A,@Ri 1001011i A←A - (Ri)-Cy 1
SUBB A,#data 10010100data A←A - data-Cy 1
第 3章 MCS-51指令系统
这组指令的功能是, 将累加器 A的内容与第二操作数及进
位标志相减,结果送回到累加器 A中 。 在执行减法过程中, 如果
位 7( D7) 有借位,则进位标志 Cy置, 1”,否则清, 0”; 如果位 3
( D3) 有借位,则辅助进位标志 AC置, 1”,否则清, 0”; 如位 6
有借位而位 7 没有借位,或位 7 有借位而位 6 没有借位,则溢出
标志 OV置, 1”,否则清, 0”。
若要进行不带借位的减法操作,则必须先将 Cy清,0”。
第 3章 MCS-51指令系统
例 (A)=C9H (R2)=54H,CY=1,执行指令
SUBB A,R2
11001001
01010100
-) 1
01110100
结果 (A)=74H,CY=0,AC=0,OV=1
第 3章 MCS-51指令系统
【 例 3.6】 用减法指令求内部 RAM两单元的差值 (假设被减
数存放在内部 RAM 30H单元中, 减数存放在 31H单元中, 差
放在 40H单元中 )。
MOV A,30H ;先把被减数传送到累加器 A中
CLR C ;进位标志 Cy清零
SUBB A,31H ;与 31H单元内容相减
MOV 40H,A ;将结果传送到 40H单元中
第 3章 MCS-51指令系统
3,加 1指令
指令名称 指令格式 机器码 功 能 指令周期
增量指令
INC A 00000100 A←A+ 1 1
INC Rn 00001rrr Rn←Rn+ 1 1
INC direct 00000101direct (direct)←(direct)+1 1
INC @Ri 0000011i (Ri)←(Ri)+ 1 1
INC DPTR 10100011 DPTR←DPTR+1 2
这组指令的功能是:将指令中所指出操作数的内容加 1。 若原来
的内容为 0FFH,则加 1 后将产生溢出,使操作数的内容变成 00H,。
最后一条指令是对 16 位的数据指针寄存器 DPTR执行加 1操作,指
令执行时,先对低 8 位指针 DPL的内容加 1,当产生溢出时就对高
8 位指针 DPH加 1,但不影响任何标志。
第 3章 MCS-51指令系统
加 1指令不影响标志位, 只有操作对象为累加器 A时, 才影响奇
偶标志位 P。
INC A ;通过增量指令使累加器 A内容加 1
该指令除了影响奇偶标志位 P外, 不影响其他标志位 。
ADD A,#01H ;通过加法指令使累加器 A内容加 1
该指令同样会使累加器 A内容加 1,但这条指令将影响 Cy、
OV,Ac以及 P标志位, 且该指令的机器码占用两个字节 。
当操作数是某一 I/O口,如,INC P1,时,先将 P1口锁存器
内容读出,加 1后,再写入 P1口锁存器中,因此 INC Pi(i=0,1,2,3)
属于“读 —改 —写”指令。
第 3章 MCS-51指令系统
4,减 1指令
指令名称 指令格式 机器码 功 能 指令周期
减 1指令
DEC A 00010100 A←A - 1 1
DEC Rn 00011rrr Rn←Rn - 1 1
DEC direct 00010101direct (direct)←(direct)- 1 1
DEC @Ri 0001011i (Ri)←(Ri) - 1 1
这组指令的功能是, 将指出的操作数内容减 1。 如果原来的操
作数为 00H,则减 1 后将产生下溢出,使操作数变成 0FFH,除操
作数为 A外, 不影响任何标志 。
第 3章 MCS-51指令系统
5,乘法指令
指令名称 指令格式 机器码 功 能 指令周期
A× B MUL AB 10100100 BA←A × B 4
被乘数放在累加器 A(8位无符号数 )中, 乘数放在寄存器 B(8
位无符号数 )中, 乘积 (16位无符号数 )的高 8位放在寄存器 B中,
低 8位放在累加器 A中 。
该指令影响标志位:当结果大于 255时,OV为 1;反之为 0。
进位标志 Cy总为 0; AC保持不变;奇偶标志 P随累加器 A中,1”
的个数变化而变化。
第 3章 MCS-51指令系统
6,除法指令
指令名称 指令格式 机器码 功 能 指令周期
A÷ B DIV AB 10000100 A(商 )←A ÷ BB(余数 )←A ÷ B 4
被除数放在累加器 A(8位无符号数 )中, 除数放在寄存器 B(8
位无符号数 )中, 商 (8位无符号数 )放在累加器 A中, 余数 (8位无
符号数 )放在寄存器 B中 。
该指令影响标志位:如果除数 (即寄存器 B)不为 0,执行该指
令后,溢出标志 OV、进位标志 Cy总为 0;如果除数为 0,执行后,
结果将不确定,且 OV为 1,Cy仍为 0。 AC保持不变;奇偶标志 P
位随累加器 A中,1”的个数变化而变化。
第 3章 MCS-51指令系统
指令名称 指令格式 机器码 功 能 指令周 期
BCD加法
调正 DA A
1101010
0
根据进位标志 Cy,辅助进位
标志 Ac以及累加器 A中结果,
将累加器 A内容转化为 BCD码
形式
1
7,十进制加法调正指令
对累加器 A参与的 BCD码加法运算所获得的 8 位结果进行十进制
调整,使累加器 A中的内容调整为二位压缩型 BCD码的数。使用
时必须注意,它只能跟在加法指令之后,不能对减法指令的结果进
行调整,且其结果不影响溢出标志位。
第 3章 MCS-51指令系统
执行该指令时,判断 A中的低 4 位是否大于 9 和辅助进位
标志 AC是否为, 1”,若两者有一个条件满足,则低 4 位加 6 操
作 ; 同样,A中的高 4 位大于 9 或进位标志 Cy为, 1”两者有一个
条件满足时,高 4 位加 6 操作 。
例如, 有两个 BCD数 36 与 45 相加,结果应为 BCD码 81,程序如下,
第 3章 MCS-51指令系统
MOV A,# 36H
ADD A,# 45H
DA A
这段程序中,第一条指令将立即数 36H(BCD码 36)送入累
加器 A; 第二条指令进行如下加法,
0 0 1 1 0 1 1 0 36
0 1 0 0 0 1 0 1 45
0 1 1 1 1 0 1 1 7B
0 0 0 0 0 1 1 0 06+
+
1 0 0 0 0 0 0 1 81
得结果 7BH; 第三条指令对累加器 A进行十进制调整,低 4 位
(为 0BH)大于 9,因此要加 6,得调整的 BCD码 81。
第 3章 MCS-51指令系统
值得注意的是,十进制调正指令一般放在加法指令后, 用
于十进制加法调正, 不能单独使用, DA A”指令将累加器 A中的
内容转化为 BCD码 。
MCS-51没有提供 BCD码减法调正指令, 但可以通过, 补码,
概念, 将 BCD码减法运算变成 BCD码加法运算 。
两位 BCD可以表示 00~ 99,需要用 8位二进制存放;三位 BCD
可以表示 000~ 999,需要用 12位二进制存放;四位 BCD可以表
示 0000~ 9999之间的数,需要用 16位二进制存放,因此:
XY-xy=XY+100-xy
第 3章 MCS-51指令系统
(100的 BCD需要用三位二进制存放, 其中的 1自然丢失 。 )
当 XY≥xy时,, XY+100-xy”就是 XY-xy;当 XY< xy时,
,XY+100-xy”是, XY-xy”的补码 。
为了能用减法指令求出,100-xy”的 BCD码,可用,9AH”
表示,100-xy”算式中十进制数,100”(因为,9AH”加,6”调正
后就是,100H”)。
第 3章 MCS-51指令系统
【 例 3.9】 假设两位 BCD码形式的被减数, 减数分别存放
在 VAR1和 VAR2单元中, 试编写一程序段求, VAR1-VAR2”,
结果存放在 VAR3单元中 。
参考程序如下:
CLR C ; 清进位标志 Cy
MOV A,#9AH ; 把 BCD码, 100”等效表示码送累加器 A
SUBB A,VAR2 ; 计算, 100-VAR2”,结果为 BCD形式
ADD A,VAR1; 加被减数
DA A ; 调正
MOV VAR3,A; 保存,VAR1-VAR2”结果
第 3章 MCS-51指令系统
【 例 3.10】 将 R2中以压缩形式存放的两位 BCD码减 1。
与上例有所不同, 减 1相当于加 99(其实 9AH减 1就是 99H)。 因
此, 实现两位 BCD码减 1的程序如下:
MOV A,R2
ADD A,#99H
DA A
MOV R2,A
对于 3位 BCD码来说,XYZ-xyz=ZYX+1000-xyz。
同理,为了能用减法指令求出,1000-xyz”的 BCD码,可用
,99AH”表示,1000-xyz”算式中十进制数,1000”(因为,99AH”
加,6”调正后就是,1000H”)。
第 3章 MCS-51指令系统
【 例 3.11】 三位压缩形式 BCD码被减数存放在 81H,80H单
元中,减数存放在 31H,30H单元中,试编写一程序段求出两
者的差,结果存放在 81H,80H单元中。
CLR C
MOV A,#9AH
SUBB A,30H ; 低 8位相减
MOV R2,A ; 暂时保存低 8位中间结果
MOV A,#09H
SUBB A,31H ; 高 4位相减
ANL A,#0FH ; 屏蔽高位
第 3章 MCS-51指令系统
MOV R3,A ; 暂时保存高 8位中间结果
MOV R0,#80H
MOV A,@R0 ; 取被减数低 8位
ADD A,R2 ; 低 8位相加
DA A ; 调正
MOV @R0,A ; 保存和的十位、个位
INC R0 ; R0加 1
MOV A,@R0 ; 取被减数百位
ADDC A,R3 ; 百位相加
DA A ; 调正
ANL A,#0FH ; 屏蔽高 4位
MOV @R0,A ; 保存百位
第 3章 MCS-51指令系统
【 例 3.12】 将 R3/R2中以压缩形式存放的三位 BCD码减 1。
三位 BCD减 1,相当于加 999(其实 99AH减 1就是 999H)。因
此,实现三位 BCD码减 1的程序如下:
MOV A,R2 ;取十位、个位
ADD A,#99H
DA A
MOV R2,A ;保存加 99后十、个位结果
MOV A,R3 ;取百位
ADDC A,#09H
DA A ;百位加 9并调正
ANL A,#0FH ;屏蔽高 4位
MOV R3,A ;保存百位
第 3章 MCS-51指令系统
3.1.3 逻辑运算指令
逻辑非 (即取反运算 )、与、或、异或以及循环移位操作等。
A
除以累加器 A为目标寄存器指令外,其余指令均不会改变
PSW中的任何标志。
第 3章 MCS-51指令系统
一、
ANL A,Rn
ANL A,direct
ANL A,@Ri
ANL A,# data
ANL direct,A
ANL direct,# data
这组指令的功能是, 将两个操作数的内容按位进行逻辑与
操作,并将结果送回目的操作数的单元中。
第 3章 MCS-51指令系统
?
例 已知 M1单元中有一个 9的 ASCII码 39H,试通过编程把
它变位 BCD码(即:高 4位变为 0,低 4位不变)。
① ANL M1,#0FH
② MOV A,M1
ANL A,#0FH
MOV M1,A
例 设 M1中内容为带符号数,若要取出它的符号位,则
ANL M1,#80H
逻辑与指令主要用于从某个存储单元中取出某几位,而
把其他位变为 0。
第 3章 MCS-51指令系统
ORL A,Rn
ORL A,direct
ORL A,@Ri
ORL A,# data
ORL direct,A
ORL direct,# data
这组指令的功能是, 将两个操作数的内容按位进行逻辑或操
作,并将结果送回目的操作数的单元中。
第 3章 MCS-51指令系统
用于对某个存储单元或累加器 A中的数据进行变换,使其中的
某些位为 1而其余位不变。
例 设 A=0AAH,P1=0FFH,试通过编程把累加器 A中的低 4位送入
P1口低 4位,P1口高 4位不变。
MOV R0,A
ANL A,#0FH
ANL P1,#0F0H
ORL P1,A
MOV A,R0
第 3章 MCS-51指令系统
三、
XRL A,Rn
XRL A,direct
XRL A,@Ri
XRL A,# data
XRL direct,A
XRL direct,# data
这组指令的功能是, 将两个操作数的内容按位进行逻辑异
或操作,并将结果送回到目的操作数的单元中。
第 3章 MCS-51指令系统
可用来对某个存储单元或累加器 A中的数据进行变换,使其
中某些位变反而其余位不变。
例 以知外部 RAM30H中有一数 AAH,现欲令高 4位不变
和低 4位取反,试编出它相应的程序。
MOV R0,#30H
MOVX A,@ R0
XRL A,#0FH
MOVX @ R0,A
第 3章 MCS-51指令系统
四,逻辑清零取反移位操作指令
CLR A ; 对累加器 A清, 0”
CPL A; 对累加器 A
RL A; 累加器 A的内容向左环移 1
RLC A; 累加器 A的内容带进位标志位向左环移 1
RR A; 累加器 A的内容向右环移 1
RRC A; 累加器 A的内容带进位标志位向右环移 1
这组指令的功能是, 对累加器 A的内容进行简单的逻辑操
作。除了带进位标志位的移位指令外,其它都不影响 Cy,AC,
OV等标志。
第 3章 MCS-51指令系统
取反指令常用于对某个存储单元或某个存储区域中带符号数
的求补。
例 以知 30H单元有一整数 X,试写出求 -X补码的程序。
MOV A,30H
CPL A
INC A
MOV 30H,A
第 3章 MCS-51指令系统
例 已知 M1和 M1+1单元中有一个 16位的二进制( M1中为低 8位),
请通过编程令其扩大到二倍(设该数扩大后小于 65536)。
一次 16位二进制数扩大二倍就等于把它进行一次算术左移。
CLR C
MOV R1,#M1
MOV A,@ R1
RLC A
MOV @ R1,A
INC R1
MOV A,@ R1
RLC A
MOV @ R1,A
第 3章 MCS-51指令系统
这类指令的特点是不影响程序状态字寄存器 PSW中的标志位 。
只有带进位 Cy循环移位时, 才影响 Cy和奇偶标志 P。 所有逻辑运
算均按位进行
常用,ANL”指令将操作数中指定位清零,在构造立即数
时,希望清零位设为 0,其他位为 1。
常用逻辑或,ORL”指令将操作数中指定位置 1,在构造立即数
时,希望置 1位为 1,其他位为 0。
常用逻辑异或,XRL”指令将操作数中指定位取反,在构造立
即数时,希望取反位为 1,其他位为 0。
第 3章 MCS-51指令系统
左循环移位, RL A”也常用于实现乘 2n(如乘 2,4,8等 )运算 。
例如, 当需要对累加器 A进行乘 4运算时, 如果 A小于 3FH,用
如下两条左循环移位指令完成比用乘法指令效果更好 ——速度
快, 代码短 。
RL A ;左循环移位一次, 相当于乘 2
RL A ;再左循环移位一次
以上两条指令执行时间需要 2× 1个机器周期, 代码长度为
2× 1字节, 通过如下乘法实现需要 6个机器周期 (2+4),代码长
度为 4字节 (3+1)。
MOV B,#04H ; ?3字节, 执行时间为 2个机器周期
MUL AB ; ?1字节,执行时间为 4个机器周期
第 3章 MCS-51指令系统
3.1.4 位操作指令
位存储器包括了内部 RAM中 20H~ 2FH单元的位存储区以及特殊
功能寄存器中支持位寻址的所有位 。
1,位数据传送指令
MOV C,bit
MOV bit,C
这组指令的功能是, 把源操作数指出的布尔变量送到目的操
作数指定的位地址单元中。其中一个操作数必须为进位标志 Cy,
另一个操作数可以是任何可直接寻址位。
第 3章 MCS-51指令系统
C)bit( )bit(
2,
CLR C
CLR bit
CPL C
CPL bit
SETB C
SETB bit
这组指令对操作数所指出的位进行清, 0”#,
取反 #,置, 1”的操作,不影响其它标志。
第 3章 MCS-51指令系统
3,
ANL C,bit
ANL C,/bit
这组指令的功能是, 如果源位的布尔值是逻辑 0,则将进位
标志清, 0”; 否则,进位标志保持不变,不影响其它标志。 bit前
的斜杠表示对 (bit)取反,直接寻址位取反后用作源操作数,但不
改变直接寻址位原来的值。例如指令, ANL C,/ACC.0 执行前
ACC.0 为 0,C为 1,则指令执行后 C为 1,而 ACC.0仍为 0。
第 3章 MCS-51指令系统
4,位变量逻辑或指令
ORL C,bit
ORL C,/bit
这组指令的功能是, 如果源位的布尔值是逻辑 1,
则将进位标志置, 1”; 否则,进位标志保持不变,不影
响其它标志。
第 3章 MCS-51指令系统
MCS-51没有提供位异或运算指令, 当需要位异或运算时,
可通过位逻辑与, 或指令得到, 因为 。 例如,
设 X,Y,Z均为位地址变量, 则可通过如下指令求 X,Y位变量
的异或结果:
MOV C,X ; 位变量 X送 Cy
ANL C,/Y ;
MOV Z,C ; 暂存
MOV C,Y ; 位变量 Y送 Cy
ANL C,/X ;
ORL C,Z ; ?C←
MOV Z,C ; 保存 X,Y异或运算结果
YXYXYX ???
第 3章 MCS-51指令系统
3.1.5 控制及转移指令
1,无条件跳转指令
指令名称 指令格式 机器码 功 能 指令周期
绝对无条件跳
转 AJMP addr11
a10a9a800001
a7~ a0
PC←PC+ 2
PC10~ 0←addr 11
PC15~11不变
2
长跳转 LJMP addr16
00000010
a15~a8
a7~ a0
PC←addr 15~0 2
短跳转 SJMP rel 10000000rel PC←PC+ 2PC←PC+rel 2
间接跳转 JMP@A+DPTR 01110011 PC←A+DPTR 2
第 3章 MCS-51指令系统
无条件跳转指令的含义是执行了该指令后, 程序将无条件跳到
指令中给定的存储器地址单元执行, 其中:
(1) 长跳转指令给出了 16位地址, 该地址就是转移后要执行的
指令码所在的存储单元地址 。 因此, 该指令执行后, 将指令中给
定的 16位地址装入程序计数器 PC。 长跳转指令可使程序跳到 64
KB范围内的任何单元执行,?常用于跳到主程序, 中断服务程序入
口处, 如:
ORG 0000H
LJMP Main ;其中 Main是主程序入口地址标号
ORG 0003H
LJMP INT0 ; INT0是外中断 0服务程序入口地址标号
第 3章 MCS-51指令系统
(2) 绝对跳转指令 AJMP只需 11位地址,即该指令执行后,
仅将指令中给定的 11位地址装入程序计数器 PC的低 11位,而高
5位 (即 PC15~ 11)保持不变,因此 AJMP指令只能实现 2?KB范围内
的跳转,即转入的存储单元地址的高 5位地址编码与 PC计数器
当前值的高 5位必须相同,否则就出现跨页错误。
假设,AJMP 267BH”指令存放在 2000H单元,由于该指令占用两
个字节,执行了该指令后,PC=2002H,即 00100 00000000010B,
由于低 11位地址由 AJMP指令给出,可见跳转目标地址范围在
00100 00000000000B~ 00100 11111111111B,即 2000H~ 27FFH之
间,包含了,267B”,因而能够跳转。
第 3章 MCS-51指令系统
(3) 短跳转指令, SJMP rel”中的 rel是一个带符号的 8位地址,
范围在 -128~ +127之间, 当偏移量为负数 (用补码表示 )时, 向前
跳转;而当偏移量为正数时, 向后跳转 。
由于 SJMP指令占两个字节, 执行该指令后, PC=xxxx+2
(xxxx是 SJMP指令码的首地址 )。 当 rel为 FEH,即 -2时, 跳转地址
等于 PC=xxxx+2-2=xxxx,即又跳回 SJMP指令码首地址单元, 将
不断重复执行 SJMP指令, 相当于动态停机 。 在汇编语言中, 常
写成:
Here,SJMP Here
或 SJMP $
第 3章 MCS-51指令系统
(4) 在间接跳转,JMP @A+DPTR”指令中,将 DPTR内容与
累加器 A相加,得到的 16位地址作为 PC的值。因此,通过该指
令可以动态修改 PC的值,跳转地址由累加器 A控制,常用作多
分支跳转指令。
第 3章 MCS-51指令系统
2,调用指令
指令名称 指令格式 机器码 功 能 指令周 期
绝对调用 ACALL addr11 a10a9a810001a
7~ a0
PC←PC+2
SP←SP+1
(SP)←PC 低 8位
SP←SP+1
(SP)←PC 高 8位
PC10~ 0←addr11
PC15~11不变
2
长调用 LCALL addr16
00010010
a15~ a8
a7~ a0
PC←PC+3
SP←SP+1
(SP)←PC 低 8位
SP←SP+1
(SP)←PC 高 8位
PC←addr 15~ 0
2
第 3章 MCS-51指令系统
可见调用指令与跳转指令不同:调用指令用于执行子程序,
调用指令中的地址就是子程序的入口地址,子程序执行结束后,
要返回主程序继续执行。因此,调用时,需要将指令指针 PC压
入堆栈,保存 PC的当前值,以便在子程序结束前,通过 RET指
令正确返回,例如:
……
LCALL SUB1 ;调用子程序 SUB1
MOV 2FH,A
……
ORG 3000H
SUB1:
PUSH PSW
……
POP PSW
RET
第 3章 MCS-51指令系统
假设 LCALL SUB1指令机器码从 1003H单元开始存放, 由于
该指令占 3字节, 则该指令后的, MOV 2FH,A”指令机器码将从
1006H单元存放 。 执行了, LCALL SUB1”指令后, PC也是
1006H,正好是该指令下一条指令机器码的首地址, 为了能够返
回, 先将 1006H(即 06H,10H)压入堆栈, 然后再将 SUB1标号对
应的存储单元地址, 即子程序入口地址装入 PC,执行子程序中
的指令系列, 当遇到 RET指令后, 又自动将堆栈中的 1006H,即
断点地址传送到 PC中, 返回主程序, 继续执行 。 而与之类似的
长跳转执行, 仅将指令中的存储器地址装入 PC,由于没有保护
跳转前的 PC值, 因此无法返回 。
绝对调用指令 ACALL与绝对跳转指令类似,目标地址与 PC
当前值的高 5位必须相同。
第 3章 MCS-51指令系统
3,返回指令
表 3-17 MCS-51调用指令
指令名称 指令格式 机器码 功 能 指令周 期
子程序返回
指令 RET 00100010
PC高 8位 ← (SP)
SP←SP - 1
PC低 8位 ← (SP)
SP←SP - 1
2
中断返回指
令 RETI 00110010
PC高 8位 ← (SP)
SP←SP - 1
PC低 8位 ← (SP)
SP←SP - 1
2
第 3章 MCS-51指令系统4,条件跳转指令
表 3-18 MCS-51条件跳转指令
C)bit( )bit(
二,条件转移指令
JZ rel; ( A) = 0
JNZ rel; ( A) ≠0
这类指令是依据累加器 A的内容是否为 0 的条件转移指
令。条件满足时转移(相当于一条相对转移指令),条件不
满足时则顺序执行下面一条指令。转移的目标地址在以下
一条指令的起始地址为中心的 256 个字节范围之内(-
128~ +127)。当条件满足时,PC←(PC)+N+rel,其中 (PC)
为该条件转移指令的第一个字节的地址,N为该转移指令的
字节数(长度),本转移指令 N=2。
第 3章 MCS-51指令系统
三、
在 MCS - 51 中没有专门的比较指令,但提供了下面 4 条比
较不相等转移指令,
CJNE A,direct,rel
CJNE A,# data,rel
CJNE Rn,# data,rel
CJNE @Ri,# data,rel
这组指令的功能是, 比较前面两个操作数的大小,如果它
们的值不相等则转移。转移地址的计算方法与上述两条指令相
同。如果第一个操作数(无符号整数)小于第二个操作数,则
进位标志 Cy置,1”,否则清,0”,但不影响任何操作数的内容
第 3章 MCS-51指令系统
四,减 1不为 0
DJNZ Rn,rel
DJNZ direct,rel
这两条指令把源操作数减 1,结果回送到
源操作数中去,如果结果不为 0 则转移(转移
地址的计算方法同前)。
该指令不影响标志位。
第 3章 MCS-51指令系统
位变量条件转移指令
JC rel; 若 (Cy)=1,则转移 PC←(PC)+2+rel
JNC rel; 若 (Cy)=0,则转移 PC←(PC)+2+rel
JB bit,rel; 若 (bit)=1,则转移 PC←(PC)+3+rel
JNB bit,rel; 若 (bit)=0,则转移 PC←(PC)+3+rel
JBC bit,rel; 若 (bit)=1,则转移 PC←(PC)+3+rel,
并 bit← 0
第 3章 MCS-51指令系统表 3-18 MCS-51条件跳转指令
第 3章 MCS-51指令系统
(1)“CJNE”指令中的操作数均是无符号数, 执行时, 将第一
操作数与第二操作数进行比较, 并根据比较结果, 对 Cy置 1或 0。
当两个操作数不等时, 跳转 。 例如,, CJNE A,#data,rel”指令
执行时, 根据 A减去 data是否出现借位来设置 Cy标志, 不相同,
则跳转 。 但指令执行后, 不改变两个操作数内容, 即相减后不
返回结果 。
(2)“JCrel”指令适用于, a< b”时跳转的判别, 例如:
CLR C ;清进位标志 Cy,以便使用带进位减法指令
SUBB A,R2 ;假设 a已传送到累加器 A中, b存放在寄存器 R2中
JC rel ;当 Cy为 1,即 A<R2,也就是 a<b时,跳转
第 3章 MCS-51指令系统
(3)“JNCrel”指令适用于, a≥b”时跳转的判别, 例如:
CLR C ;清进位标志 Cy,以便使用带进位减法指令
SUBB A,R2 ;假设 a已传送到累加器 A中, b存放在寄存器 R2中
JNC rel ;当 Cy为 0,即 A≥R2,也就是 a≥b时, 跳转
(4)“JZ rel”指令适用于, a=b”时跳转的判别, 例如:
CLR C ;清进位标志 Cy,以便使用带进位减法指令
SUBB A,R2 ;假设 a已传送到累加器 A中, b存放在寄存器 R2中
JZ rel ;当累加器 A为 0,即 A=R2,也就是 a=b时, 跳转
第 3章 MCS-51指令系统
(5)“DJNZ Rn,rel”及, DJNZ direct,rel” 指令用在循环程
序段中, 例如:
MOV R2,#08H ;将循环次数存放在 R2中
LOOP:
DJNZ R2,LOOP ; R2减 1后, 如果不为 0,则跳到
LOOP标号对应的存储单元执行
由于 LOOP对应的存储单元就是本指令机器码的首字节,
因此将按指定次数重复执行。
第 3章 MCS-51指令系统
(6) 在手工汇编时, 需要计算相对转移地址 rel。 在短跳转
指令 (SJMP)和条件转移指令中的跳转地址 rel是一个带符号的 8
位地址, 范围在 -128~ +127之间, 当偏移量为负数 (用补码表
示 )时, 向前跳转;而当偏移量为正数时, 向后跳转, rel由下
式决定:
rel=补码 [目标地址 -(转移指令地址 +指令长度 )]
假设下列程序段存放在 2000H开始单元中,则
第 3章 MCS-51指令系统
地址 指令码 源程序
2000 90 40 00MOV DPTR,#4000H ;初始化数据指针
2003 78 37 MOV R0,#37H ;把内部 RAM首地址传送到 R0中
2005 79 07 MOV R1,#07H ;臵计数器初值
2007 E9 LOOP,MOV A,R1
2008 93 MOVC A,@A+DPTR ;从程序存储器中读数据并放在 Acc中
2009 F6 MOV @R0,A ;把数据存放在 R0指定的内部 RAM中
200A 18 DEC R0 ;指向上一内部 RAM
200B D9 FA DJNZ R1,LOOP ; R1不为 0转移
200D E9 MOV A,R1
200E 93 MOVC A,@A+DPTR
200F F6 MOV @R0,A ;把程序存储器 4000H单元传送到内部; RAM 30单元中
第 3章 MCS-51指令系统
由于转移目标地址为 2007,跳转指令地址为 200B,该指
令长度为 2字节, 因此偏移
地址
rel= 补码 [2007-(200B+2)]
= 补码 [-6]
= FA
第 3章 MCS-51指令系统
【 例 3.13】 在单片机应用系统中, 常需要根据某些输入引
脚电平状态变化, 执行相应操作 。 试编写一程序段检测 P3.2引
脚状态的变化执行相应操作:如果 P3.2引脚由高电平变为低电
平, 则 P1.0引脚输出高电平;反之, 如果 P3.2引脚由低电平变
高电平, 则 P1.0引脚输出低电平;如果 P3.2引脚电平没有变化,
则不改变 P1.0引脚状态 。
P32S Bit 00H ; 假设 P3.2引脚状态存放在 P32S位单元中
Xbit Bit 01H ; 定义 Xbit位变量
Zbit Bit 02H ; 定义 Zbit位变量
第 3章 MCS-51指令系统
MOV C,P32S ; 取上一次测试结果
MOV Xbit,C
MOV C,P3.2 ; 读 P3.2引脚当前状态
MOV P32S,C ; 存本次检测结果; 以前状态与当前状态异或
ANL C,/Xbit
MOV Zbit,C
MOV C,Xbit
ANL C,/P32S
ORL C,Zbit ; 异或结果在 Cy中
JNC,EXIT ; 结果为 0,说明 P3.2引脚电平没有变化退出
第 3章 MCS-51指令系统
JB P32S,SETP10Z ; 异或结果为 1,说明 P3.2引脚电平有变化,
且 P3.2引脚当前为高电平,; P1.0引脚输出低电平
SETB P1.0 ; 异或结果为 1,说明 P3.2引脚电平有变化,
且 P3.2引脚当前为低电; 平,P1.0引脚输出低电平
SJMP EXTT
SETP10Z:
CLR P1.0
EXIT,
第 3章 MCS-51指令系统
5,空操作指令
表 3-19 MCS-51空操作指令
指令名称 指令格式 机器码 功 能 指令周 期
空操作 NOP 00000000 PC←PC+1 1
执行空操作指令 NOP时,CPU什么事也没有做,但确消耗
了执行时间,常用于实现短时间的延迟或等待。
第 3章 MCS-51指令系统
3.2 汇编语言程序设计基础
3.2.1 汇编语言程序结构
单片机汇编程序结构与通用微机汇编程序结构略有不同, 原
因是:
(1) 一般没有可以直接利用的监控程序, 所有程序均要自己
编写 。
(2) 没有像 X86汇编语言程序那样,可直接调用系统提供的中
断功能 (如 BIOS中断,DOS中断 )或 Windows的 API函数完成特定
操作,即所有子程序 (如键盘监控子程序、显示驱动程序、中断
服务程序等 )均需要自己编写。
第 3章 MCS-51指令系统
1,?MCS-51程序总体结构
MCS-51汇编语言源程序一般由主程序, 完成特定操作的子
程序 (可能不止一个 )及相应功能的中断服务程序等部分组成,
结构如下:; ---------------程序头 (即定义变量和等值符号 )---------
SCL BIT P1.2 ;定义 SCL位变量
SDA BIT P1.3 ;定义 SDA位变量
ByteCon DATA 30H ;定义字节变量 ByteCon
……
第 3章 MCS-51指令系统
ORG nnnn ; CPU复位后, 第一指令机器码存放单元地址, 具体
值由 CPU类型决定 。 例如, 在 MCS-51中, 复位后 PC=0000,
因此在 MCS-51中, 第一条指令存放在程序存储器;的 0000H单元中, 即 nnnn为, 0000H”
LJMP Main ;一般第一条指令是跳转指令, 跳到主程序入口
地址, 其中, Main”是主程序入口;地址标号 。 主程序不能直接存放在复位后 PC
指向的存 储单元, 原因是这一区域往;往是中断服务程序的入口地址, 不能覆盖, 否
则不能 使用相应的中断功能 。 例如;在 MCS-51中, 外部中断 0的入口地址为 0003H,
显然只 有 0000H,0001H和 0002H;三个单元,刚好可以存放一条长跳转指令的机器码
第 3章 MCS-51指令系统; ------------------主程序 ------------------------
ORG yyyy ;其中 yyyy就是主程序代码存放区的首地址,如 0100H
Main:
MOV SP,#5FH ;初始化有关寄存器,如设臵堆栈指针 SP、选择工作
寄存器组、;初始化中断控制寄存器等
…… ;主程序实体,具体指令由程序功能决定
LCALL SUB1 ;调用子程序 1,其中 SUB1为子程序名
……; ------------------子程序结构 ------------------------
第 3章 MCS-51指令系统
ORG zzzz ;其中 zzzz就是子程序代码存放区的首地址,可以不
用 ORG;指令,直接将子程序存放主程序后
SUB1:
PUSH PSW
PUSH Acc ;通过 PUSH指令保护子程序中用到的有关寄存器,
如 Acc、; PSW等,即保护现场
…… ;子程序实体,具体指令由程序功能决定
POP Acc
POP PSW ;恢复现场
RET ;子程序最后一条指令,使子程序指令运行结束后,
返回主程;序断点; ------------------中断服务程序结构 ------------------------
第 3章 MCS-51指令系统
ORG kkkk ;其中 kkkk就是中断程序代码存放区的首地址
PUSH PSW
PUSH Acc ;通过 PUSH指令保护中断服务程序中用到的有关寄存器,;如 Acc,PSW等,即保护现场
…… ;中断服务程序实体,具体指令由程序功能决定
POP Acc
POP PSW ;恢复现场
CLR TI ;清除中断标志 (在 MCS-51中,对于电平触发的外中断
INT0和 INT1、串行;接收及发送中断 RI,TI等,不自动清除,需要;在中断
服务结束前,通过; CLR指令清除
RETI ;中断服务程序最后一条指令,返回主程序断点
第 3章 MCS-51指令系统
为了确保子程序, 中断服务程序运行结束后, 能够正确返回,
从断点处继续执行主程序, 必须注意在子程序以及中断服务程
序中堆栈操作指令的匹配问题, 否则将无法返回 。 例如, 在上
述子程序结构中, 假设 SUB1子程序入口地址为 2000H,即主程
序内, LCALL SUB1”指令等效于, LCALL 2000”。 假设该指令
机器码首地址为 1000H,且指令执行前, SP=5FH,则, LCALL
2000”指令执行过程中 PC和 SP内容如下:
(1) ?PC←PC+ 3,即 PC=1003H(即断点地址 );
(2) ?SP←SP+ 1,即 SP=60H,并把 PC低 8位压入堆栈, 于是
(60H)=03;
(3) ?SP←SP+ 1,即 SP=61H,并把 PC高 8位压入堆栈, 于
是 (61H)=10;
(4) 把 SUB1入口地址装入 PC,即 PC=2000H。
第 3章 MCS-51指令系统
可见,, LCALL 2000”指令执行后, PC=2000H,已指向子程
序 SUB1第一条指令所在的存储单元地址; SP=61H。
在子程序中
PUSH Acc ;执行后, SP=62H,(62H)就是 Acc的当前
值, 假设为 XX
PUSH PSW ;执行后, SP=63H,(63H)就是 PSW的当前
值, 假设为 YY
第 3章 MCS-51指令系统
返回前
POP PSW ;执行后, PSW←(SP), 即将 (63H)单元中原来的 PSW返回
给 PSW;; SP←SP - 1,即 SP=62H
POP Acc ;执行后, ACC←(SP), 即将 (62H)单元中原来的 Acc返回给
Acc; SP←SP - 1,;即 SP=61H
RET ;执行后, PC高 8位 ← (SP),即将 (61H)单元内容 10H传给
PC高 8位,; SP←SP - 1,即 SP=60H; PC低 8位 ← (SP),即将 (60H)单
元内容 03H传给 PC;低 8位,SP←SP - 1,即 SP=5FH,结果 PC=1003H(重新装
入主程序断点地址 )
第 3章 MCS-51指令系统
2,常见实用程序设计举例
【 例 3.14】 将外部 RAM 0080H~ 0081H单元内容传送到内部
RAM的 30H~ 31H单元中 。
MOV DPTR,#0080H ; 外部 RAM单元地址 0080H送 DPTR
MOVX A,@DPTR ; 外部 RAM 0080H单元内容送累加器 A
MOV 30H,A ; 累加器 A送内部 RAM的 30H单元, 即外部
RAM的 (0080H); 送内部 RAM的 (30H)
INC DPTR ; DPTR加 1
MOVX A,@DPTR ; 外部 RAM的 (0081H)单元内容送 A
MOV 31H,A ; 累加器 A送内部 RAM的 31H单元, 即外部
RAM的 (0081H); 送内部 RAM的 31H单元
第 3章 MCS-51指令系统
2) 循环结构
【 例 3.15】 将外部 RAM 0080H~ 009FH单元内容传送到内
部 RAM的 30H~ 4FH单元中 。
由于需要传送 32字节, 不能再用例 3.12所示顺序程序结构,
否则程序将很长 。 为此, 可用循环结构程序实现, 以提高编程
效率 。
循环程序由初始化部分、循环体部分、包含条件跳转指令
的循环控制部分组成。例如,实现例 3.15功能的参考程序如下:
第 3章 MCS-51指令系统; ***********初始化 **************
MOV R7,#20H ; 初始化循环次数
MOV DPTR,#0080H ; 初始化数据指针
MOV R0,#30H ; 把内部 RAM存储区首址 30H传送到寄存器 R0中; ************循环体 ***********
LOOP:
MOVX A,@DPTR ; 外部 RAM送累加器 A
MOV @R0,A ; 累加器 A送内部 RAM
INC R0 ; ?R0加 1,指向下一内部 RAM单元
INC DPTR ; 数据指针加 1,指向下一外部
RAM单元; *******循环控制指令 ********
DJNZ R7,LOOP ; 如果 R7没有减到 0,则跳转到标号为
LOOP处继续执行
第 3章 MCS-51指令系统
【 例 3.16】 16× 16点阵字库的点阵信息存放在程序存储
器中, 假设首地址为 CHINESE,每一 16× 16点阵汉字占 32字
节, 试编写一子程序将顺序号 (即机内码 )为 n(n=0,1,2,… )的
16× 16点阵字模信息送内部 RAM的 30H~ 4FH单元中 。
参考程序如下 (汉字顺序号存放在 2FH单元中,子程序名
为 CHTORAM):
第 3章 MCS-51指令系统
CHTORAM:; ******保护现场及切换工作寄存器区 ******
PUSH PSW
PUSH Acc
PUSH B
SETB RS0 ; 使用工作寄存器的 1组
CLR RS1; ******初始化数据指针 DPTR,即使 DPTR指向对应汉字的首字节
MOV DPTR,#CHINESE ; 将字库首地址送 DPTR
MOV A,2FH ; 取汉字顺序号
MOV B,#20H
第 3章 MCS-51指令系统
MUL AB ; 每一汉字占 32字节,顺序号乘 32后就是该汉字点阵; 相对于字库首地址的偏移量
ADD A,DPL ; 乘积低 8位与 DPL相加
MOV DPL,A ; 回送到 DPL中
MOV A,B ; 乘积高 8位送累加器 A
ADDC A,DPH ; 乘积高 8位加字库首地址高 8位 DPH
MOV DPH,A; 至此,数据指针 DPTR已指向对应汉字点阵信息的首字节
MOV R0,#30H ; 内部 RAM单元首址送 R0
MOV R6,#00H ; 用 R6作为内部 RAM存储单元的地址指针
第 3章 MCS-51指令系统
LOOP:
MOV A,R6
MOVC A,@A+DPTR ; 读存放在程序存储器中的汉字点阵信息到累加器
MOV @R0,A
INC R0 ; 指向下一内部 RAM单元
INC R6 ; 内部 RAM指针加 1
CJNE R6,#20H,LOOP ; 如果 R6未到 32就循环
POP B ; 恢复现场
POP Acc
POP PSW
RET ; 子程序返回
第 3章 MCS-51指令系统
CHINESE:; --N000,天 --;- - 宋体 12; 此字体下对应的点阵为:宽 × 高 =16× 16 --
DB 00H,40H,42H,42H,42H,42H,42H,0FEH,42H,42H,42H,42H,42H,42H,40H,00H
DB 00H,80H,40H,20H,10H,08H,06H,01H,02H,04H,08H,10H,30H,60H,20H,00H; --N001,河 --
DB 10H,60H,01H,0C6H,30H,02H,0E2H,22H,22H,0E2H,02H,02H,0FEH,02H,02H,00H
DB 04H,04H,0FFH,00H,00H,00H,07H,02H,02H,07H,40H,80H,7FH,00H,00H,00H
第 3章 MCS-51指令系统;--N002,分 --
DB 80H,40H,20H,98H,87H,82H,80H,80H,83H,84H,98H,30H,60H,0C0H,40H,00H
DB 00H,80H,40H,20H,10H,0FH,00H,00H,20H,40H,3FH,00H,00H,00H,00H,00H;--N003,局 --
DB 00H,00H,0FFH,49H,49H,49H,49H,49H,49H,49H,49H,49H,5FH,0C0H,00H,00H
DB 80H,60H,1FH,00H,3FH,09H,09H,09H,09H,1FH,00H,40H,80H,7FH,00H,00H
……
第 3章 MCS-51指令系统
【 例 3.17】 假设晶振频率为 12 MHz,试编写一延迟时间为
100 ms的子程序 。
可使用, DJNZ,指令实现延迟, 但当晶振频率为 12 MHz,
机器周期仅为 1 μs,即使指定寄存器或存储单元初值为 FFH,减
到 0的延迟时间也只有 256× 2 μs,远小于所需的延迟时间, 因
此需要双循环结构 。
参考程序如下:; ***********延迟 100 ms子程序 **************; 子程序名称,Delay100
第 3章 MCS-51指令系统
Delay100:
PUSH PSW
CLR RS0
SETB RS1
MOV R7,#0C7H
LOOP1:
MOV R6,#0FAH
LOOP2:
DJNZ R6,LOOP2 ; ?DJNZ指令执行时间为 2个机器周期,而 R6初值为; ?FAH(即 250),则 R6减到 0,需 500 μs
DJNZ R7,LOOP1 ; 重装 R6初值指令及,DJNZ R7,LOOP1”执行时间为; ?3 μs,则需要进行 199次,因此 R7初值设为 C7H
POP PSW
RET
第 3章 MCS-51指令系统
3) 分支程序结构
分支程序也是一种常见的程序结构, 如常需要根据运算结
果, 某一输入引脚的状态, 决定是否执行相应的操作 。 根据
分支多少, 将分支程序结构分为简单分支 (即两分支 )结构和多
分支结构 。
·简单分支
简单分支常用条件转移指令实现。
第 3章 MCS-51指令系统
【 例 3.18】 如果 P1.0引脚为低电平, 就读扩展 I/O端口地址
8000H单元到累加器 A。
SETB P1.0 ; ?P1.0对应的锁存器为 1,使 P1.0引脚处于输入状态
MOV A,P1 ; 读 P1口
JB Acc.0,NEXT ; 如果 Acc.0位为 1,即 P1.0引脚为高电平就转到 NEXT处
MOV DPTR,#8000H ; 如果 P1.0引脚为低电平就读 8000H单元
MOVX A,@DPTR
NEXT:
·多路分支
在 MCS-51中,利用,JMP @A+DPTR”指令可以实现 256分
支,为菜单程序设计提供了方便。
第 3章 MCS-51指令系统
【 例 3.19】 假设某菜单有 9项 。 试编写一程序段, 根据输入
数码转去执行相应的子程序, 即输入, 1”,执行子程序 1;输入
,2”,执行子程序 2;依次类推, 输入, 9”,执行子程序 9。
MOV DPTR,#TAB1 ; 子程序入口首地址送 DPTR
MOV A,KEYMA ; 把键盘输入缓冲区内容送累加器 A
DEC A ; 由于输入数码为 1~ 9,因此需要减 1
MOV B,#03H
MUL AB ; 由于长跳转指令 LJMP占用 3个字节,各子程序入口地址相; 距 3字节
JMP @A+DPTR ; 根据输入码,执行相应的子程序。例如,输入数码为 2,即; ?KEYMA变量为 2,减 1乘 3后累加器 Acc为 3。该指令执行; 后,将转到 2000H+03H处,即执行了 LJMP NO2指令
第 3章 MCS-51指令系统; 程序入口地址表
ORG 2000H
TAB1:
LJMP NO1
LJMP NO2
LJMP NO3
LJMP NO4
LJMP NO5
LJMP NO6
LJMP NO7
LJMP NO8
LJMP NO9
第 3章 MCS-51指令系统
3.2.2 汇编语言程序编辑与执行
近一两年开发的单片机仿真机多数不带显示器, 键盘 (目标
板工作电源也不取自仿真头, 仿真时目标板必须外接 +5 V电源 ),
需要与 PC机配合使用, 典型产品有南京伟福实业公司的 E6000、
E2000,G6,K51,E51等型号通用, 专用单片机仿真机 。 这类
仿真机的联机调试功能很强 (如可从程序任一点处连续, 单步执
行;可同时监控内外部 RAM,特殊功能的变化;可在线修改内
部 RAM前 128字节, 特殊功能寄存器内容;部分型号还带有逻辑
分析仪, 可同时采集多路信号的波形 ),操作方便 。
这类仿真机一般均提供功能完善, 操作方便的 DOS/Windows
环境下运行的开发应用软件, 可直接在其开发应用程序窗口内完
成汇编语言源程序的编辑, 编译 (汇编 ),运行, 调试 。
第 3章 MCS-51指令系统
*3.2.3 对汇编语言程序的基本要求
1,正确性
2,可靠性
3,可读性好
4,程序代码要短
5,程序执行时间短
6,工作区分配及切换
第 3章 MCS-51指令系统
(1) 主程序一般使用 0区, R0~ R7对应内部 RAM单元地址为
00H~ 07H。
(2) 被主程序调用的第 1级子程序, 一般使用 1区,R0~ R7对
应内部 RAM单元地址为 08H~ 0FH。
(3) 被第 1级子程序调用的第 2级子程序,一般使用 2区,
R0~ R7对应内部 RAM单元地址为 10H~ 17H。
第 3章 MCS-51指令系统
(4) 被第 2级子程序调用的第 3级子程序, 一般使用 3区,R0~
R7对应内部 RAM单元地址为 18H~ 1FH。
在内部 RAM资源紧张的情况下, 如果没有使用 3区, 或第 3级
子程序无须使用全部的寄存器, 如只使用 R0~ R3,则可将
18H~ 1FH(没有使用 3区 )或 1CH~ 1FH(使用 3区, 但只使用 R0~
R3寄存器 )作为用户 RAM。
对于子程序来说,断点明确,是否要切换工作区视情况而
定。例如,当子程序中没有使用工作寄存器组 R0~ R7,或子程
序中使用的工作寄存器组 R0~ R7在调用后无需保护,就不用切
换工作寄存器区,仅保护子程序中用到的寄存器,如 Acc、
PSW,B等即可。
第 3章 MCS-51指令系统
(5) 为避免混乱, 尽量使用用户区的 RAM单元作为子程序入口
/出口参数存放区 。
SUB1:
PUSH PSW ; 保护程序状态字
PUSH Acc ; 保护累加器
…… ; 将需要保护的特殊功能寄存器压入堆栈
SETB RS0 ; 切换工作区 。 选择的工作区与子程序级别有关
CLR RS1
…… ; 子程序实体, 具体指令由程序功能决定
POP xx ; 恢复现场
… ; ?POP指令条数与 PUSH指令一致, 只是顺序相反
POP PSW ; 恢复程序状态字
RET ; 返回