第三章
80C51单片微机的指令系统
3.1 80C51指令系统概述
80C51指令系统专用于 80C51系列单片微机,是一个具有
255种操作码 (00H至 FFH,除 A5H外 ) 的集合。
用汇编语言表达操作代码时,只要熟记 42种助记符。 42种
助记符代表了 33种功能,因为有的功能如数据传送,可以有几种
助记符,如 MOV,MOVC,MOVX。而指令功能助记符与操作
数各种寻址方式的结合,共构造出 111种指令,同一种指令所对
应的操作码可以多至 8种 (如指令中 Rn对应寄存器 R0-R7) 。
寻址方式就是在指令中给出的寻找操作数或操作数所在地
址的方法 。 执行任何一条指令都需要使用操作数 。
80C5l指令系统中共有以下 7种寻址方式 。
⒈ 立即寻址
在指令中直接给出操作数,出现在指令中的操作数称为立
即数。为了与直接寻址指令中的直接地址相区别,在立即数前面
必需加上前缀“#”。
例如:指令 MOV DPTR,# 1234H
1234H是立即数, 指令功能是把 16位立即数 1234H送入数
据指针 DPTR中, 如 图 3–1所示 。
3.1.1 寻址方式
2.直接寻址
在指令中直接给出操作数单元的地址 。
例如:指令 MOV A,3AH
其功能是把片内 RAM中 3AH单元内的数据传送给累加器 A,如 图
3–2所示 。
直接寻址方式只能给出 8位地址, 因此, 这种寻址方式的寻址范围
只限于片内 RAM。
⑴ 低 128单元, 在指令中直接以单元地址形式给出 。
⑵ 特殊功能寄存器, 这时除了可以单元地址形式给出外, 还可
以寄存器符号形式给出 。 虽然特殊功能寄存器可以使用符号标志,
但在指令代码中还是按地址进行编码的 。
应当说明的是, 直接寻址是访问特殊功能寄存器的唯一方法 。
3.寄存器寻址
在指令中将指定寄存器的内容作为操作数 。 因此指定了寄
存器就能得到操作数 。
寄存器寻址方式中, 用符号名称来表示寄存器 。
例如:指令 INC R0
其功能是把寄存器 R0的内容加 1,再送回 R0中 。 由于操作
数在 R0中, 指定了 R0,也就得到了操作数, 如 图 3–3所示 。
寄存器寻址方式的寻址范围包括:
( 1) 四个寄存器组共 32个通用寄存器 。 但在指令中只能使用当
前寄存器组 。 因此在使用前要通过指定 PSW中的 RS1,RS0,以
选择使用的当前寄存器组 。
( 2)部分特殊功能寄存器。例如累加器 A,AB寄存器对以及
数据指针 DPTR。
4.寄存器间接寻址
在指令中给出的寄存器内容是操作数的地址, 从该地址中
取出的才是操作数 。
寄存器间接寻址也需以寄存器符号名称的形式表示 。 为了
区别寄存器寻址和寄存器间接寻址, 在寄存器间接寻址中, 应在
寄存器的名称前面加前缀, @, 。
假定 R1寄存器的内容是 60H,则指令 ANL A,R1的功能是
以 R1寄存器的内容 60H为地址, 将 60H地址单元的内容与累加器
A中的数相, 与,, 其结果仍存放在 A中, 其功能示意请参见 图
3–4。
寄存器间接寻址的寻址范围:
⑴ 片内 RAM的低 128单元, 只能采用 R0或 R1为间址寄存器,
其形式为 @Ri( i= 0,1) 。
⑵ 片外 RAM 的 64 KB单元, 使用 DPTR作为间址寄存器, 其
形式为@ DPTR,例如 MOVX A,@ DPTR,其功能是把 DPTR指
定的片外 RAM单元的内容送累加器 A。
⑶ 片外 RAM低 256单元, 除了可使用 DPTR作为间址寄存器外,
也可使用 R0或 R1作间址寄存器 。 例如,MOVX A,@ R0,即把
R0指定的片外 RAM单元的内容送累加器 A。
⑷ 堆栈区:堆栈操作指令 ( PUSH和 POP) 也应算作是寄存器
间接寻址, 即以堆栈指针 ( SP) 作间址寄存器的间接寻址方式 。
⒌ 相对寻址
在指令中给出的操作数为程序转移的偏移量。
在相对转移指令中, 给出地址偏移量 ( 在 80C51的指令系统中,
以, rel”表示 ), 把 PC的当前值加上偏移量就构成了程序转移的
目的地址 。 转移的目的地址可用如下公式表示:
目的地址=转移指令所在地址+转移指令字节数+ rel
在 8051的指令系统中, 有许多条相对转移指令, 这些指令
多数均为两字节指令, 只有个别的是三字节的指令 。 偏移量 rel是
一个带符号的 8位二进制补码数, 所能表示 的数的范围是一
128~+ 127。 因此以相对转移指令的所在地址为基点, 向前最大
可转移 ( 127十转移指令字节数 ) 个单元地址, 向后最大可转移
( 128一转移指令字节数 ) 个单元地址 。
例如:指令 JC 80H
若进位位 C为 0,则程序计数器 PC中的内容不变, 即不转
移;若进位位 C为 1,则以程序计数器 PC中当前值为基地址, 加
上偏移量 80H后所得结果作为该转移指令的目的地址, 其执行示
意图如 图 3–5所示 。
指令的操作码存在 1000H单元,偏移量存在 1001H单元。
执行该指令后,程序计数器 PC 指向 1002 H(即当前值)。这里
80H即 –128,故 1002H与 –128( 80H)相加(补码运算)后得到转
移地址 0F82H。
6.变址寻址
以 DPTR或 PC为基址寄存器,累加器 A做变址寄存器,以
两者内容相加,形成的 16位程序存储器地址作为操作数地址。又
称基址寄存器+变址寄存器间接寻址。
例如:指令
MOVC A,@ A+ DPTR
其功能是把 DPTR和 A的内容相加所得到的程序存储器地址
单元的内容送 A。
假定指令执行前
( A) = 54H,( DPTR) = 1256H
则该指令的操作示意请参见 图 3–6。变址寻址形成的操作数
地址为 1256H+ 54H= 12AAH,若 12AAH单元的内容为 00H,则
该指令执行的结果是 A的内容为 00H 。
80C51指令系统中的变址寻址指令有如下特点:
⑴ 变址寻址方式只能对程序存储器进行寻址, 或者说是
专门针对程序存储器的寻址方式 。
⑵ 变址寻址指令只有三条
MOVC A,@A+ DPTR
MOVC A,@ A+ PC
JMP @A+ DPTR
其中前两条是程序存储器读指令, 后一条是无条件转移指
令 。
⑶ 这三条指令却都是单字节指令 。
⑷ 变址寻址方式用于查表操作 。
7.位寻址
80C51有位处理功能,可以对数据位进行操作,因此,就
有相应的位寻址方式。
位寻址的寻址范围:
( 1)片内 RAM中的位寻址区
片内 RAM中的单元地址 20H~ 2FH,共 16个单元 128位,
为位寻址区, 位地址是 00H~ 7FH。 对这 128个位的寻址使用直接
位地址表示 。
例如 MOV C,2BH指令的功能是把位寻址区的 2BH位状态送
累加位 C。
( 2) 可位寻址的特殊功能寄存器位
可供位寻址的特殊功能寄存器共有 11个, 有寻址位 83位 。
这些寻址位在指令中有以下 4种表示方法:
?直接使用位地址表示方法 。
?单元地址加位的表示方法 。 例如 88H单元的位 5,则表示为
88H.5。
?特殊功能寄存器符号加位的表示方法, 例如 PSW寄存器的位 5,
可表示为:为 PSW,5。
?位名称表示方法, 特殊功能寄存器中的一些寻址位是有名称
的, 例如 PSW寄存器位 5为 F0标志位, 则可使用 F0表示该位 。
对于指令中的操作数, 因为指令操作常伴有从右向左传送
数据的内容, 所以常把左边操作数称为目的操作数, 而右边操作
数称为源操作数 。
80C51指令系统的 7种寻址方式概括起来如 表 3–1所列。
指令的表示方法称之为指令格式,其内容包括指令的长度
和指令内部信息的安排等。一条指令通常由操作码和操作数两部
分组成。操作码是用来规定指令所完成的操作的,而操作数则表
示操作的对象。操作数可能是一个具体的数据,也可能是指出取
得数据的地址或符号。在 80C51的指令系统中,有单字节、双字
节和三字节等不同长度的指令。
⑴ 单字节指令:指令只有一个字节,操作码和操作数同在
一个字节中。在 80C51系列的指令系统中,共有 49条单字节指令。
操作码 地址码
如 MOV A,Rn 指令机器码为单字节 11001rrr,其中 rrr可表示
为 000~ 111,分别代表 R0~ R7
3.l.2 指令格式
⑵ 双字节指令:其中一个字节为操作码, 另一个字节是操
作数 。 在 80C51系列的指令系统中, 共有 45条双字节指令 。
操作码 地址码 数据或地址码
如 MOV A,#data 8位立即数 data需占一个字节,操作码也需一
个字节。
⑶ 三字节指令:操作码占一个字节,操作数占两个字节。其中操
作数既可能是数据,也可能是地址。在 80C51系列的指令系统中,
共有 17条三字节指令。
操作码 数据或地址码 数据或地址码
如 ANL direct, #data 指令需三个字节, 第一字节为操作码, 第
二字节为 8位直接地址 direct,第三字节为 8位立即数 data。
从指令执行时间来看,单机器周期指令有 64种,双机器周
期指令有 45种,只有乘法、除法指令的执行时间为 4个机器周期。
在 12MHz晶振条件下,80C51的指令执行时间分别为 1μ S,2μ S、
4μ S。可见 80C51的指令系统在存储空间和时间的利用效率上都
是比较高的。
80C51的指令系统, 共有 111条指令, 按其功能可分为五大类:
⑴ 数据传送类指令 ( 28条 ) ;
⑵ 算术运算类指令 ( 24条 ) ;
⑶ 逻辑运算类指令 ( 25条 ) ;
⑷ 控制转移类指令 (17条 );
⑸ 布尔操作 ( 位 ) 类指令 ( 17条 ) 。
3.1.3 指令分类
在说明和使用 80C51系列的指令时,经常使用一些符号。
下面将所使用的一些符号的意义作一简单说明。
Rn n= 0~ 7,表示当前寄存器组的 8个通用寄存器 R0~
R7 中的一个 。
Ri i= 0,l,可用作间接寻址的寄存器, 只能是 R0,R1
两个寄存器中的一个 。
direct 内部的 8位地址, 既可以指片内 RAM的低 128个单
元地址, 也可以指特殊功能寄存器的地址或符号名称, 因此,
direct表示直接寻址方式 。
#data 指令中所含的 8位立即数 。
#data16 指令中所含的 16位立即数 。
3.1.4 指令系统中使用符号说明
addr16 16位目的地址,只限于在 LCALL和 LJMP指令中使
用 。
addr11 11位目的地址, 只限于在 ACALL和 AJMP指令中
使用 。
rel 相对转移指令中的偏移量, 为 8位带符号数 。 为
SJMP和所有条件转移指令所用 。 转移范围为相对于下一条指令
笫一字节地址的 -128~+ 127。
DPTR 数据指针 。
bit 片内 RAM ( 包括部分特殊功能寄存器 ) 中的直接
寻址位 。
A 累加器 。
B B寄存器 。
C 进位标志位, 是布尔处理机中的累加器, 也称之
为累加位 。
@ 间址寄存器的前缀标志 。
/ 位地址的前缀标志, 表示对该位操作数取反 。
( × ) 某寄存器或某单元的内容 。
(( × )) 由 × 寻址的单元中的内容 。
← 箭头左边的内容被箭头右边的内容所取代。
单片微机执行指令的过程, 分为取指令和执行指令两项基
本内容 。
在取指阶段, 单片微机从程序存储器中取出指令操作码,
送到指令寄存器 IR中, 通过指令译码器的译码, 产生一系列的控
制信号 。
在指令执行阶段中,利用指令译码产生的控制信号,进行
本指令规定的操作 。
3.1.5 单片微机执行指令的过程
3.2 数据传送类指令
数据传送方向及相互关系见 图 3–7。
数据传送指令按功能又可分为内部 8位数据传送指令,16
位数据传送指令 (专用于设定地址指针 )、外部数据传送指令、
程序存储器数据传送指令、交换指令和堆栈操作指令。助记符
有 MOV,MOVX,MOVC,XCH,XCHD,SWAP,PUSH、
POP等八种。源操作数可采用寄存器、寄存器间接、直接、立
即、寄存器基址加变址等五种寻址方式,目的操作数可以采用
寄存器、寄存器间接、直接等三种寻址方式。
数据传送指令的一般操作是把源操作数传送到目的操作
数,指令执行后源操作数不变,目的操作数被修改为源操作数。
若要求进行数据传送时,目的操作数不变,则可以用交换指令 。
数据传送类指令不影响标志位 C,AC,OV。 对于 P标志一
般不加以说明 。 只有一种堆栈操作指令可以直接修改程序状态字
PSW,这时可以使某些标志位发生改变 。
从 图 3–7中可以看出数据传送指令的特点有:
⑴ 可以进行直接地址到直接地址的数据传送,能把一个并行
I/O口中的内容传送到片内 RAM单元中而不必经过累加器或工作
寄存器 Rn。
⑵ 用 R0和 R1寄存器间址访问片外数据存储器 256个字节址及
片内 RAM中的任一单元 。 用 DPTR间址访问片外全部 64KB的数
据存储器或 I/O。
⑶ 累加器 A能对 Rn寄存器寻址;能与特殊功能寄存器之
间进行一个字节的数据传送;能对片内 RAM直接寻址;能与片
内 RAM单元之间进行低半字节的数据交换 。
⑷ 能用变址寻址方式访问程序存储器中的表格,将程序
存储器单元中的固定常数或表格字节内容传送到累加器 A中。
主要用于 80C51内部存储器和寄存器之间的数据传送 。
这类传送指令的格式为:
MOV <目的字节>, <源字节>
它的功能是把源字节的内容送到目的字节, 而源字节的内
容不变 。 操作属于拷贝性质 。
源操作数可以有:累加器 A,工作寄存器 Rn( n= 0,…,
7), 直接地址 direct,间接寻址寄存器 @Ri( i= 0,1) 和立即数
# data等五种 。
目的操作数可以有:累加器 A,工作寄存器 Rn( n= 0,…,
7), 直接 地址 direct和间接寻址寄存器 @Ri( i= 0,1) 等四种 。
这类指令是以 MOV为其助记符的, 若以目的操作数分类, 可将内
部八位数据传送指令分为 4组 。
3.2.1 内部八位数据传送指令
⒈ 以累加器 A为目的操作数的指令组
指 令 功 能 寻址范围 机器码
M OV A,Rn ; (A) ←(Rn) R0-R7 11101 rrr (E8~ EFH)
8种操作码
MOV A,direct ; (A)←(direct) 00-FFH 11100101 direct
双字节
MOV A,@Ri ; (A)←((Ri)) 00-FFH 1110011r (E6~ E7H)
2种操作码
MOV A,# data; (A)←( # data) #00-#FFH 01110100 data
双字节
传送指令是以累加器 A为中心的总体结构 。 绝大部分传送
操作均需通过 A进行的 。
⒉ 以工作寄存器 Rn为目的操作数的指令组
MOV Rn,A ; ( Rn) ← ( A)
MOV Rn,direct ; ( Rn) ← ( direct)
MOV Rn,# data ; ( Rn) ← # data
这组指令的功能是把源操作数的内容送入当前工作寄存器区的
R0~ R7中的某一个寄存器 。 源操作数有寄存器寻址, 直接寻址
和立即寻址等寻址方式 。
⒊ 以直接地址 direct为目的操作数的指令组
MOV direct,A ; (direct)←(A)
MOV direct,Rn ; (direct)←(Rn)
MOV direct,direct ; (direct)← ( direct)
MOV direct,@ Ri ; (direct)←((Ri))
MOV direct,# data ; (direct)← # data
这组指令的功能是把源操作数的内容送入由直接地址指出
的存储单元 。 源操作数有寄存器寻址, 直接寻址, 寄存器间接寻
址和立即寻址等寻址方式 。
直接地址 direct为 8位直接地址,可寻址 0~ 255个单元,对
80C51可直接寻址内部 RAM 0~ 127个地址单元和 128~ 255地址
的特殊功能寄存器。
⒋ 以间接寻址寄存器 Ri为目的操作数的指令组
MOV@Ri,A ; (( Ri)) ← ( A)
MOV @Ri,direct ; (( Ri)) ← ( A)
MOV @Ri,# data ; (( Ri)) ← # data
这组指令的功能是把源操作数的内容送入由 R0或 R1的内容
所指的内部 RAM中的存储单元 。 源操作数有寄存器寻址, 直接寻
址和立即寻址等寻址方式 。
间接寻址寄存器 Ri由操作码字节的最低位来选定是 R0还是 R1寄
存器, 间址是以 Ri的内容作为操作数的地址来进行寻址的 。
直接寻址 direct单元在编程时就巳明确, 而间接寻址单元是在程
序进行中明确的, 间接寻址空间和直接寻址空间范围相同, 均
为 0~ 255个单元地址 。
立即数# data为一常数, 它是不带符号的 8位二进制数 。
MOV A,80H ;表示把片内 RAM中地扯为 80H单元 (即 P1
口 )中的内容送 A
MOV 80H,# 88H ;这是一条 3字节指令, 表示把立即数
88H送到片内 RAM中的 80H地址单元中去
MOV 80,0E0H ;这是一条 3字节指令表示把 E0H单
元的内容送到 80H单元中去。这是片内数据存储单元中的直接
地址单元之间数据的直接传送
MOV DPTR,# data16 ; ( DPTR) ← # data16
这是 80C51中唯一的一条 16位指令 。 此指令把 16位常数装
入数据指针 DPTR,即数据高 8位送入 DPH寄存器, 数据低 8位送
入 DPL寄存器 。 16位常数在指令的第二, 第三字节中 ( 第二字节
为高位字节 DPH,第三字节为低位字节 DPL) 。
此操作不影响标志位 。
例:执行指令 MOV DPTR,# 1234H
执行结果 ∶ ( DPH)= 12H,( DPL)= 34H
3.2.2 十六位数据传送指令
这组的功能是实现累加器 A与外部数据存储器或 I/O口之间
传送一个字节数据的指令。
采用间接寻址方式访问外部数据存储器, 有 Ri和 DPTR两
种间接寻址方式 。
采用 R0或 R1作间址寄存器时, 可寻址 256个外部数据存储
器单元, 8位地址和数据均由 P0口分时输入和输出 。 这时若要访
问大于 256个单元的片外 RAM时, 可选用任何其它输出口线来输
出高 8位的地址 ( 一般选用 P2口输出高 8位地址 ) 。
采用 16位 DPTR作间址可寻址整个 64KB片外数据存贮空间,
低 8位 ( DPL) 由 P0口进行分时使用, 高 8位 ( DPH) 由 P2口输
出 。
3.2.3外部数据的传送指令组
⒈ 外部数据存储器或 I/O内容送累加器 A
MOVX A,@R i
MOVX A,@DPTR
说明:指令执行时, 在 P3.7引脚上输出 RD有效信号, 可用
作外部数据存储器或 I/O的读选通信号 。 P0口分时输出由 Ri或 DPL
指定的低 8位地址信息和输入累加器中的数据信息, P2口则输出
DPH指定的高 8位地址信息 。
⒉ 累加器 A内容送外部数据存储器或 I/O
MOVX @Ri,A
MOVX @DPTR,A
说明:该组指令执行时, 在 P3.6引脚上输出 WR有效信
号, 可以用作外部数据存储器或 I/O的写选通信号 。 P0口分时
输出由 Ri或 DPL指定的低 8位地址信息和累加器中输出的数据
信息, P2口则输出 DPH指定的高 8位地址信息 。
例 1∶ 设工作寄存器 R0的内容为 12H,R1的内容为 34H,片外
RAM 34H单元的内容为 56H。 执行指令:
MOVX A,@R1 ; ( 34H) = 56H→A
MOVX @ R0,A ; ( A) = 56H→ 片外 12H单元中
执行结果为片外 RAM的 ( 34H) = 56H,( 12H) = 56H。
例 2:某应用系统外扩了 8K字节 RAM,要求把内部 RAM的 20H
单元内容发送到外部 RAM的 800H单元中 。
MOV DPTR,#800H ;外部数据存储器地址指针
MOV R0,#20H ;内部数据存储器地址指针
MOV A,@R0 ;取内部数据存储器 20H单元内容
MOVX @DPTR,A ;送外部数据存储器 800H单元
MOVC A,@ A+ PC
MOVC A,@A+DPTR
这两条指令的功能均是从程序存储器中读取数据 (如表格, 常数
等 ),执行过程相同, 其差别是基址不同, 因此适用范围也不同 。
累加器 A为变址寄存器,而 PC,DPTR为基址寄存器。
DPTR为基址寄存器时,允许数表存放在程序存储器的任意单元,
称为远程查表;
PC为基址寄存器时,数表只能放在该指令单元往下的 256个单元
中,称为近程查表。编程时需计算 A值与数表首址的偏移量。
3.2.4 程序存储器数据传送指令 (或称查表指令 )
例 3:求平方数 (远程查表法 )
MOV DPTR,#TABLE ;指向表首址
MOVC A,@A+DPTR ;查表得到平方数
MOV 20H,A ;存平方数
HERE:SJMP HERE
TABLE∶ DB 00H,01H,04H,09H ;平方表 02~ 92
DB 16H,25H,36H
DB 49H,64H,81H
例 4:求平方数 (近程查表 )
ADD A,#rel ;修正偏移量
MOVC A,@A+PC ;查表得到平方数
MOV 20H,A ;存平方数
HERE∶ SJMP HERE
TABLE∶ DB 00H,01H,04H,09H,16H ;平方表 02~ 92
DB 25H,36H,49H,64H,81H
注 ∶ rel=TABLE- (查表指令地址+ 1) ; MOVC指令为单字节。
⒈ 字节交换指令 XCH组
XCH A,Rn ; (A) (Rn), direct,@Ri
XCH A,direct
XCH A,@Ri
这类指令的功能是将累加器 A与源操作数的字节内容互
换 。
例:设 ( R0) = 30H,( A) = 3FH,片内 ( 30H) = BBH。
执行指令 XCH A,@R0
执行结果 ( A) =BBH,( 30H)= 3FH。
3.2.5 数据交换指令
⒉, 半字节交换指令组
⑴ XCHD A,@Ri
将 Ri间接寻址单元的低 4位内容与累加器 A的低 4位内容互换,
而它们的高 4位内容均不变 。
例,设 ( R0) = 20H,( A) = 36H( 00110110B), 内部
RAM中 ( 20H) = 75H( 0111010lB) 。
执行指令 ∶ XCHD A,@ R0
结果为 ∶ ( 20H)= 01110110B= 76H,( A)= 00110101B= 35H。
⑵ SWAP A
该指令将累加器 A的高, 低半字节交换, 该操作也可看
作是四位循环指令 。 见 图 3–8。
例:设 ( A) = 36H( 0011 0110B)
执行 SWAP A指令, 执行结果为 ( A) = 63H( 0110
0011B) 。
由于十六进制数或 BCD码都是以四位二进制数表示,因
此 XCHD和 SWAP指令主要用于实现十六进制数或 BCD码的数
位交换。
3.2.6 堆栈操作指令组
PUSH direct
POP direct
入栈 ( PUSH) 操作指令又称, 压栈, 操作 。 指令执
行后栈指针 ( SP) + 1指向栈顶上一个空单元, 将直接地址
direct单元内容送入 SP所指示的堆栈单元 。 此操作不影响标
志位 。
例:中断响应时 (SP)= 30H,DPTR的内容为 0123H,执行入栈指
令其结果怎样?
PUSH DPL ;低 8位数据指针寄存器 DPL内容入栈
PUSH DPH ;高 8位数据指针寄存器 DPH内容入栈 。
执行结果:第一条指令 (SP)+ 1= 31H→(SP),(DPL) = 23H→( 31H)
第二条指令 (SP)+ 1= 32H→(SP),(DPH) = 01H→( 32H)
所以片内 RAM中, (31H)= 23H,(32H)= 01H,
(SP)= 32H。
出栈 (POP)操作指令, 又称, 弹出, 操作, 由栈指针 (SP)
所寻址的片内 RAM中栈顶的内容 ((SP))送入直接寻址单元 direct
中, 然后执行 (SP)一 1并送入 SP。 此操作不影响标志位 。
例:设( SP)= 32H,片内 RAM的 30H~32H单元中的内
容分别为 20H,23H,01H,执行下列指令的结果怎样?
POP DPH ; (( SP)) = ( 32H) = 01H→DPH
( SP) - 1= 32H- 1= 31H→SP
POP DPL ; (( SP)) = ( 31H) = 23H→DPL
( SP) - 1= 31H- 1= 30H→SP
POP SP ;( SP)- 1= 2FH→SP
(( SP)) = ( 30H) = 20H→SP
第三条指令为特殊情况,先执行( SP)- 1= 2FH,后装
入由栈顶退出的值,所以执行后( SP)= 20H。
例 5:检查传送结果
已知内部 RAM (10H)=00H,(30H)=40H,(40H)=10H,P1口为
11001010B,分析指令执行后各单元内容。
MOV R0,#30H ; R0=30H
MOV A,@R0 ; A=40H
MOV R1,A ; R1=40H
MOV B,@R1 ; B=10H
MOV @R1,P1 ; (40H)=11001010B
MOV P2,P1 ; P2=11001010B
MOV 10H,#20H ; (10H)=20H
执行结果,(10H)=20H,(30H)=40H,(40H)=CAH,P1=P2=CAH,
A=40H,B=10H,R0=30H,R1=40H
例 6,将 4位 BCD码倒序。
设内部数据存储器 2AH,2BH单元连续存放有 4位 BCD码数符,
试编一程序把 4位 BCD码数符倒序排列。
2AH 2BH 2AH 2BH
a3 a2 a1 a0 a0 a1 a2 a3
MOV R0,#2AH
MOV R1,#2BH
MOV A,@R0 ; 2AH单元内容送 A
SWAP A ; A的高 4位与低 4位交换 (a2 a3)
MOV @R0,A
MOV A,@R1 ; 2BH单元内容送 A
SWAP A ; A的高 4位与低 4位交换 (a0 a1)
XCH A,@R0 ; 2AH与 2BH单元内容交换
MOV @R1,A
HERE,SJMP HERE
3.3 算术运算类指令
算术运算类指令都是通过算术逻辑运算单元 ALU进行数
据运算处理的指令 。 它包括各种算术操作, 其中有加, 减, 乘,
除四则运算 。 80C51单片微机还有带借位减法, 比较指令 。 加法
类指令包括加法, 带进位的加法, 加 1以及二一十进制调整 。 这
些运算指令大大加强了 80C51的运算能力 。 但 ALU仅执行无符
号二进制整数的算术运算 。 对于带符号数则要进行其他处理 。
使用的助记符为,ADD,ADDC,INC,DA,SUBB、
DEC,MUL,DIV等 8种 。
除了加 1和减 1指令之外,算术运算结果将使进位标志
( CY)、半进位标志( AC)、溢出标志( OV)置位或复位。
这组指令的助记符为 ADD
ADD A,Rn ; ( A) + ( Rn) → ( A)
ADD A,direct ; ( A) + ( direct) → ( A)
ADD A,@Ri ; ( A) + (( Ri)) → ( A)
ADD A,# data ;( A)+ data→ ( A)
这组指令的源操作数为 Rn,direct、@ Ri或立即数,而
目的操作数为累加器 A中的内容。
这组指令的功能是将工作寄存器 Rn、片内 RAM单元中
的内容、间接地址存储器中的 8位无符号二进制数及立即数与累
加器 A中的内容相加,相加的结果仍存放在 A中。
3.3.1加法指令
这类指令将影响标志位 AC,CY,OV,P。
当和的第 3位有进位时, 将 AC标志置位, 否则为 0。
当和的第 7位有进位时, 将 CY标志置位, 否则为 0。
对于带符号数运算,当和的第 7位与第 6位中有一位进位而另一
位不产生进位时,溢出标志 OV置位,否则为 0。( OV)= 1表示
两个正数相加,和为负数;或两个负数相加而和为正数的错误结
果。
例, 设 ( A) = C3H,( R0) =AAH。
执行指令,ADD A,R0
1 1 0 0 0 0 1 1 B
+1 0 1 0 1 0 1 0 B
0 1 1 0 1 1 0 1 B
执行结果,(A)= 6DH,(CY)= 1,(OV)= 1,(AC)= 0。
第 6位无进位而第 7位有进位,故 OV=1,即出现两个负数
相加,结果为正数的错误。
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)
这组指令的功能是将工作寄存器 Rn,片内 RAM单元中的
内容, 间接地址存储器中的 8位无符号二进制数及立即数与累加
器 A的内容和当前进位标志 CY的内容相加, 相加的结果仍存放在
A中 。 这组指令常用于多字节数相加, 实现 8的倍数位 (如 16位,
32位 )数的加法 。
3.3.2带进位位加法指令
这类指令将影响标志位 AC,CY,OV,P。
当和的第 3位有进位时, 将 AC标志置位, 否则清 0。
当和的第 7位有进位时,将 CY标志置位,表示和数溢出,否则
清 0。
对于带符号数运算,当和的第 7位与第 6位中有一位进位而另
一位不产生进位时,溢出标志 OV置位,否则为 0。( OV)= 1
表示两个正数相加,和为负数;或两个负数相加而和为正数的
错误结果。
例:设 ( A) = C3H,( R0) = AAH,( CY) = 1。
执行指令,ADDC A,R0
1 1 0 0 0 0 1 1
+ 1 0 1 0 1 0 1 0
+ 1 (CY)
0 1 1 0 1 1 1 0
执行结果,( A) = 6EH,( CY) = 1,( OV) = l,
( AC) = 0。
对于带符号数的带进位相加, 溢出标志为 1,意味着出
错, 上例为两个负数相加, 出现结果为正数的错误 。
例:已知 (A)= B3H,(R1) = 56H。
执行 ADDA,R1指令:
B 3H 1 0 1 1 0 0 1 1
+ 5 6H + 0 1 0 1 0 1 1 0
1 0 9H 1 0 0 0 0 1 0 0 1
CY=1 CY=1,OV=0,AC=0
?若两个数是无符号数, 则 B3H+ 56H=109H,答案正确 。
?若两个数是带符号数, 则 B3H的原码是 (–77D), 56H原码为
86D(–77D) + 86D= 09D,答案也是正确的,因为 OV= 0。
INC Rn ; (Rn)← ( Rn) + 1
INC direct ; (direct)← ( direct) + 1
INC @ Ri ; ((Ri))← (( Ri)) + 1
INC A ; ( A) ← ( A) + l
INC DPTR ; ( DPTR) ← ( DPTR) + 1
这组指令的功能是将工作寄存器 Rn,片内 RAM单元中的内
容, 间接地址存储器中的 8位无符号二进制数, 累加器 A和数据
指针 DPTR的内容加 1,相加的结果仍存放在原单元中 。
这类指令不影响各个标志位 。
3.3.3 增量 (加 1) 指令
当指令中的 direct为 P0~ P3端口 (地址分别为内部 RAM的
80H,90H,A0H,B0H) 时, 其功能是修改输出口的内容, 指令
执行过程中, 首先读入端口内容, 在 CPU中加 1,再输出到端口,
要注意的是读入来自端口的锁存器而不是端口的引脚 。 这类指令
具有读-修改-写的功能 。
例:设 ( R0) = 7EH,( 7EH) = FFH,( 7FH) = 40H。
INC @R0 ; FFH+ 1= 00H 仍存入 7EH单元
INC R0 ; 7EH+ 1= 7FH 存入 ( R0)
INC @ R0 ; 40H+ 1= 41H 存入 ( 7FH)
执行结果为( R0)= 7FH,( 7EH)= 0FFH.( 7FH)= 41H
DA A
该指令的功能是对 BCD码的加法结果进行调整 。
说明,BCD码采用四位二进制数编码,并且只采用
了其中的十个编码,即 0000~ 1001,分别代表 BCD码 0~ 9
,而 1010~ 1111为无效码。当相加结果大于 9,说明已进入
无效编码区;当相加结果有进位,说明已跳过无效编码区。
凡结果进入或跳过无效编码区时,结果是错误的,相加结果
均比正确结果小 6(差 6个无效编码 ) 。
3.3.4 二一十进制调整指令
十进制调整的修正方法为:
? 当累加器低四位大于 9或半进位标志 AC=1时, 则进行低四
位加 6修正
(A0~ 3)+ 6→(A 0~ 3)
即 (A)=(A) + 06
? 当累加器高四位大于 9或进位标志 CY= 1时,进行高四位加
6修正
(A4~ 7)+ 6→(A 4~ 7)
即 (A) = (A) + 60H
例:设 ( A) = 0101 0110= 56 BCD,
( R3) = 0110 0111= 67 BCD,( CY) = 1。
执行下述二条指令,ADDCA,R3
DA A
执行 ADDC A,R3 ( A) 0 1 0 1 0 1 1 0 (56 BCD)
(R3) 0 1 1 0 0 1 1 1 (67 BCD)
十 ( CY) 1,
10 1 1 1 1 1 0 (高, 低四位均大于 9)
再执行 DA A 0 1 1 0 0 1 1 0 (加 66H操作 )
Cy=1 0 0 1 0 0 1 0 0 (124 BCD)
即 BCD码数 56+ 67+ 1= 124。经 DA A指令校正后,答案正确 。
例 7,二个多字节无符号数相加
设有两个四位 BCD码分别存在内部 RAM的 50H,51H和 60H、
61H单元中,试编写程序,求两个 BCD码数之和,结果存入内部
40H,41H单元。
MOV R0,#50H ;被加数首址
MOV R1,#60H ;加数首址
MOV A,@R0 ;取被加数
ADD A,@R1 ;与加数相加
DA A ;二-十进制调整
MOV 40H,A ;存和
INC R0 ;高位相加
INC R1
MOV A,@R0
ADDC A,@R1
DA A
MOV 41H,A
例 8:对累加器 A中压缩 BCD码数减 1
ADD A,#99H
DA A
HERE:SJMP HERE
说明:累加器 A允许的最大 BCD码数为 99BCD,当对 A实行加
99BCD码数时,必然形成对 BCD码百位数的进位,而剩在 A中
的内容正是压缩 BCD码数减 1。如 BCD的 59H,经 DA A的调整
后,为 58H且 CY=1,不考虑进位 CY,则 BCD码 59- 1= 58。
SUBB A,Rn ; (A)- (Rn)- (CY)→(A)
SUBB A,drect ; (A)一 (drect)一 (CY)→(A)
SUBB A,@Ri ; (A)一 ((Ri))一 (CY)→(A)
SUBB A,# dala ; (A)- data- (CY)→(A)
这组指令的功能是从 A中减去进位位 CY和指定的变量, 结果
( 差 ) 存入 A中 。
若第 7位有借位则 CY置 1,否则 CY清 0;若第 3位有借位, 则
AC置 1,否则 AC清 0。
若第 7位和第 6位中有一位需借位而另一位不借位,则 OV置 1;
OV位用于带符号的整数减法。 OV= 1,则表示正数减负数结果为
负数,或负数减正数结果为正数的错误结果。
需要注意的是,在 80C51指令系统中没有不带借位的减法。如果需
要的话,可以在, SUBB”指令前,用, CLR C”指令将 CY先清零。
3.3.5 带借位减法指令
DEC Rn ;( Rn)- 1→ ( Rn)
DEC direct ; ( direct) - 1→ ( direct)
DEC @Ri ; (( Ri)) - 1→ (( Ri))
DEC A ; ( A) - 1→ ( A)
这组指令的功能是将工作寄存器 Rn,片内 RAM单元中的
内容, 间接地址存储器中的 8位无符号二进制数和累加器 A的内容
减 1,相减的结果仍存放在原单元中 。
这类指令位不影响各个标志。
3.3.6 减 1指令
需要注意:执行对并行 I/O口的输出内容减 1操作, 是将该
口输出锁存器的内容读出并减 1,再写入锁存器, 而不是对该输
出引脚上的内容进行减 l操作 。
例:设 ( R0) = 7FH,( 7EH) = 00H,( 7FH) = 40H。
执行指令:
DEC @ R0 ; ( 7FH) 一 1= 40H—l= 3FH→ ( 7F)
DEC R0 ; ( R0) 一 l= 7FH—l= 7EH→ ( R0)
DEC @ R0 ; ( 7EH) 一 l= 00H—l= FFH→ ( 7E)
执行结果:( R0)= 7EH,( 7EH)= FFH,( 7FH)= 3FH。
⒈ 乘法指令
MUL AB
乘法指令的功能是将 A和 B中两个无符号 8位二进制数相乘,
所得的 16位积的低 8位存于 A中, 高 8位存于 B中 。 如果乘积大于
255时, 即高位 B不为 0时, OV置位;否则 OV置 0。 CY总是清 0。
例:设 ( A) = 50H( 80D), ( B) = A0H( 160D) 。
执行指令,MULAB
即 80× 160= 12800= 3200H
执行结果:乘积 3200H( 12800),( A)= 00H,( B)= 32H,
( OV)= 1,( CY)= 0。
3.3.7 乘法 /除法指令
⒉ 除法指令
DIV AB
除法指令的功能是将 A中无符号 8位二进制数除以 B中的无
符号 8位二进制数, 所得商的二进制数部分存于 A,余数部分存于
B中, 并将 CY和 OV置 0。 当除数 ( B) = 0时, 结果不定, 则 OV
置 1。 CY总是清 0。
例:设 ( A) = FBH( 251D), ( B) = 12H( 18D) 。
执行指令,DIV AB
执行结果,( A) = 0DH( 商为 13), ( B) = 11H( 余数为 I7),
( OV) = 0,( CY) = 0。
例 9,数的码制转换。把累加器 A中无符号二进制整数 (00-FFH)
转换为三位压缩 BCD码 (0~ 255),并存入内存 30H和 31H单元。
BINBCD,MOV B,#100
DIV AB ; A÷ 100 百位数在 A,余数在 B
MOV 30H,A ;百位数送 30H
MOV A,B
MOV B,#0AH
DIV AB ;余数 ÷ 10, 十位数在 A低四位,;个位数在 B
SWAP A ;十位数放 A的高四位
ADD A,B ;十位数和个位数组合后送 31H
MOV 31H,A
RET
3.4 逻辑运算类指令
逻辑运算类指令包括:与、或、异或、清除、求反、
移位等操作。
助记符有 ANL,ORL,XRL,RL,RLC,RR、
RRC,CPL,CLR等九种。
只按位进行逻辑运算,结果不影响 PSW中标志位。
这组指令的助记符为 ANL,用符号, ∧, 表示:
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) ← ( drect) ∧ # data
指令功能是将目的地址单元中的数和源地址单元中的数按
“位”相“与”,其结果放回目的地址单元中。
3.4.1 逻辑“与”运算指令
例:设 ( A) = A3H( 1010 0011B),
( R0) = AAH( 1010 1010B) 。
执行指令, ANLA,Rn
执行结果为 ( A) = A2H( 1010 0010B) 。
例:设 P1=FFH
执行指令, ANL P1,#0F0H
执行结果为 P1= F0H,这时 P1.7~ P1.4位状态不变, P1.3~ P1.0
位被清除 。
逻辑“与”运算指令用做清除或屏蔽某些位。
这组指令的助记符为 ORL,用符号, ∨, 表示:
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
指令功能是将目的地址单元中的数和源地址单元中的数按
,位, 相, 或,, 其结果放回目的地址单元中 。
3.4.2 逻辑“或”运算指令
例:设 ( A) = A3H( 10100011B),
( R0) = 45H( 0100 0101B) 。
执行指令,ORL A,R0
执行结果,( A) = E7H( 1110 0111B) 。
逻辑或运算指令用做指定位强迫置位。给某些位置 1,
合并二个数中的,1”。
这组指令的助记符为 XRL,用符号, ⊕, 表示, 其运算规则为:
0⊕ 0=0 1⊕ 1=0
0⊕ 1=1 1⊕ 0=1
XRL A,Rn ; ( A) ← ( A) ⊕ ( Rn)
XRL A,drect ; ( 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
指令功能是将目的地址单元中的数和源地址单元中的数按, 位,
相, 异或,, 其结果放回目的地址单元中 。
3.4.3 逻辑“异或”运算指令
例:设 ( A) = A3H( 1010 0011B),
( R0) = 45H( 0100 0l0lB) 。
执行指令为 XRL A,R0
1 0 1 0 0 0 1 1
⊕ 0 1 0 0 0 1 0 1
1 1 1 0 0 1 1 0
执行结果为 ( A) = E6H( 111001l0B) 。
用于对目的操作数的某些位取反,也可以判两个数是否相等,若
相等则结果为 0。
包括带进位 C和不带进位 C的循环左移和循环右移等四条
指令 。
对于带进位的循环移位, C的状态由移入的数位决定, 其
他状态标志位不受影响 。
⒈ 循环右移指令:
RR A
它是将累加器的内容逐位循环右移一位, 并且 a0的内容移到 a7,
见 图 3–9( a) 所示 。 此操作不影响标志位 。
例:设( A)= A6H( 10100110),
执行 RR A指令,执行结果= 53H( 01010011B)。
3.4.4 累加器移位 /循环指令
⒉ 带进位循环右移指令, RRC A
它是将累加器的内容和进位位一起循环右移一位, 并且 a0移
入进位位 CY,CY的内容移到 a7,见 图 3–9( b) 所示 。 此操作
不影响 CY之外的标志位 。
例:设 (A)= B4H(10110100B),(CY)= 1,执行 RRC A指令,
执行结果为,(A)= DAH ( 11011010B),(CY)= 0
⒊ 循环左移指令,RL A
它是将累加器的内容逐位循环左移一位, 并且 a7的内容移
到 a0,见 图 3–9( c) 所示 。 此操作不影响标志位 。
例:设 ( A) = 3AH( 00111010B), 执行 RL A指令,
执行结果:( A)= 74H( 01110l00B)。
⒋ 带进位循环左移指令,
RLC A
它是将累加器的内容和进位位一起循环左移一位, 并
且 a7移入进位位 CY,CY的内容移到 a0,见 图 3–9( d) 所示 。
此操作不影响 CY之外的标志位 。
例:设 ( A) = 3AH( 00111010B), ( CY) = 1,
执行 RLCA指令,
执行结果为,(A)=75H( 01110101B),( CY)= 0
CPL A
对进行累加器的内容逐位取反, 结果仍存在 A中 。 此操作不
影响标志位 。
例:设 ( A) = 21H(0010 0001B),执行 CPL A指令,
执行结果:( A)= DEH (1101 1110B)。
3.4.5 累加器按位取反指令
CLR A
对累加器进行清 0,此操作不影响标志位 。
例:设( A)= 44H,执行 CLR A指令,
执行结果:( A)= 00H。
3.4.6 累加器清 0指令
例 10,数据的拆分与拼装
要求:从 (30H)==x7x6x5x4x3x2x1x0中取出高 5位,从
(31H)=y7y6y5y4y3y2y1y0中取出低 3位,拼装后存入 40H中,
(40H)=Y2Y1Y0X7X6X5X4X3
地址 机器码
ORG 0000H
0000 E5 30 MOV A,30H
0002 C4 SWAP A ; X3X2X1X0 X7X6X5X4
0003 23 RL A ; X2X1X0 X7X6X5X4X3 左移了 5位
0004 F5 40 MOV 40H,A
0006 53 40 1F ANL 40H,#00011111B
0009 E5 31 MOV A,31H
000B 75 F0 20 MOV B,#20H
000E A4 MUL AB ; Y2Y1Y0 0 0 0 0 0左移了 5位
000F 54 E0 ANL A,#11100000B
0011 42 40 ORL 40H,A
0013 21 13 HERE, AJMP HERE
注:实现左移 5位, 采用了两种方法, 即移位和乘法 。
3.5 控制程序转移类指令
程序的顺序执行是由 PC自动加 1来实现的,但在应用系
统中,往往会遇到一些情况,需要强迫改变程序执行顺序,比
如调用子程序,比如根据检测值与设定值的比较结果要求程序
转移到不同的分支入口等。
80C5设有丰富的控制转移指令,可分为无条件转移指令、
条件转移指令、循环转移指令、子程序调用和返回指令及空操
作指令等。但不包括布尔变量控制程序转移指令。
采用助记符有,AJMP,LJMP,SJMP,JZ,JNZ,CJNE、
DJNZ,ACALL,LCALL,RET,RETI,NOP等 13种。
指令 机器码
SJMP rel 80 rel
AJMP addr11 a10 a9 a8 00001 a7~ a0
LJMP addrl6 02 addr15~ 8 addr7~ 0
JMP @ A+ DPTR 73
这类指令的功能是程序无条件地转移到各自指定的目标地址去执
行, 不同的指令形成的目标地址不同 。
3.5.1 无条件转移指令
1,短转移指令,
SJMP rel
10000000
相对地址
其目标地址是由当前 PC( 程序计数器 ) 值和指令的第二字节提
供的 8位带符号的相对地址相加而成的 。 指令可转向指令前 128
B或指令后 127 B。 rel为 8位带符号数 。
(PC)=(PC)+2 ;当前 PC地址
(PC)=(PC)+rel
当相对地址为 FEH (-02) 时, SJMP指令实现原地转圈的运行状态 。
有两种情况:
⑴ 根据偏移量计算转移的目的地址
在读已编好的用户程序时, 需了解程序短转移至何处执行 。
例:在 2100H地址上有 SJMP指令:
2100H SJMP 7FH
源地址为 2100H,当前 PC地址为 (2100H+02H)=2102H,偏移量
rel=7FH, 是正数, 执行指令 SJMP 7FH 后, 程 序 转 移 至
PC=2102H+7FH=2181H去执行 。
例:在 2100H地址上有 SJMP指令
2100H SJMP 80H
源地址为 2100H,当前 PC地址为 (2100H+02H)=2102H,偏移量
rel=80H,是负数, 指令 SJMP 80H 执 行 后, 程 序 转 移 至
PC=2102H-80H=2082H去执行 。 rel=80H,是负 128的补码 。
也可以采用符号位扩展的方法进行计算 。 即八位偏移量的符号位
为 1,则高 8位为全 1,即 FFH,若 8位偏移量的符号位为 0,则高 8
位为全 0,即 00H。
2102H 2102H
+ 007FH + FF80H
2181H 2082H
⑵ 根据目的地址计算偏移量
在人工进行汇编时, 必须算出偏移量 rel,才能得到机器码 。
rel=(目标地址-当前 PC地址 ) 的低八位, 而高八位必须是 00H
或 FFH,否则超出短转移范围, 溢出出错 。
例,2100H 80 FE HERE:SJMP HERE
rel:2100H- 2102H=FFFEH。高 8位是 FFH,表示负跳,偏
移量为 FEH (- 2)。这是一条原地踏步指令。可用作程序结束
或中断等待。
⒉ 绝对转移指令
AJMP addr11
A10A9A8 0 0 0 0 1
A7 A6 A5 A4 A3 A2 A1 A0
该指令提供 11位地址, 目标地址由指令第一字节的高三位
a10~ a8和指令第二字节的 a7~ a0所组成 。 以指令提供的 11位地
址去取代当前 PC的低 11位, 形成新的 PC值, 即为本绝对转移地
址 。 因此, 程序的目标地址必须包含 AJMP指令后第一条指令的
第一个字节 (即当前 PC地址 )在内的 2 KB范围内 (即高 5位地址必须
相同 )。
例:设 ( PC) = 0456H,标号 JMPADR所指的单元为 0123H。
执行指令 ∶ AJMPJMPADR
机器码为 001 00001 00100011
执行结果程序转向为 ( PC) = 0123H。
例,0000H 21 11 AJMP 0111H ;转移有效
07FEH 81 10 AJMP 0C10H ;当前 PC值为 0800H;转移有效
0100H AJMP 0B11H ;转移无效
⒊ 长转移指令
LJMP addr16
该指令提供 16位地址, 目标地址由指令第二字节 (高 8位地
址 )和第三字节 (低 8位地址 )组成 。 因此, 程序转向的目标地址可
以包含程序存储器的整个 64 KB空间 。
例:设 ( PC) = 0123H,标号 ADR所指单元地址为 3456H。
执行指令 ∶ LJMP ADR
执行结果为 ( PC) = 3456H
程序转向 3456H单元执行。
⒋ 间接转移指令
JMP @A+DPTR
其目标地址是将累加器 A中的 8位无符号数与数据指针
DPTR的内容相加而得 (在程序运行时动态决定 )。 相加运算不影
响累加器 A和数据指针 DPTR的原内容 。 若相加的结果大于 64
KB,则从程序存储器的零地址往下延续 。 当 DPTR的值固定,
而给 A赋以不同的值, 即可实现程序的多分支转移 。 如实现键盘
译码散转功能 。
例:设 ( A) = 5,( DPTR) = 4567H。
执行指令为 JMP@ A+ DPTR
执行结果为,
(PC)= (A)+ (DPTR)= 05H+ 4567H= 456CH
程序转向 456CH单元执行。
例 11:散转程序设计,根据 A中的数值实现程序散转
MOV R1,A ; (A)× 3
RL A
ADD A,R1
MOV DPTR, #TABLE ;散转表首地址送 DPTR
JMP @A+DPTR
TABLE,LJMP PM0 ;转程序 PM0
TABLE+ 3,LJMP PM1 ;转程序 PM1
------
PM0,-----
LJMP是一个三字节指令,因此转移指令入口地址相隔 3个字节,
A中内容需是 3的倍数。
与无条件转移指令不同, 条件转移指令仅仅在满
足指令中规定的条件 (如累加器内容是否为零, 两个操
作数是否相等 ) 时才执行无条件转移, 否则程序顺序执
行 。
6条指令可分为判零转移指令和比较转移指令两
部分 。
3.5.2 条件转移指令
⒈ 累加器判零转移指令
JZ rel ;若 (A)=0,则 (PC)=(PC+2)+rel;若 (A)≠0,则 (PC)=(PC)+2
JNZ rel ;若 (A)≠0,则 (PC)= (PC+2)+rel;若 (A)=0,则 (PC)=(PC)+2
满足各自条件时, 程序转向指定的目标地址执行 (相当于执行
SJMP rel) 。 当不满足各自条件时, 程序顺序往下执行 。
偏移量 rel的计算方法是:
rel=目标地址一 PC的当前值
注意:差值的最高两位必须为 00H或 FFH,否则超出偏移量允许
范围 。 rel取低两位 。
偏移量 rel是用补码形式表示的带符号的 8 位数, 因此, 程
序转移的目标地址为指令前 128 B或指令后 127 B。
这些指令执行后不影响任何操作数和标志位 。
例:设 ( A) = 01H 执行程序
JZ ABEL1 ;因为 ( A) ≠ 0,程序继续执行
DEC A ; ( A) 一 l= 00H
JZ LABEL2 ;因为 ( A) =00H,程序转向标号; LABEL2 指示的地址执行
LABEL1,------
LABEL2,------
⒉ 数值比较转移指令
CJNE A,direct,rel
CJNE A,# data,rel
CJNE Rn,# data,rel
CJNE @ Ri,# data,rel
其指令格式为,CJNE( 操作数 1), ( 操作数 2), rel
数值比较转移指令是三字节指令, 是 80C51单片微机指令
系统中仅有的四条三个操作数的指令, 在程序设计中非常有用 。
同时具有比较转移和数值大小比较的功能 。
数值比较指令的第一字节为操作码 (或操作码 +操作数 1),
第二字节为操作数 2,第三字节为偏移量 rel。
1 0 1 1 1 r r r #data rel
这组指令的功能是对指定的两操作数进行比较,即 (操作
数 1)- (操作数 2),但比较结果均不改变两个操作数的值,仅影
响标志位 CY。指令流程图如 图 3–10所示 。
? 若不等,程序转移到 (PC)十 3加上第三字节带符号 的 8位偏移
量( rel)所指向的目标地址;
若 (操作数 1) > (操作数 2),清进位标志 ( CY) 。
若 (操作数 1) < (操作数 2),则置位进位标志 ( CY) 。
? 值相等, 程序继续执行 。
程序转移的范围是从 ( PC) + 3为起始的+ 127~一 128B
的单元地址 。
比如 CJNE Rn,#data,rel指令的编码为
例:温度控制程序
某温度控制系统,A中存温度采样值 Ta,(20H)=温度下限
值 T20,(30H)=温度上限值 T30。若 Ta> T30,程序转降温 JW,
若 Ta< T20,程序转升温 SW,若 T30≥Ta≥T20程序转 FH返回主程
序。
CJNE A,30H, LOOP
AJMP FH ;等于 T30,转 FH
LOOP,JNC JW ;大于 T30,降温
CJNE A,20 H,LOOP1
AJMP FH ;等于 T20,转 FH
LOOP1,JC SW ;小于 T20,升温
FH,------ ;保温
JW,------
SW∶ ------
DJNZ Rn,rel
DJNZ direct,rel
指令功能是:每执行一次本指令, 先将指定的 Rn或 direct的内容
减 1,再判别其内容是否为 0。 若不为 0,转向目标地址, 继续执
行循环程序;若为 0,则结束循环程序段, 程序往下执行 。 例:
从 P1.7引脚输出 5个方波
MOV R2,#10 ; 5个方波, 10个状态
LOP,CPL P1.7 ; P1.7状态变反
DJNZ R2, LOP
3.5.3循环转移指令
例 12:数据块移动 。
将 2000H单元开始的一批数据传送到从 3000H开始的单元
中, 数据长度在内部 RAM的 30H中 。
MOV DPTR,#2000H;源数据区首址
PUSH DPL ;源数据区首址压栈保护
PUSH DPH
MOV DPTR,#3000H;目的数据区首址
MOV R6,DPL ;目的数据区首址存入寄存器
MOV R7,DPH
LP,POP DPH ;取数据区地址指针
POP DPL
MOVX A,@DPTR ;取源数
INC DPTR
PUSH DPL
PUSH DPH
MOV DPL,R6 ;取目的数据区地址指针
MOV DPH,R7
MOVX @DPTR,A ;存入目的数据区
INC DPTR
MOV R6,DPL
MOV R7,DPH
DJNZ 30H,LP ;若数据块未移完, 则继续
POP DPH
POP DPL
SJMP$
说明:因为 2000H和 3000H都在外部 RAM或 I/O中,使用地址
指针均为 DPTR,所以要注意 DPTR的保护、恢复。
⒈ 绝对调用指令
ACALL addr11
a10 a 9 a8 1 0 0 0 1 a7----a0
无条件地调用首址为 addr11处的子程序。操作不影响标志位 。
?断点地址自动压栈:把 PC加 2以获得下一条指令的地址 (当前
PC),将这 16位的地址压进堆栈 (先 PCL,后 PCH),同时栈指针加
2。 然后将指令提供的 11位目标地址, 送入 PC10~ PC0,而
PC15~ PC11的值不变, 程序转向子程序的首地址开始执行 。
目标地址由指令第一字节的高三位和指令第二字节所组成;
3.5.4 子程序调用指令
?所调用的子程序的首地址必须与 ACALL后面指令的第一个字节
在同一个 2 KB区域内 。
例:设 ( SP) = 60H,( PC) = 0123H,子程序 SUBRTN
的首地址为 0456H。
执行指令为 ACALL SUBRTN
机器码为 91 56
执行结果为( PC)+ 2= 0123H+ 2= 0125H→ ( PC),
将( PC) =0125H压入堆栈,25H压入( SP)+ 1= 61H,01H压
入( SP)十 l= 62H,此时( SP)= 62H。
addr11 PC10–0, PC=0456H
⒉ 长调用指令
LCALL addr16
无条件地调用首址为 addr16处的子程序 。 操作不影响标志位 。
? 断点地址自动压栈:把 PC加 3以获得下一条指令的地址, 将
这 16位的地址压进堆栈 ( 先 PCL,后 PCH), 同时栈指针加 2。
? 将指令第 2和第 3字节所提供的 16位目标地址, 送 PC15~ PC0,
程序转向子程序的首地址开始执行 。
所调用的子程序的首地址可以在 64 KB范围内 。
例:设 ( SP ) = 60H, ( PC ) = 0123H, 子程序
SUBRTN的首地址为 3456H。
执行指令为 LCALL SUBRTN
⒈ 子程序返回指令
RET
执行时表示结束子程序, 返回调用指令 ACALL或 LCALL
的下一条指令 (即断点地址 ),继续往下执行 。 执行时将栈顶的
断点地址送入 PC(先 PCH,后 PCL),并把栈指针减 2。
例:设 (SP)= 62H,RAM中的 (62H)= 0lH,(61H)= 26H。
执行指令 LCALL SOBRTN
,执行结果:( PC)+ 3= 0123H+ 3= 0126H→ ( PC)。
将 ( PC) 压入堆栈,26H压入 ( SP) + l= 61H中, 01H
压入 ( SP) + 1=62H中, 此时 ( SP) = 62H。 (PC)=3456H,执
行子程序 。
,,
3.5.5 返回指令
⒉ 中断返回指令
RETI
它除了执行从中断服务程序返回中断时保护的断点处继续
执行程序 (类似 RET功能 )外, 并清除内部相应的中断状态寄存器 。
因此, 中断服务程序必须以 RETI为结束指令 。
CPU执行 RETI指令后至少再执行一条指令, 才能响应新
的中断请求 。 利用这一特点, 可用来实现单片微机的单步操作 。
例:设 ( SP) = 62H,中断时断点是 0123H,RAM中的
( 62H) = 0lH,( 61H) = 23H。
执行指令 RETI结果为,( SP) = 60H,PC= 0123H
程序回到断点 0123H处继续执行。清除内部相应的中断状
态寄存器。
3.6 布尔(位)操作类指令
80C51内部有一个布尔 ( 位 ) 处理器, 具有较强的布尔
变量处理能力 。
布尔处理器实际上是一位的微处理机, 它以进位标志
CY作为位累加器, 以内部 RAM的 20H至 2FH单元及部分特殊
功能寄存器为位存储器, 以 P0,P1,P2,P3为位 I/O。 对位地
址空间具有丰富的位操作指令, 包括布尔传送指令, 布尔状态
控制指令, 位逻辑操作指令及位条件转移指令 。 助记符有
MOV,CLR,CPL,SETB,ANL,ORL,JC、
JNC,JB,JNB,JBC等 11种 。
布尔操作类指令中位地址可用以下多种方式表示, 这些方
式均能为 80C51的汇编程序所识别:
? 直接用位地址 0~ 255或 0~ FFH表示;
? 采用字节地址的位数方式表示, 两者之间用,,, 隔开,
如,20H,0; 1FH,7等
? 采用字节寄存器名加位数表示, 两者之间用,,, 隔开, 如:
P1,5; PSW,5等;
? 采用位寄存器的定义名称表示, 如,F0。
如位地址 D5H,F0,D0,5,PSW.5等表示的是同一位 。
MOV C,bit ;( C) ← ( bit)
MOV bit,C ; ( bit) ← ( C)
功能:将源操作数 ( 位地址或布尔累加器 ) 送到目的操作数
( 布尔累加器或位地址 ) 中去 。
当直接寻址位为 P0,P1,P2,P3口的某一位时, 指令先
把端口的 8位全读入, 然后进行位传送, 再把 8位内容传送到端口
的锁存器中, 是, 读 -修改 -写, 指令 。
例:设 ( C) =1,执行指令为 MOV P1,3,C,执行结果
为 P1,3口线输出, l”。
例:设 P1口的内容为 00111010B,
执行指令如 MOV C,P1,3,执行结果为( C)= 1。
3.6.1 布尔传送指令
1,位清除 ( CLR) 指令
CLR C ; ( C) ← 0
CLR bit ; ( bit) ← 0
功能:将 C或指定位 ( bit) 清 0。
例:设 P1口的内容为 1 1 1 1 1 0 1 0 B,执行指令为 CLR
P1,0后,(P1)=1 1 1 1 1 0 1 0 B 。
2,位置 1(SETB) 指令
SETB C ; ( C) ← l
SETB bit ; ( bit) ← 1
功能:将 C或指定位 ( bit) 置 1。
3.6.2 布尔状态控制指令
例:设 ( C) = 0,P3口的内容为 1 1 1 1 1 0 1 0 B。
执行指令为 SETB P3,0
SETB C
执行结果为 ( C) = 1,P3,0= 1,即 P3= 1 1 1 1 1 0 1 1 B。
3,位取反 ( CPL) 指令
CPL C ; ( C) ← ( / C)
CPL bit ; ( bit) ← ( / bit)
功能:将 C或指定位 ( bit) 取反 。
例:设 ( C) = 0,P1口的内容为 0 0 1 1 1 0 1 0 B。
执行指令为 CPL P1.0
CPL C
执行结果为( C) =1,P1.0=l,即 P0= 0 0 1 1 1 0 1 1 B。
1,位逻辑, 与, ( ANL) 操作指令
ANL C,bit ; ( C) ← ( C) ·( bit)
ANL C,/ bit ; ( C) ← ( C) ·(bit)
功能:将指定位 ( bit) 的内容或指定位内容取反后 ( 原内
容不变 )与 C的内容进行逻辑与运算, 结果仍存于 C中 。
例:设 (C)= l,P1口的内容为 1 1 1 1 1 0 1 1 B,(ACC,7)= 0。
执行指令为 ANL C,P1.0 ; ( C) = 1
ANL C,ACC,7 ; ( C) = 0
执行结果为( C)= 0。
3.6.3 布尔 (位 )逻辑操作 指令
2,位逻辑, 或, ( ORL) 操作指令
ORL C,bit ; ( C) ← C) 十 ( bit)
ORL C,/bit ; ( C) ← ( C) 十 ( bit)
功能:将指定位 ( bit) 的内容或指定位内容取反后 ( 原内容
不变 ) 与 C的内容进行逻辑或运算 。 结果仍存于 C中 。
例:设 (C)= 1,P1口的内容为 1 1 1 1 1 0 1 1B,(ACC,7)= 0。
执行的指令为 ORL C,P1.0 ; ( C) =1
ORL C,ACC 7 ; ( C) =1
执行结果为( C)= 1。
l,布尔累加器条件转移指令
JC rel
JNC rel
功能:对布尔累加器 C进行检测, 当 C= 1或 C= 0时, 程序转向
当前 PC值 (转移指令地址 +2)与第二字节中带符号的相对地址
( rel) 之和的目标地址, 否则程序往下顺序执行 。 因此转移的
范围是- 128~ +127 B。
3.6.4 布尔(位)条件转移指令
例:设 ( C) = 0
执行指令,JC LABEL1 ; (C)=0,则程序顺序往下执;行
CPL C ; (C)=1,程序转 LABEL2
JC LABEL2
以后, 进位位取反变为 l,程序转向 LABEL2单元执行 。
例:设 ( C) = 1。
执行指令,JNC LABEL1
CLR C
JNC LABEL2
以后,进位位清为 0,程序转向 LABEL2单元执行。
2,位测试条件转移指令
JB bit,rel
JNB bit,rel
功能:检测指定位, 当位变量分别为 1或 0时, 程序转向当前 PC值
(转移指令地址 +2)与第二字节中带符号的相对地址 ( rel) 之和的目
标地址, 否则程序往下顺序执行 。 因此转移的范围是 –128~ 127 B。
操作不影响标志位。
例:设累加器 A中的内容为 FEH( 1 1 1 1 1 1 1 0 B) 。
执行指令为 JB ACC.0,LABEL1 ; ACC.0=0,程序顺序往下执行
JB ACC.1,LABEL2 ; ACC.1=1,转 LABEL2单元执行
例:设累加器 A中的内容为 FEH( 1 1 1 1 1 1 1 0 B)
执行指令
JNB ACC.l,LABEL1 ; ACC.1=1,程序顺序往下执行
JNB ACC.0,LABEL2 ; ACC.0=0,程序转向 LABEL2;单元执行 。
3,位测试条件转移并清 0指令
JBC rel
功能:检测指定位, 当位变量为 1时, 则将该位清 0,且程序
转向当前 PC值 (转移指令地址 +2)与第二字节中带符号的相对地址
( rel) 之和的目标地址, 否则程序往下顺序执行 。 因此转移的范
围是 –128~ 127 B。
操作不影响标志位 。
例:设累加器 A中的内容为 7FH( 0 1 1 1 1 1 1 1 B) 。
执行指令 ∶ JBC ACC.7,LABEL1 ; ACC.7=0
JBC ACC.6,LABEL2 ; ACC.6=1,程序转向; LABEL2单元执行,;并将 ACC,6位清为 0。
执行结果 ∶ ( A) =3FH( 0 0 1 1 1 1 1 1 B) 。
例 13:试编程序实现下述逻辑表达式的功能
说明:设 8位输入信号从 P1口输入, Y信号从 P3.0输出 。 经
化简得到 Y=X0+X1X2+X1X2+X4X5X6X7
MOV A,P1
JB ACC.0,MM
SETB C
SJMP OUT ; X0=1,转出口
MM,MOV C,ACC.1
ANL C,/ACC.2
JC OUT ; X1X2=1,转出口
MOV C,ACC.2
ANL C,/ACC.1
JC OUT ; X1X2=1,转出口
MOV C,ACC.7
ANL C,/ACC.4
ANL C,/ACC.5
ANL C,/ACC.6 ; X4X5X6X7
OUT,MOV P3.0,C

END
图 3–1 立即寻址示意图
图 3–2 直接寻址示意图
图 3–3 寄存器寻址示意图
图 3–4 寄存器间接寻址示意图
图 3–5 相对寻址示意图
图 3–6 变址寻址示意图
图 3–7 数据传送指令示意图
图 3–8 半字节交换指令示意图
图 3–9 循环移位指令示意图
图 3–10 CJNE指令执行流程图
表 3–1 寻址方式与寻址空间
寻 址 方 式 寻 址 空 间
1,寄存器寻址 R0~ R7,A,B,CY(bit),DPTR
2,直接寻址 内部 RAM低 128字节
特殊功能寄存器
3,寄存器间接
寻址
内部 RAM( @R0,@R1,@SP仅 PUSH,POP)
外部 RAM( @R0,@R1,@DPTR)
4,立即寻址 程序存储器
5,变址寻址 程序存储器 ( @A+PC,@A+DPTR)
6,相对寻址 程序存储器 (PC+偏移量 )
7,位寻址 内部 RAM中有 128个可寻址位特殊功能寄存器中可位寻址的位