3.1 MCS-51指令系统概述
3.2 寻址方式
3.3 指令系统第 3章 MCS-51单片机的寻址方式和指令系统指令是规定计算机进行某种操作的命令。
指令系统:计算机能够执行的各种指令的集合。
用助记符形式来表示的机器指令称汇编语言指令。
指令格式:
操作码 [操作数 1] [,操作数 2] [,操作数 3]
第 3.1 MCS-51指令概述
1、机器语言:用二进制代码表示的,能被计算机直接识别和执行的一种机器指令的集合。目标程序。
2、汇编语言:用助记符表示表示操作码,用字符(字母、
数字、符号)表示操作数的指令称汇编指令。
汇编语言程序占用存储单元较少,执行速度较快,能够准确掌握执行时间,可实现精细控制,因此特别适用于实时控制。
汇编语言是 面向机器 的语言,各种计算机的汇编语言是不同的。
计算机语言
3、高级语言:高级语言是 面向过程 的语言。用高级语言编程主要着眼于算法,而不必了解计算机的内部结构和指令系统,因此易学易用。高级语言是独立于机器的,一般的,同一个程序可在任何种类的机器中使用。高级语言适用于科学计算、数据处理等方面。
将汇编语言翻译成目标程序的过程称为 汇编 。由人工汇编和机器汇编两种。
高级语言转换成机器语言只能由计算机完成,使用的软件称为编译程序或解释程序。
计算机语言
3.2 寻址方式寻址方式:寻找操作数或操作数地址的方法。
7种寻址方式:
立即寻址直接寻址寄存器寻址寄存器间接寻址基址加变址寻址相对寻址位寻址。
立即寻址操作数直接出现在指令中。
立即数前必须加,#”,立即数可以是 8或 16位的 。
MOV A,#30H
MOV DPTR,#3000H
立即寻址主要用来给寄存器或存储单元赋值 。
直接寻址指令中直接给出操作数所在单元的有效地址。
MOV A,30H
MOV A,90H( P1)
LJMP addr16
可以直接寻址的存储区域:
( 1) 片内 RAM的 00H~7FH单元 。
( 2) SFR( 80H~0FFH),地址可以以单元地址给出,也可以以寄存器符号给出 。
( 3) 访问程序存储器 。
寄存器寻址操作数在寄存器中。
MOV A,R0
INC DPTR
可以寻址的寄存器,
( 1) R0~R7。
( 2) 部分专用寄存器 。 如 A,B,DPTR等 。
寄存器间接寻址寄存器中存放的是操作数的地址,而不是操作数本身。寄存器前加,@”。
可以间接寻址的寄存器,R0,R1,DPTR
MOV A,@ R0
MOVX A,@ DPTR
可以寻址的存储区域,
( 1) 内部 RAM的低 128B。 @R0,@R1
( 2) 内部 RAM的高 128B。 @R0,@R1
( 3) 外部 RAM。 @DPTR,@R0,@R1
( 4) 堆栈操作 ( SP)
基址加变址寻址以 DPTR或 PC作为基址寄存器,累加器 A作为变址中寄存器,并以两者内容相加形成 16位地址作为操作数的地址。常用于查表操作。前加,@”。
MOVC A,@ A+DPTR
MOVC A,@ A+PC
JMP @ A+DPTR
特点,( 1) 只能对程序存储器寻址 。
( 2) 只有 3条 。
( 3) 都是单字节指令 。
相对寻址方式
PC的当前值加上偏移量 rel作为目标地址,rel为带符号的 8位二进制数,其表示范围为 -128~127。
JC rel
偏移地址通常以标号表示 。
位寻址方式对位操作区域进行位寻址时的寻址方式,使用位累加器 C。 操作数是直接给出该位的地址。
MOV A,30H
MOV C,30H
位寻址的寻址范围:
( 1) 内部 RAM中的位寻址区,字节地址 20H~2FH
对应的位地址 00H~7FH的位地址区间 。
( 2) SFR中地址可以被 8整除的位地址区 。
位名称表示方法以 PSW的第 6位 AC来说明
( 1)直接使用位地址 D6H
( 2) 位名称表示方法 AC
( 3) 单元地址加位的表示方法 D0H.6
( 4) 专用寄存器符号加位的表示方法 PSW.6
寻址方式可寻址的存储空间寻址方式 寻址空间立即寻址 对寄存器或存储单元赋值直接寻址 低 128B内部 RAM,SFR,ROM
寄存器寻址 R0~R7以及部分专用寄存器寄存器间接寻址 内部 RAM,外部 RAM,SP
基址加变址寻址 ROM
相对寻址 ROM
位寻址 位地址空间存储空间寻址方式可采用的内部 RAM
00H~7FH
直接寻址,@R0,@R1
内部 RAM
80H~FFH
@R0,@R1
SFR
80H~FFH
直接寻址(唯一方式)
外部 RAM @DPTR( 地址大于 256B)
@R0,@R1( 地址小于 256B)
ROM 直接寻址、基址加变址寻址、相对寻址汇编语言中常用符号的说明
Rn (n= 0~ 7):当前寄存器组的 8个通用寄存器 R0~ R7之一;
Ri (i= 0,1):可用作间接寻址的寄存器,只能是 R0,R1两个寄存器之一;
direct:内部 RAM的 8位单元地址。既可以是内部 RAM的低 128个单元地址,也可以是专用寄存器的单元地址或符号;
A:累加器 (直接寻址方式下的累加器表示为 ACC);
B,B寄存器
DPTR:数据指针;
C:进位标志位 CY,它是布尔处理机的累加器,也称之为累加位;
# data,8位立即数;
# datal6,16位立即数;
汇编语言中常用符号的说明
addr16,16位目的地址,只限于在 LCALL和 LJMP指令中使用;
addr11,11位目的地址,只限于在 ACALL和 AJMP指令中使用;
rel:相对转移指令中的偏移量,为 8位带符号补码数;
bit:内部 RAM(包括专用寄存器 )中的直接寻址位;
@:间址寄存器的前缀标志;
/:加在位地址的前面,表示对该位状态取反;
(X):某寄存器或某单元的内容;
((X)):由 X间接寻址的单元中的内容;
←,箭头左边的内容被箭头右边的内容所取代;
←→,交换箭头左右的数据;
$:当前指令的地址。
3.3 指令系统
5大类:
数据传送类指令,
算术运算类指令,
逻辑运算类指令,
控制转移类指令位操作类指令 。
共计 111条指令
3.3.1 数据传送类指令( 29条)
指令功能,一般是把源操作数传输到目的操作数,指令执行后,源操作数不变,而目的操作数修改为源操作数 。
数据传送可在 3个区间进行:
( 1) 芯片内部各单元之间 。
( 2) 累加器 A与外部 RAM之间 。
( 3) 累加器 A与程序存储器之间
( 1)内部 数据传送指令( 16条)
单片机芯片内部数据传送范围,寄存器,累加器,专用寄存器以及 RAM单元 。
( 1) 以累加器 A为目的操作数的指令:
MOV A,Rn ; A← ( Rn),Rn= R0~ R7
MOV A,direct ; A← ( direct)
MOV A,@Ri ; A← (( Ri)),Ri= R0,R1
MOV A,#data ; A← data
功能:将源操作数所指定的内容送入累加器 A。
( 2) 以寄存器 Rn为目的操作数的指令:
MOV Rn,A ; Rn← ( A),Rn= R0~ R7
MOV Rn,direct ; Rn← ( direct)
MOV Rn,#data ; Rn← data
功能:将源操作数所指定的内容送到当前工作寄存器组 R0~
R7中的某个寄存器中。
例如:
( A) = 78H,( R5) = 47H,( 70H) = 0F2H,
执行指令:
MOV R5,A ; R5← ( A),R5= 78H
MOV R5,70H ; R5← ( 70H),( R5) = 0F2H
MOV R5,#0A3H ; R5← 0A3H,( R5) = 0A3H
注意,8051指令系统中无 MOV Rn,Rn
( 3) 以直接地址为目的操作数的指令:
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所指定的片内存储器中 。
( 4) 以间接地址为目的地址操作数的指令:
MOV @Ri,A ; ( Ri) ← ( A)
MOV @Ri,direct ; ( Ri) ← ( direct)
MOV @Ri,#data ; ( Ri) ← data
功能:将源操作数所指定的内容送入以 R0或 R1为地址指针的片内存储器单元中 。
@Ri direct Rn
ACC#data
图 3-4 传送指令在片内的操作功能
( 5) 十六位数据传送指令:
MOV DPTR,#data16; DPH←dataH,DPL←dataL
唯一的 16位立即数传送指令 。
例 3 - 1,设内部 RAM ( 30H) =40H,( 40H) =10H,
( 10H) =00H,( P1) =0CAH,分析以下程序执行后,各单元及寄存器,P2口的内容 。
MOV R0,#30H ; R0← 30H
MOV A,@R0 ; A← (( R0))
MOV R1,A ; R1← ( A)
MOV B,@R1 ; B← (( R1))
MOV @R1,P1 ; ( R1) ← ( P1)
MOV P2,P1 ; P2← ( P1)
MOV 10H,#20H ; 10H← 20H
结果,( R0) =30H; ( R1) =( A) =40H; ( B) =10H; ( 40H) =( P1) =( P2) =0CAH; ( 10H) =20H。
( 2) 累加器 A与外部 RAM之间数据传送指令 ( 4条 )
寻址方式,寄存器间接寻址方式,使用 DPTR,Ri作间址寄存器 。
( 1) 使用 DPTR进行间接寻址
MOVX A,@DPTR ; A← (( DPTR))
MOVX @DPTR,A ; ( DPTR) ← ( A)
指令的寻址范围,64KB。
( 2) 使用 Ri进行间接寻址
MOVX A,@Ri ; A← (( Ri))
MOVX @Ri,A ; ( Ri) ← ( A)
i=0或 1。
指令的寻址范围,只限于外部 RAM的低 256单元 。
例 3-2,设外部 RAM ( 2023H) =0FH,执行以下指令:
MOV DPTR,#2023H ; DPTR← 2023H
MOVX A,@ DPTR ; A← (( DPTR))
MOV 30H,A ; 30H← ( A)
MOV A,#00H ; A← 00H
MOVX @ DPTR,A ; ( DPTR) ← ( A)
结果,( DPTR) =2023H,( 30H) =0FH,( A) =00H,
( 2023H) =00H。
对外部 RAM数据传送指令作如下 说明,
① 外部数据存储器数据传送指令就是外部 RAM的读写指令 。 ( RD*,WR*)
② 外部 RAM数据传送指令与内部 RAM数据传送指令的助记符不同 。
内部 RAM,MOV,
外部 RAM,MOVX。 增加的,X”表示外部之意

③ 外部 RAM传送,只能通过累加器 A进行。
A寄存器寄存器间接寻址
@R1,@R0
( 外部 RAM 0~255B)
寄存器间接寻址
@DPTR
( 外部 RAM 0~64KB)
图 3-6 外部数据存储器传送操作示意图
( 3) 累加器 A与程序存储器之间传送指令 ( 查表指令 ),
ROM,内部 ROM,外部 ROM。
对 ROM的操作:只能读,不能写 。
该类指令仅有两条,。
MOVC A,@A+PC; PC← ( PC) +1,A← (( A) +( PC))
MOVC A,@A+DPTR; A← (( A) +( DPTR))
累加器 A为 8位无符号数 。
1字节指令 。
变址寻址方式 。
作用:常用于查表操作,又称 查表专用指令 。
二者的区别,PC的查表范围在 256B内 。 称近程查表 。
DPTR可赋予某指定的查表地址,其范围可达整个程序存储器的 64KB空间,称远程查表 。
例 3-2 分析下列程序段的功能。
MOV DPTR,#TAB ;将 DPTR指向表头
MOV A,#4 ;将偏移地址赋给 A
MOVC A,@A+DPTR ;从表格中读取数据
……
ORG 4000H
TAB,DB 0,1,8,27,64,125 ;表格
……
图 3-9 例 3-2数据存放示意图地址
4000 H
4001 H
4002 H
4003 H
4004 H
4005 H
R O M
0
1
8
27
64
125


例 3-3 以近程查表方法求累加器 A中数 (0~5)的立方值,并保存到累加器 A中。
ORG 2000H
CUBIC,INC A;修正偏移地址,单字节
MOVC A,@A+ PC ;查表,单字节
RET ;子程序返回指令,单字节
DB 0,1,8,27,64,125 ;数据表,从 2003H单元开始存放图 3-10 例 3-3程序存放示意图地址
2000 H
2001 H
2002 H
2003 H
2004 H
2005 H
2006 H
2007 H
2008 H
R O M
04 H
83 H
22 H
0
1
8
27
64
125


用数据传送指令实现:
R0的内容传送到 R1
内部 RAM 20H单元内容传送到 A中。
外部 RAM 30H单元内容送 R0。
外部 RAM 30H单元内容送内部 RAM 20H单元
外部 RAM 1000H单元内容送内部 RAM 20H
程序存储器 ROM 2000H单元内容送 R1
程序存储器 ROM 2000H单元内容送内部 RAM 20H
程序存储器 ROM 2000H单元内容送外部 RAM 30H
程序存储器 ROM 2000H单元内容送外部 RAM
1000H
用数据传送指令实现:
R0的内容传送到 R1
MOV A,R0
MOV R1,A
内部 RAM 20H单元内容传送到 A中。
MOV A,20H或
MOV R0,#20H
MOV A,@R0
外部 RAM 30H单元内容送 R0。
MOV R1,#30H
MOVX A,@R1
MOV R0,A
用数据传送指令实现:
外部 RAM 30H单元内容送内部 RAM 20H单元
MOV R1,#30H
MOVX A,@R1
MOV 20H,A
外部 RAM 1000H单元内容送内部 RAM 20H
MOV DPTR,#1000H
MOVX A,@DPTR
MOV 20H,A
用数据传送指令实现:
程序存储器 ROM 2000H单元内容送 R1
程序存储器 ROM 2000H单元内容送内部 RAM
20H
程序存储器 ROM 2000H单元内容送外部 RAM
30H
程序存储器 ROM 2000H单元内容送外部 RAM
1000H
MOV DPTR,#2000H
MOV A,#0
MOVC A,@ A+ DPTR
( 4) 数据交换指令组数据交换主要是在 内部 RAM单元 与 累加器 A之间进行 。
有 整字节 和 半字节 交换指令两种 。
( 1) 整字节交换指令
XCH A,Rn ; ( A) ←→ ( Rn)
XCH A,direct ; ( A) ←→ ( direct)
XCH A,@Ri ; ( A) ←→ (( Ri))
( 2) 半字节交换指令:
XCHD A,@Ri ; ( A) 3~0 ←→ (( Ri)) 3~0
( 3) 累加器高低半字节交换指令:
SWAP A ; ( A) 3~0 ←→ ( A) 7~ 4
例如,若 ( R0) = 5BH,( 5BH) = 6 DH,( A) = 0 0H,
指令,XCHD A,@R0
结果,( A) = 0DH,( 5BH) = 60H。
若 ( A) = 80H,
指令,SWAP A
结果,( A) = 08H。
例 3-4 若 (R0)= 35H,(35H)= 0D7H,(A)=
82H,分析下列指令单独执行后的结果。
(1)XCH A,R0;结果为 (A)= 35H,(R0)=82H
(2)XCH A,@R0;结果为 (A)= 0D7H,(R0)=35H,(35H)=
82H
(3)XCHD A,@R0;结果为 (A)= 87H,(R0)= 35H,(35H)=
0D2H
(4)SWAP A;结果为 (A)= 28H
( 5) 堆栈操作指令组:
进栈,出栈两种操作 。
PUSH direct ; SP← ( SP) +1,( SP) ← ( direct)
POP direct ; direct←((SP)),( SP) ← ( SP) - 1
注意,使用堆栈前,需设定 SP的初始值 。
寻址方式,以 SP为间址寄存器的间接寻址方式 。
例 3-5,已知片内 RAM 40H单元中存放数据为 80H,设堆栈指针为 30H,把此数值压入堆栈,然后再弹出到 41H单元中 。
指令如下:
MOV SP,#30H ; SP← 30H
PUSH 40H ; SP←( SP)+1,( 31H) ← ( 40H)
POP 41H ; 41H← ( 31),(SP)← ( SP) - 1
FF
80

80
56
41H
40H
31H
30H SP
压入
80
80

80
56
41H
40H
31H
30H
SP
弹出堆栈操作应 遵循“先进后出”的原则 。
例如,PUSH A
PUSH PSW

POP PSW
POP A
数据 得到了保存。
若 改为:
PUSH A
PUSH PSW

POP A
POP PSW
则 A和 PSW的内容发生了互换。
分析程序的执行结果
MOV SP,#50H
MOV A,#0F0H
MOV B,#0FH
PUSH A
PUSH B
POP A
POP B
6,数据传送类指令说明
( 1) 同样的数据传送,可以使用不同寻址方式的指令来实现 。
例如:把累加器 A的内容送内部 RAM 26H单元,可由以下不同的指令完成:
① MOV 26H,A
② MOV R0,# 26H
MOV @ R0,A
③ MOV 26H,0E0H
④ PUSH ACC
POP 26H
实际应用根据具体情况决定 。
( 2)数据传送类指令一般不影响程序状态字 PSW。
传送类指令一般不影响标志位。对于 A改变的指令回影响 P
标志位。
但堆栈指令( PUSH和 POP) 可以直接修改状态字 PSW。
例如,PUSH 40H
POP PSW
( 3) 交换型传送指令不丢失目的操作数,它只使将源操作数和目的操作数交换了存放单元。
3.3.2 算术运算类指令
24条指令,完成加、减、乘、除等算术运算。
1.加法指令组:( 8位)
ADD A,Rn ; A← ( A) +( Rn)
ADD A,direct ; A← ( A) +( direct)
ADD A,@Ri ; A← ( A) +(( Ri) )
ADD A,#data ; A← ( A) +data
加法运算影响 PSW位的状态。
如果位 3有进位,则辅助位标志 AC置 1,否则 AC清 0;
如果位 7有进位,则进位标志 CY置 1,否则 CY清 0。
两个带符号数相加,还有溢出的问题。如果运算结果使溢出标志 OV置 1,则表示有溢出出现。
1 1 0 0,0 0 1 1 B
+ 1 0 1 0,1 0 1 0 B
1 0 1 1 0 1 1 0 1 B
C6= 0
C7= 1
= 1,所以有溢出 。
结果,( A) =6DH,( AC) = 0,( CY) = 1,( OV) =1
,P= 1,PSW= 85H
Cy AC F0 RS1 RS0 OV … P
1 0 0 0 0 1 0 1 85H
2,带进位加法指令组:
三个数参加运算:累加器 A,不同寻址方式的加数,以及进位标志位 CY,运算结果送累加器 A。
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-7,设三字节无符号数相加 ( 书上另例,十进制 )
被加数放在内部 RAM,20H~ 22H单元 ( 低位在前 ),
加数放在内部 RAM,30H~ 32H单元 ( 低位在前 ),
和存于,40~ 42H 单元,
进位位:,43H 单元 。
利用 ADDC指令进行多字节加法运算 。
CLR C
MOV A,20H ; 取低字节被加数
ADDC A,30H ; 低位字节相加
MOV 40H,A ; 结果送 40H单元
MOV A,21H ; 取中间字节被加数
ADDC A,31H ; 中间字节相加
MOV 41H,A ; 结果送 41H单元
MOV A,22H ; 取高字节被加数
ADDC A,32H ; 高位字节相加
MOV 42H,A ; 结果送 42H单元
MOV A,#0 ; A清零
ADDC A,#0 ; 加进位位
MOV 43H,A ; 存进位位于 43H单元
3,带借位减法指令组:
带 借 位减法指令也有四条:
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)
若进行 不带借位 的减法运算,需用 CLR C 把 进位标志位清 0即可 。
带借位减法指令影响 PSW的状态,
如果 位 3有借位,则 AC置 1,否则清 0;
如果 位 7有借位,则 CY置 1,否则 CY清 0;
另外,两个带符号数相减也有溢出的问题,如溢出,则 OV
置 1,否则,清 0。
例 3-8:若( A)= D4H,( R2) =6CH,求两者相减结果。
CLR C
SUBB A,R2
1 1 0 1,0 1 0 0 B
- 0 1 1 0,1 1 0 0 B
0 1 1 0,1 0 0 0 B
执行后,( A)= 68H,( CY)= 0,( OV) =1,( AC) =1
,P=0。
例 3-9:两字节数相减,被减数在 20H,21H; 减数在
30H,31H; 差在 40H,41H( 低位在前 ),若高字节相减有借位,则转 OVER处 。 可编程如下:
MOV A,20H ; 低字节被减数送 A
CLR C ; 开始未借位,清 C
SUBB A,30H ; 低字节相减
MOV 40H,A ; 低字节差送入 40H
MOV A,21H ; 高字节被减数送 A
SUBB A,31H ; 高字节相减
MOV 41H,A ; 高字节差送入 41H
JC OVER ; 若 C=1,转 OVER处

OVER,……

( 4) 加 1指令组 ( 5条 )
INC A ; A← ( A) +1
INC Rn ; Rn← ( Rn) +1
INC direct ; direct← ( direct) +1
INC @Ri ; ( Ri) ←( ( Ri) )+1
INC DPTR ; DPTR← ( DPTR) +1
加 1指令的操作 不影响程序状态字 PSW的状态 。
例 3-10:设 ( R0) = 7EH,
片内数据 RAM中 ( 7EH) = 0FFH,
( 7FH) = 50H,
则分析执行下列指令后的结果 。
INC @R0 ; 7EH← 00H
INC R0 ; R0← 7FH
INC @R0 ; 7FH← 51H
( 5) 减 1指令组 ( 4条 )
DEC A ; A← ( A) - 1
DEC Rn ; Rn← ( Rn) - 1
DEC direct ; direct← ( direct) - 1
DEC @Ri ; ( Ri) ←( ( Ri) )- 1
减 1操作不影响程序状态字 PSW的状态 。
MCS- 51指令系统中,只有数据指针 DPTR加 1指令,而没有 DPTR减 1指令 。
6,乘除指令组
( 1) 乘法指令
MUL AB ; 结果高位在 B,低位在 A
功能,完成 A与 B中两个 8位 无符号数相乘,16位乘积的低位字节放在 A,高位字节放在 B中 。
乘法运算影响 PSW的状态 。
若 乘积 < 0FFH( 即 ( B) =0),则 OV= 0,否则 OV= 1。
该运算总使 CY= 0。
若 ( A) = 80H=128,( B) = 32H=50,执行指令:
MUL AB
结果为,( B) = 19H,
( A) = 00H,
表示 乘积 ( BA) = 1900H=6400。
同时,OV= 1,CY= 0。
例 3-10 编写程序完成两个 8位无符号数的乘法运算 。
假设两个乘数已分别存放在内部 RAM的 40H和 41H单元,将乘积的高,低 8位分别保存在 43H和 42H单元中 。
解,ORG 1000H
MOV R0,#40H
MOV A,@R0
INC R0
MOV B,@R0
MUL AB
INC R0
MOV @R0,A
INC R0
MOV @R0,B
END
例 3-11 编写程序完成 16位和 8位无符号数的乘法运算。
解:假设 16位数为被乘数,其高、低字节分别存放在
H和 J单元; 8位数为乘数,存放在 K单元;乘积存放在 42H,41H和 40H单元 (从高字节到低字节 ),则按一般直式相乘得,×
H
42 H 41 H 40 H
HKH HKL
J KH J KL
K
J

被乘数乘数部分积乘积
ORG 2000H
H EQU 31H
J EQU 30H
K EQU 32H
MOV A,J
MOV B,K
MUL AB
MOV 40H,A
MOV 41H,B
MOV A,H
MOV B,K
MUL AB
ADD A,41H
MOV 41H,A
MOV A,#0
ADDCA,B
MOV 42H,A
END
( 2) 除法指令
DIV AB ; A/B,结果商在 A,余数在 B
除法运算影响 PSW的状态 。
当除数为 0( B= 0) 时,OV= 1,表明除法无意义,无法进行;
其它情况下,OV= 0。
任何情况下,CY= 0。
例 3-12,设 ( A) = 0BFH,( B) = 32H,执行指令:
DIV AB
结果为,( A) = 03H,( B) = 29H,CY= 0,OV= 0。
例 3-12 编制一程序,实现将累加器 A中的无符号二进制数转换为 3位 BCD数,并将 BCD数的百位,十位和个位分别存放在内部 RAM的 40H,41H和 42H单元 。
ORG 2000H
MOV A,#0FEH ;送被分离的数
MOV B,#100 ;除数送 B
DIV AB ;相除,分离出百位
MOV 40H,A ;保存百位
MOV A,B ;余数送 A
MOV B,#10 ;除数送 B
DIV AB ;分离十位和各位
MOV 41H,A ;保存商,即十位数
MOV 42H,B ;保存余数,即个位数
END
7,十进制调整指令:
DA A
例,设 ( A) = 0101,0110B,56的 BCD码,
( R3) = 0110 0111B,67的 BCD码,
CY= 1,执行指令:
ADDC A,R3
DA A
( A)+( R3)= 1011,1101B
加 6调整,1011,1101B+ 0110,0110B
= 1,0010,0011B = 123
3.3.3 逻辑运算及移位类指令共 24条,
包括 逻辑运算,
与,或,异或,清零,求反指令;
运算特点,按位操作移位指令 等操作 。
1,逻辑与运算指令组 ( 6条 )
与运算符号,∧ 。
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
应用:常用于屏蔽字节中的某些位 。
欲清除的位和,0” 与,欲保留的位和,1” 与 。
1111,1111 ∧ 0101,0101= 0101,0101
例 3-13 已知内部 RAM 40H单元存放着压缩的 BCD码
0011,0111,试编程将其变成非压缩的 BCD码,并将其高位和低位分别存于 42H和 41H单元。
ORG 2000H
MOV 40H,#37H
MOV A,40H
ANL A,#0FH
MOV 41H,A
MOV A,40H
SWAP A
ANL A,#0FH
MOV 42H,A
NOP
END
2,逻辑或运算指令组 ( 6条 )
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
用途:用于使字节中的某些位置,1” 。
欲不变的位,用,0” 去,或,,
欲置 1 的位,用,1” 去,或,。
例:将累加器 A的低 4位传送到 P1口的低 4位,但 P1口的高 4位需保持不变 。 程序段如下:
MOV R0,A
ANL A,# 0FH
ANL P1,#0F0H
ORL P1,A
MOV A,R0
例 3-14 在内部 RAM 50H和 51H单元中分别存放着十进制数 4 和 5的 ASCII 码 34H 和 35H,编程将其转换为对应的十进制数,并合并成一个字节存放于 52H单元,其中低单元中的数存于低半字节,
高单元中的数存于高半字节。要求程序执行后,
50H和 51H中的数据保持不变 。
ORG 2100H
MOV 50H,#34H
MOV 51H,#35H
MOV A,50H
ANL A,#0FH
MOV 40H,A
MOV A,51H
ANL A,#0FH
SWAP A
ORL A,40H
MOV 52H,A
SJMP $
END
3,逻辑异或运算指令组 ( 6条 )
运算符号,⊕,运算规则:
0⊕ 0= 0,1⊕ 1= 0,0⊕ 1= 1,1⊕ 0= 1
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
用途,用于对字节中某些位取反。
欲 取反位用,1” 去,异或,,欲保留位用,0” 去,异或,。
例如,将 5CH 的高位取反,低位保留。
0 1 0 1,1 1 0 1 B
⊕ 1 1 1 1,0 0 0 0 B
1 0 1 0,1 1 0 1 B
例 3-15 将内部 RAM 50H中数据的低 4位传送到
P1口的高 4位,P1口的低 4位翻转,而且要求程序执行后 50H中的数据保持不变。
ORG 2000H
MOV A,50H
ANL A,#0FH
SWAP A
ANL P1,#0FH
XRL P1,#0FH
ORL P1,A
END
4,累加器清 0取反指令组累加器清 0指令:
CLR A ; A← 0
累加器按位取反指令:
CPL A ; A← ( A )
例:对某一双字节数求补码 。 若高 8位存于 R1,低 8位存于
R0,补码的结果是高 8位仍存于 R1,低 8位存于 R0。
MOV A,R0 ; 低 8位数送 A
CPL A ; 取反
ADD A,#01H ; 加 1得低 8位数补码
MOV R0,A ; 低 8位补码存于 R0
MOV A,R1 ; 高 8位数送 A
CPL A ; 取反
ADDC A,#00H ; 加低 8位进位
MOV R1,A ; 高 8位补码存于 R1
5,移位指令组 ( 4条 )
( 1) 累加器 A循环左移指令
RL A
( 2) 累加器 A循环右移指令
RR A
A7←A 0 A7→A 0
( 3)累加器 A带进位循环左移指令
RLC A
( 4) 累加器 A带进位循环右移指令
RRC A
A7←A 0CY
A7←A 0CY
例 3-16:写出每条指令执行后累加器的内容 。
MOV A,#01H ; ( A) = 01H
RL A ; ( A) = 02H
RL A ; ( A) = 04H
RL A ; ( A) = 08H
RL A ; ( A) = 10H
RR A ; ( A) = 08H
RR A ; ( A) = 04H
RR A ; ( A) = 02H
RR A ; ( A) = 01H
结论:左移一位相当于乘 2,右移一位相当于除以 2。
在图 3-11中,若每次只有一个 LED亮,假设
LED0先亮,然后 LED1,依次类推,直到 LED7
亮后停止。要实现该功能,只需用累加器逻辑左移指令 7次就可以。
ORG 1000H
MOV A,#01H
MOV P1,A
RL A
MOV P1,A
RL A
MOV P1,A
RL A
MOV P1,A
RL A
MOV P1,A
RL A
MOV P1,A ;
RL A
MOV P1,A
RL A
MOV P1,A
END
ORG 1000H
MOV A,#01H ;循环时的初试数据
NEXT,MOVP1,A ;
数据送至 P1
RL A ;循环左移一次,(A)= 02H=2
SJMP NEXT;控制转移语句,跳转到 NEXT处
END
3.3.4 控制转移类指令无条件转移指令,
条件转移指令,
调用和返回指令空操作指令等 。
该类指令多数不影响程序状态标志寄存器 。
1,无条件转移指令组
( 1) 长转移指令
LJMP addr16; 跳转范围 64KB,PC← addr16,三字节指令
( 2) 绝对转移指令
AJMP addr11; 跳转范围 2KB,PC ← ( PC) + 2
PC10~0← addr11
假设,2070H AJMP 16AH
( PC) + 2= 0010,1000,0111,0010B( 2072H),
16AH = 001,0110,1010B
所以:目的地址= 2072H+ 16AH
= 0010,0001,0110,1010B( 216AH) 。
( 3) 短转移指令:
SJMP rel; 目的地址=( PC) +2+rel
例如,HERE,SJMP HERE ; 等待指令或 HERE,SJMP $ ; $表示 PC的当前值
( 4)间接转移指令
JMP @A+DPTR ; PC← ( A) +( DPTR)
该指令可代替众多的判别跳转指令,具有 散转功能(又称散转指令) 。键盘译码程序就是本指令的一个典型应用。
例 3-17 在图 3-7中由 K0,K1两个开关 (或按键 )控制单片机系统中一个电机的转动,其功能说明如表 3-2所示 。 试编写程序使系统能够自动识别按键,并执行相应的键处理程序 。
表 3-2 键功能
K1 K0 处理程序
0
0
1
1
0
1
0
1
ZZ(正转 )
FZ(反转 )
KS(快速 )
MS(慢速 )
ORG 1000H
MOV P1,#0FFH
MOV A,P1
ANL A,#03H
RL A
MOV DPTR,#KEY
JMP @A+DPTR
KEY,AJMP ZZ
AJMP FZ
AJMP KS
AJMP MS
ZZ,┇
FZ,┇
KS,┇
MS,┇
END
2,条件转移指令组
( 1) 累加器判零转移指令
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
例 3-18,将外部数据存储器 RAM从 1000H开始的连续单元的数据,传送到内部 RAM从 40H开始的连续单元,所传送的数据为零时,传送停止 。 参考程序如下:
MOV DPTR,#1000H
MOV R0,#40H
LOOP,MOVX A,@DPTR
JZ NEXT
MOV @R0,A
INC DPTR
INC R0
SJMP LOOP
NEXT,END
( 2) 数值比较转移指令,三字节指令
CJNE A,# data,rel
CJNE A,direct,rel
CJNE Rn,# data,rel
CJNE @ Ri,# data,rel
若 左操作数=右操作数,则:
程序顺序执行 PC← ( PC) + 3
进位标志位清 0 CY= 0
若 左操作数>右操作数,则,程序转移
PC← ( PC) + 3+ rel
CY= 0
若 左操作数<右操作数,则:
程序转移 PC← ( PC) + 3+ rel
CY= l
在 MCS-51中没有专门的数值比较指令,两个数的数值比较可利用这四条指令执行后 CY的状态来判断数值大小 。
若 ( CY) = 0,则左操作数>右操作数若 ( CY) = 1,则左操作数<右操作数例 3-19 若内部 RAM 40H存放着数据 X,并根据下式给 Y赋值,设函数值 Y保存于内部 RAM 50H
单元,编程实现此功能。
0
0
0
1
0
1
X
X
X
Y
ORG 2000H
MOV A,40H
CJNE A,#0,NZ
MOV 50H,#0 ;函数值 0送入 50H单元
SJMP FINISH
NZ,JC POST
MOV 50H,# 1
SJMP FINISH
POSI,MOV 50H,# 0FFH
FINISH,SJMP $ ;停机
END
ORG 2000H
MOV A,40H
JNZ LOOP
MOV 50H,#0 ;函数值 0送入 50H单元
SJMP FINISH
LOOP,ANL A,#80H
JZ POSI
MOV 50H,# -1
SJMP FINISH
POSI,MOV 50H,# 1
FINISH,SJMP $ ;停机
END
( 3) 循环转移指令 ( 或称为减 1非零转移指令 )
DJNZ Rn,rel ; 两字节指令; Rn← ( Rn) - 1; 若 (Rn)≠0,则 PC←( PC)+2+rel; 若 ( Rn) =0,则 PC← ( PC) +2
DJNZ direct,rel ; 三字节指令例 3-20 将内部 RAM从 40H开始的连续 20个单元的数据,传送到外部 RAM从 2000H开始的连续单元中。
解,ORG 2000H
MOV R1,#20 ;置循环次数
MOV R0,#40H
MOV DPTR,#2000H
LOOP,MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R1,LOOP
SJMP $
END
3,子程序调用与返回指令组
( 1) 子程序的概念程序的程序称之为主程序,主程序和子程序之间的调用关系可如图 3-10所示 。
返回 2
返回 1
第 2次调用第 1次调用子程序
DELA
Y
主程序
A
B
C
D
断点断点主程序调用子程序与从子程序返回示意
MCS- 5l共有两条子程序调用指令和返回指令 。
( 2) 长调用指令
LCALL addr16 ; PC← ( PC) +3; SP← ( SP) +1,( SP) ← ( PC) 7~ 0; SP← ( SP) +1,( SP) ← ( PC) 15~ 8; PC← addrl6
长调用指令的子程序调用范围是 64KB。
( 3) 绝对调用指令
ACALL addr11 ; PC← ( PC) +2; SP← ( SP) +1,( SP) ← ( PC) 7~ 0; SP← ( SP) +1,( SP) ← ( PC) 15~ 8; PC← addr11
( 4) 返回指令
RET ; 子程序返回指令
RETI ; 中断服务子程序 返回指令:
4,空操作指令
NOP ; PC← ( PC) + 1
例 3-22 编程实现 c = a2 +b2。设 a,b(均小于 10)和
c分别保存于内部 RAM的 40H,41H和 42H单元。
ORG 1000H
DATAA EQU 40H
DATAB EQU 41H
DATAC EQU 42H
START,MOV A,DATAA
ACALL SQR
MOV R1,A
MOV A,DATAB
ACALL SQR
ADD A,R1
MOV DATAC,A
SJMP $
SQR,INC A;子程序,用查表法求平方
MOVC A,@A+PC
RET
TAB,DB 0,1,4,9,16,25,36,49,
64,81
END
3,3,5 位操作类指令在指令中,位地址的表示方法主要有下列四种,AC
直接位地址表示:如 D6H( PSW的位 6);
点操作符表示:如 PSW.6,D0H.6;
位名称表示:如 AC;
1、位传送指令(共 2条)
MOV C,bit ; CY← ( bit)
MOV bit,C ; bit← ( CY)
两个寻址位间不能实现直接传送。
例 3-23 编程实现 20H位和 21H位内容的互换。
解:参考程序如下:
ORG 1000H
BUF BIT 30H ;位定义伪指令
MOV C,20H ; 20H暂存于 BUF
MOV BUF,C
MOV C,21H ; 21H位内容传送至 20H
MOV 20H,C
MOV C,BUF ; 20H位内容传送至 21H
MOV 21H,C
END
2,位置位清零指令 ( 共 4条 )
CLR bit ; bit← 0
CLR CY ; CY← 0
SETB bit ; bit← 1
SETB CY ; CY← 1
3、位逻辑操作指令(共 6条)
位逻辑操作包括逻辑与、或、非三种,共六条指令。
ANL C,bit ; CY← ( CY) ∧ bit
ANL C,/ bit ; CY← ( CY) ∧
ORL C,bit ; CY← ( CY) ∨ bit
ORL C,/ bit ; CY← ( CY) ∨
CPL bit ; bit← ()
CPL C ; CY← ( )
例 3-24 完成 Z=X⊕ Y的运算,其中 X,Y,Z表示位地址。
解:异或运算可表示为,因此参考程序段如下:
MOV C,X ; CY←(X)
ANL C,/Y ; CY←(X) ∧ ()
MOV Z,C ;暂存结果于 Z中
MOV C,Y ; CY←(Y)
ANL C,/X ; CY←() ∧ (Y)
ORL C,Z ;
CY←(X)() ∨ ()(Y)
MOV Z,C ;保存异或结果于 Z中
YXYXZ
4,位条件转移指令
( 1) 以 CY内容为条件的转移指令 ( 2条 )
JC rel; 若( CY) =1,则( PC) ← ( PC) +2+ rel转移,
否则( PC) ← ( PC) +2顺序执行
JNC rel; 若( CY) =0,则( PC) ← ( PC) +2+ rel转移,
否则( PC) ← ( PC) +2顺序执行这两条指令一般与比较条件转移指令 CJNE一起使用。
( 2) 以位地址内容为条件的转移指令 ( 3字节指令 )
JB bit,rel; 若 ( bit) =1,则 ( PC) ← ( PC) +3+ rel转移否则,( PC) ← ( PC) +3顺序执行
JNB bit,rel
JBC bit,rel; 若 ( bit) =1,则 ( PC) ← ( PC) +3+ rel转移,
( bit) ← 0; 则,( PC) ← ( PC) +3顺序执行例 3-25 用位操作类指令编程实现符号函数。
ORG 2000H
VAR EQU 40H
FUNC EQU 50H
START,MOV A,VAR ;取 x
JZ COMP ;为零转 COMP
JNB ACC.7,POSI ; x>0,转 POSI
MOV A,# -1 ; x<0,(A)=- 1
SJMP COMP
POSI,MOV A,#01H
COMP,MOV FUNC,A ;保存结果
END
例 3-26 植物、动物的生长都需要一个适宜的温度,因此经常需要将温室内的温度控制在一个范围内。假设某温室允许的最高温度是 MAX,最低温度为 MIN,计算机采集的温度 T放在累加器
A中。若采集的温度 T≥MAX,则程序转向降温处理程序 JW;若 T≤MIN,则转向升温处理程序
SW;若 MIN<T<MAX,则返回主程序。
CJNE A,#MIN,LOOP1; T≠MIN,转向
LOOP1
AJMP SW ; T= MIN,转向 SW
LOOP1,JC SW ; T<MIN,转向 SW
CJNE A,#MAX,LOOP2 ; T≠MAX,转向 LOOP1
AJMP JW ; T= MAX,转向 JW
LOOP2,JNC JW
SJMP FH
SW,┇;升温处理程序
JW,┇;降温处理程序
FH,RET
思考题与习题
3-1 MC5-51系列单片机的七种寻址方式都适用于源操作数和目的操作数吗?
3-2 专用寄存器 PSW的作用是什么?它能反映指令的哪些运行状态?
3-3 变址寻址和相对寻址中的地址偏移量有何异同?
3-4 什么是伪指令?伪指令与指令系统中的汇编指令有什么区别?
3-5 指出下列指令中源操作数和目的操作数的寻址方式。
指令目的操作数 源操作数
(1)MOV DPTR,#2010H
(2)MOV R0,P1
(3)MOV @R1,R6
(4)MOV C,20H
(5)MOV A,20H
(6)MOVC A,@A+DPTR
(7)PUSH A
(8)JC LOOP
(9)LJMP DELAY
3-7 试比较下列各组指令的异同,说明原因。
(1)MOV A,R0 与 MOV A,@R0
(2)MOV @R1,A 与 MOVX @R1,A
(3)MOV C,20H 与 MOV A,20H
(4)MOVX A,@DPTR
与 MOVC A,@A+DPTR (若 (A)= 0)
3-8 试分析下面两组指令的执行结果有何不同?
(1)MOV A,#0FFH (2) MOV A,#0FFH
INC A ADD A,#01H
3-9 设 (SP)= 30H,内部 RAM的 (40H)= 12H,
(41H)= 56H,在下列程序段注释括号中填执行结果。
PUSH 40H ; (SP)=,
((SP))=
PUSH 41H ; (SP)=,
((SP))=
POP DPL ; (SP)=,
(DPH)=
POP DPH ; (SP)=,
(DPH)=
MOV A,#0
MOVX @DPTR,A
该段程序的功能是 。
3-10 已知 (SP)=25H,(PC)=2345H,(24H)=12H,
(25H)=34H,(26H)=56H,问此时执行,RET”指令后
(SP)=,(PC)= 。
3-11 找出错误的指令,并在括号中标识,×,。
(1)MOV A,DPTR( ) (8) MOV C,20H ( )
(2)CPL R0 ( ) (9) MOV 20H,@DPTR
( )
(3)PUSH DPTR ( ) (10)MOVX @DPTR,#50H
( )
(4)POP 40H ( )(11)MOV DPTR,#1000H( )
(5)MOV 30H,31H( )(12)MOVC A,@A+PC
( )
(6)RLC R0( ) (13)SETB R7.0 ( )
(7)MOV B,C ( )(14)XRL A,#30H
3-12 写出能完成下列数据传送的指令;
(1) R1中内容传送到 R0;
(2) 内部 RAM 20H单元中内容送到 30H单元;
(3) 外部 RAM 20H单元中内容送到内部 RAM
20H单元;
(4) 外部 RAM 2000H单元中内容送到内部
RAM 20H单元;
(5) 外部 ROM 2000H单元中内容送到内部
RAM的 20H单元;
(6) 外部 ROM 2000H单元中内容送到外部
RAM的 3000H单元。
3-13 编程实现将外部 RAM 1000H开始的 100个单元的内容清零。
3-14 已知从内部 RAM的 30H开始存放有 20个有符号数,试编程统计其负数和正数 (包括 0)
的个数,并分别保存在 R0和 R1中。
3-15 利用减 1条件转移指令把外部 ROM从
2000H开始的数据块传送到外部 RAM从 1000H
开始的存储区中,当数据为,0”时停止传送。
3-16 完成 Z=X⊙ Y的同或运算,其中 X,Y,Z
表示位地址。
3-13 编程实现将外部 RAM 1000H开始的
100个单元的内容清零。
MOV DPTR,#1000H
MOV R7,#100
CLR A
LOOP:MOVX @DPTR,A
INC DPTR
DJNZ R7,LOOP
END
3-14 已知从内部 RAM的 30H开始存放有 20个有符号数,试编程统计其负数和正数 (包括 0)的个数,并分别保存在 R0和 R1中。
MOV R0,#30H
MOV R7,#20
MOV R1,#0;负数
MOV R2,#0;正数
LOOP:MOV A,@R0
JB ACC.7,NEG
INC R2
SJMP LOOP1
NEG:INC R1
LOOP1:INC R0
DJNZ R7,LOOP
MOV A,R2
MOV R0,A
END
3-15 利用减 1条件转移指令 把外部 ROM
从 2000H开始的数据块传送到外部 RAM
从 1000H开始的存储区中,当数据为,0”
时停止传送。
3-16 完成 Z=X⊙ Y的同或运算,其中 X、
Y,Z表示位地址。
思考题与习题
1,MCS-51系列单片机指令系统中有哪些寻址方式?相应的寻址空间在何处?请举例说明。
2,片内 RAM 20H~2FH中的 128个位地址与直接地址
00H~7FH形式完全相同,如何在指令中区分出位寻址操作和直接寻址操作?
3,什么是源操作数?什么是目的操作数?通常在指令中如何区分?
4,查表指令是在什么空间上的寻址操作?
5,专用寄存器 PSW起什么作用?它能反映哪些指令的运行状态?
6,查表指令中都采用了基址加变址的寻址方式,使用
DPTR或 PC作为基址寄存器,请问这两个基址寄存器中的基址代表什么地址?
7,可以通过哪些方法将片内 RAM 60H单元的内容传送到片内 70H单元?
10,已知 ( A) =7AH,( R0) =30H,( 30H) =A5H,
( PSW) =80H,写出下列各条指令执行后 A和 PSW的内容 。
( 1) XCH A,R0; ( 2) XCH A,30H;
( 3) XCH A,@R0; ( 4) XCHD A,@R0;
( 5) SWAP A ( 6) ADD A,R0;
( 7) ADD A,30H; ( 8) ADD A,#30H;
( 9) ADDC A,30H; ( 10) SUBB A,#30H;
11.试比较下列每组两条指令的区别。
(1) MOV A,#24H 与 MOV A,24H;
(2) MOV A,R0 与 MOV A,@R0;
(3) MOV A,@R0 与 MOV A,@DPTR;
(4) MOVX A,@R1 与 MOVX A,@DPTR;
12.已知单片机使用 6MHZ晶体,试编写一个延时 1ms的子程序。
13.已知( A) =83H,( R0) =17H,( 17H) =34H,请写出下列程序段执行后 A中的内容。
ANL A,#17H
ORL 17H,A
XRL A,@R0
CPL A
CPL C
SETB 01H
LOOP1,ORL C,ACC.0
JB ACC.2,LOOP2
CLR 00H
LOOP2,MOV P1,A
----------------------
16,编写程序完成将片外数据存储器地址为
1000H~1030H的数据块,全部传送到片内 RAM
30H~60H中,并将原数据块区域全部清零。
例:比较内部 RAM中 30H和 40H中两个无符号数的大小,大数存于 50H,小数存于 51H单元中 。 若两数相等,则置位片内
RAM的位 127。
程序段如下:
MOV A,30H
CJNE A,40H,Q1 ; 两数不等则转 Q1
SETB 127 ; 相等则置位 127
SJMP NEXT ; 出口
Q1,JC Q2 ; 大数在 40H单元,转 Q2
MOV 50H,A ; 大数在 30H单元
MOV 51H,40H ; 小数存于 51H单元
SJMP NEXT ; 出口
Q2,MOV 50H,40H ; 大数在 40H单元
MOV 51H,A ; 小数存于 51H单元
NEXT,RET ; 统一出口