Download presentation
Presentation is loading. Please wait.
1
本章内容 MCS-51单片机指令系统的格式 MCS-51单片机寻址方式 指令系统的分析
本章采用简单例程讲解解汇编语言指令功能
2
3.1 指令格式 指令:即命令, 人们给计算机的命令 指令有两种表示方式: 机器码——机器语言(机器能直接识别)
助记符——汇编语言(供设计人员使用) 机器码和助记符一一对应,汇编语言可汇编为机器语言,机器语言可反汇编为汇编语言。
3
3.1 指令格式 [标号:] 操作码助记符 [操作数] ;[注释] 汇编语言格式:
[标号:] 操作码助记符 [操作数] ;[注释] START : MOV A , #20H ; 把数20H送入累加器A 中 INC A ; (A)加一
4
3.1 指令格式 汇编语言指令的形式: (1)没有操作数: RET,RETI,NOP (2)有1个操作数: INC A,DEC 20H,CLR C,SJMP NEXT (3)有2个操作数: MOV R7, #DATA,ADD A, R0, DJNZ R2, LOOP (4)有3个操作数: CJNE A, #20H, NEQ
5
3.1 指令格式 机器语言的形式: (1)单字节指令 : INC DPTR 指令机器代码:A3 ADD A, R7 指令机器代码:2F
(2) 双字节指令 : SUBB A, 2BH 指令机器代码:95 2B ORL C, /27H 指令机器代码:A0 27 (3)三字节指令: MOV 20H, #00H 指令机器代码: LJMP 2000H 指令机器代码:
6
3.2 MCS-51 单片机的寻址方式 寻址方式 :CPU执行指令时获取操作数的方式 MCS-51单片机有7种不同的寻址方式 :
(1)立即寻址方式 (2)直接寻址方式 (3)寄存器寻址方式 (4)寄存器间接寻址方式 (5)变址寻址方式 (6)位寻址方式 (7)相对寻址方式
7
3.2 MCS-51 单片机的寻址方式 (1)立即寻址方式:在指令中直接给出了参与运算的操作数。 MOV A , #20H
(2)直接寻址方式:指令中给出了参与运算的操作数所在单元的地址或所在位的位地址 MOV A , 20H MOV 27H.1, C 直接寻址方式的使用范围: 1)单元地址 : 00~7FH 、21个SFR 2)对SFR的访问只能采用直接寻址方式
8
3.2 MCS-51 单片机的寻址方式 (3)寄存器寻址方式 指令指出了参与运算的操作数所在的寄存器。 MOV A , R0
寄存器寻址方式中的寄存器 : 1)工作(通用)寄存器R0~R7 、DPTR 2)累加器A、寄存器B(仅在乘除法时)和布 尔累加器C
9
3.2 MCS-51 单片机的寻址方式 (4)寄存器间接寻址方式 在指令中,指出了存放参与运算的操作数所在单元地址的寄存器。
MOV 地址寄存器 CPU ? !! 操作数在哪儿? 它的地址在R0中 RAM 得到地址了! 找数! A ROM MOV (A) 地址在(R0)
10
3.2 MCS-51 单片机的寻址方式 可以作为地址寄存器的寄存器: 把存放操作数地址的寄存器称为地址寄存器。
可作为地址寄存器的寄存器:R0、R1、DPTR、SP(隐含) @DPTR 寄存器间接寻址方式寻址范围: 1)片内RAM:00~7FH; 2)片外RAM:0000~FFFFH;
11
3.2 MCS-51 单片机的寻址方式 (5)变址寻址方式(基址寄存器+变址寄存器间接寻址)
操作数的地址由基址寄存器+变址寄存器间接寻址指出。 1)MCS-51单片机中可以作基址寄存器: 2个十六位寄存器,DPTR和PC 2)MCS-51单片机中变址寄存器: 8位寄存器:累加器A 3)操作数存放在一个由[(PC)+(A)]或[(DPTR)+(A)]指出的十六位地址所指的单元中(在ROM中。
12
3.2 MCS-51 单片机的寻址方式 MCS-51单片机变址寻址方式有以下3种指令: MOVC MOVC
13
3.2 MCS-51 单片机的寻址方式 (6)位寻址方式 在指令中,指出了参与运算的操作数(一位)所在的位地址或寄存器(仅有位累加器C)。
指令中位地址为: 1)20~2FH的16个单元的128 位;00~7FH 2)专用寄存器(SFR)中的某些寄存器中的位(80~FFH) CLR C MOV 00H,C MOV 20H.0, C
14
3.2 MCS-51 单片机的寻址方式 (7)相对寻址方式
与程序的执行顺序有关,在指令执行时改变了程序计数器PC的内容,从而改变了程序转移的目标地址。 当前的PC值加上指令中给出的地址偏移量rel(相对量)而形成的目的(标)地址。 相对量只出现在相对转移指令中。 目的地址=源地址+rel+指令的字节数 rel =目的地址—源地址—指令的字节数 rel:指令中给出的地址偏移量。-128~+127,用补码表示,大于0正向跳转(向后),小于0则反向跳转(向前)。
15
3.2 MCS-51 单片机的寻址方式 MCS-51单片机相对寻址方式的指令: JC rel SJMP NEXT1 JZ FIRST DJNZ R1,LOOP2 CJNE A, 20H, NEXT JNB TF0,REDO
16
3.3 指令系统分析 3.3.1 指令的分类 MCS-51单片机共有111条指令 (1)按指令代码的字节数 单字节指令(49条)
双字节指令(45 条) 三字节指令(17 条) (2)按指令执行的时间 单机器周期指令(64条) 双机器周期指令(45条) 四机器周期指令(2条)
17
3.3.1 指令的分类 (3)按照指令功能可分成五类: 数据传送类指令(29条) 算术运算类指令(24条) 逻辑运算类指令 (24条)
控制转移类指令(17条) 位操作类指令 (17条)
18
3.3.2 指令系统分析 一、数据传送类指令 数据传送(Data Transfers)类指令共有29条,分为以下5种类型:
(1)通用传送指令 (2)堆栈操作指令 (3)交换指令 (4)访问程序存储器的指令 (5)访问外部RAM的指令
19
3.3.2 指令系统分析 (一)通用传送指令 通用传送指令的一般形式为 : MOV 目的操作数,源操作数
通用传送指令的一般形式为 : MOV 目的操作数,源操作数 (1)以A为目的操作数的传送指令 (4条) MOV A,源操作数 MOV A,Rn ;(Rn)(A),n=0~7 MOV A,direct ;(direct) (A) MOV ;[(Ri)] (A),i=0, 1 MOV A,#data ; data (A)
20
3.3.2 指令系统分析 例 MOV A,R2 MOV A,30H MOV MOV A,#36H
21
3.3.2 指令系统分析 (2) 以Rn为目的操作数的传送指令(3条) 一般形式: MOV Rn,源操作数
MOV Rn ,A ;(A)(Rn) MOV Rn ,direct;(direct) (Rn) MOV Rn ,#data ; data (Rn) 例:MOV R0,A MOV R3,30H MOV R7,#36H MOV R1,#30 MOV R6,# B
22
3.3.2 指令系统分析 (3) 以直接地址为目的操作数的指令(5条) 一般形式:MOV direct,源操作数
MOV direct,A ;(A)(direct) MOV direct,Rn ;(Rn)(direct) MOV direct1,direct2;(direct2)(direct1) MOV ;[(Ri)](direct) MOV direct,#data ;data(direct)
23
3.3.2 指令系统分析 例: MOV 30H,A MOV P1,R2 MOV 38H,60H MOV MOV 58H,#36H
24
3.3.2 指令系统分析 (4)以间接地址为目的操作数的指令(3条) 一般形式:MOV @Ri,源操作数
MOV @Ri,A ;(A)[(Ri)] MOV @Ri,direct ;(direct) [(Ri)] MOV @Ri,#data ;data [(Ri)] 如:MOV @R0,A MOV @R1,36H MOV @R0,SBUF MOV @R1,#48 MOV @R0,#0D6H
25
3.3.2 指令系统分析 例1:已知(PSW)= 00H,(A)=11H,(20H) =22H,分析下列程序的执行结果 MOV R0,A
MOV R1,20H MOV R2,#33H 分析: PSW CY AC F0 RS0 OV P RS1 - 00H BANK 0 R0~R1:00H~07H
26
3.3.2 指令系统分析 MOV R0,A ; (A)(R0),即 (A)(00H)
MOV R1,20H ; (20H)(R1),即 (20H) (00H) MOV R2,#33H ; 33H(R2) 分析结果如下: (R0)=(00H)=11H (R1)=(01H)=22H (R2)=(02H)=33H 26
27
3.3.2 指令系统分析 例2:已知(PSW)=00H,(A)=11H,(00H)=22H,(01H)=36H,(36H)=33H,(33H)=44H,分析下列程序的执行结果。 MOV 30H,A; MOV 31H,R0; MOV 32H,33H; MOV MOV 35H,#55H 11 A 33 36H XX 35H XX 34H 44 33H XX 32H XX 31H 36 01H 22 00H 27
28
3.3.2 指令系统分析 例2:已知(PSW)=00H,(A)=11H,(00H)=22H,(01H)=36H,(36H)=33H,(33H)=44H,分析下列程序的执行结果。 MOV 30H,A; (A)(30H) MOV 31H,R0; (R0)(31H), (00H)(31H), MOV 32H,33H; (33H)(32H) MOV [(R1)](34H), [36H](34H), MOV 35H,#55H; (35H)=55H 分析结果如下:(30H)=11H,(31H)=22H,(32H)=44H,(34H)=33H,(35H)=55H。 33 36H 55 35H 34H 44 33H 32H 22 31H 11 30H 36 01H 00H A
29
3.3.2 指令系统分析 (5) 十六位数据传送指令(1条) MOV DPTR,#data16
(5) 十六位数据传送指令(1条) MOV DPTR,#data16 ; data8~15(DPH),data0~7 (DPL) 如:MOV DPTR,#2368H MOV DPTR,#35326 上述操作同: MOV DPH,#23H MOV DPL,#68H
30
3.3.2 指令系统分析 在使用通用数据传送指令时,应注意以下几点 :
(1)MCS-51单片机不支持工作寄存器R0~R7内容直接传送给由地址寄存器内容指定的单元,或由地址寄存器内容指定单元的内容送给工作寄存器R0~R7,如果需要传送,可采用其他方式间接实现。 例如:希望把地址寄存器R1内容指定的单元内容传送给工作寄存器R5,可以采用 MOV MOV R5, A
31
3.3.2 指令系统分析 (2)在通用数据传送指令中,地址寄存器只能由工作寄存器R0和R1担当,其他工作寄存器没有这个功能。
(3)虽然MCS-51单片机由2个16位的寄存器:PC和DPTR,但只有DPTR用户可以用指令方式直接设置其内容。 MOV DPTR,#5678H
32
3.3.2 指令系统分析 (二)堆栈操作指令 堆栈是在内部RAM中开辟的一个先进后出(后进先出)的区域,用来保护CPU执行程序的现场
1.入栈指令 PUSH direct; CPU操作:(SP)+1 (SP),修改堆栈指针; (direct) [(SP)],入栈: 例如:MOV SP, #70H PUSH 60H A8 69 FE C6 CA 片内RAM 60 61 (SP) 70 71 72 (SP) A8
33
3.3.2 指令系统分析 2 .出栈指令 POP direct CPU操作:
[(SP)] (direct),出栈,把堆栈中由(SP)所指 单元的内容传送到指定单元direct。 (SP)-1 (SP),修改堆栈指针 例如: MOV SP, #71H POP 60H 片内RAM 60 61 70 71 72 A8 69 FE C6 CA C6 (SP) (SP)
34
3.3.2 指令系统分析 在使用堆栈时,应注意以下几点 :
(1)PUSH和POP指令的操作数必须是单元地址。 PUSH指令中指定的单元地址是被保护单元的地址(源操作数),指令隐含了目的操作数;而POP指令中指定的单元地址是内容要恢复的单元地址(目的操作数),指令隐含了源操作数。 (2)MCS-51单片机的堆栈建在内部RAM中,单片机复位后,(SP)=07H,从08H单元开始的区域均为栈区。在应用系统中,一般把栈区开辟在内部RAM的30~7FH这一区域,栈区最好靠近内部RAM的末端,以避免堆栈加1向上增长时覆盖有效数据。
35
3.3.2 指令系统分析 (3)在使用堆栈操作指令时,入栈指令PUSH和出栈指令POP应成对出现,保护指定单元内容时,必须遵循先进后出的步骤,否则,单元内容在出栈恢复时会发生改变。 (4)MCS-51单片机不支持对工作寄存器R0~R7直接使用堆栈操作指令。如果要用堆栈操作保护某一寄存器Rn(n=0~7)的状态,可用该工作寄存器对应单元进行操作。如当(PSW.4)=1、(PSW.3)=0时,把R5的内容入栈 PUSH 15H; 出栈时 POP 15H; 恢复R5原来的内容。
36
3.3.2 指令系统分析 例: 已知(30H)=11H,(31H)=22H,则下列程序段的操作过程为: MOV SP, #60H ;开辟栈区
PUSH 30H ;(SP)+1 (SP),30H单元内容进栈61H单元 PUSH 31H ;(SP)+1 (SP),31H单元内容进栈62H单元, ;(SP)=62H POP ACC ;[(SP)](ACC),62H单元内容弹出到累加器 ;ACC,(SP)-1(SP),(SP)=61H。 POP B ;[(SP)](B),栈顶61H单元内容弹出寄存器B, ;(SP)-1(SP),(SP)=60H。
37
3.3.2 指令系统分析 (三)交换指令 (1)字节交换指令 将源操作数的内容与A累加器的内容互换。 XCH A,源
指令: XCH A,Rn ; (A)(Rn) XCH A,direct ; (A)(direct) XCH ; (A)[(Ri)]
38
3.3.2 指令系统分析 例:将内RAM的20H单元的内容与40H单元交换。 方法1: MOV A, 20H XCH A, 40H
MOV 20H, A 方法2: MOV 20H, 40H MOV 40H, A
39
XCHD A,@Ri ; (A0~3) [(Ri)0~3]
3.3.2 指令系统分析 (2)半字节交换指令 XCHD ; (A0~3) [(Ri)0~3] 将某一单元内容的低四位与累加器A的低四位互换,而二者的高四位保持不变。 D0 D1 D2 D3 D4 D5 D6 D7 (A) D0 D1 D2 D3 D4 D5 D6 D7 [(R0)] 执行过程 XCHD D4 D5 D6 D7 (A) D0 D1 D2 D3 D4 D5 D6 D7 [(R0)] D0 D1 D2 D3
40
3.3.2 指令系统分析 例:两个单元的低四位互换。 MOV A, 20H XCHD A, 40H MOV 20H, A
41
3.3.2 指令系统分析 (3)高低四位互换指令 将累加器A的高四位和低四位互换。 SWAP A ;(A0~3)(A4~7) (A)
D0 D1 D2 D3 D4 D5 D6 D7 (A) 1 D0 D1 D2 D3 D4 D5 D6 D7 (A) (A) D0 D1 D2 D3 D4 D5 D6 D7 (A) 1 1 如:设(A)=5BH SWAP A ; D0 D1 D2 D3 D4 D5 D6 D7 (A)=B5H
42
3.3.2 指令系统分析 (四)访问程序存储器的指令(查表指令) MOVC A,@A+DPTR ; [(A)+(DPTR)](A)
DPTR放表的首地址,A放所查数据在表中的偏移;查表范围为64KB空间。 MOVC ;(PC)+1 (PC) [(A)+(PC)](A) PC的值为下一条指令的地址, A放所查数据相对PC值的偏移;查表范围为最大为256B空间
43
3.3.2 指令系统分析 (五)访问外部RAM和外部I/O口的数据传送指令 1 .以DPTR为地址寄存器的指令 (1)读(输入)指令:
MOVX ;[(DPTR)] (A) 说明: 上述指令以DPTR为片外RAM单元的16位地址指 针,寻址范围为寻址范围为0000~FFFFH,即64K 。
44
3.3.2 指令系统分析 MOVX A, @DPTR 被访问单元 (DPTR) A DPL DPH
45
CPU执行读外部数据存储器和外部I/O口指令的时序
3.3.2 指令系统分析 CPU执行读外部数据存储器和外部I/O口指令的时序
46
3.3.2 指令系统分析 例:把外部RAM的2000H单元的内容存入单片机内部RAM的30H单元。 MOV DPTR, #2000H
MOVX A, @DPTR MOV 20H, A 注意: 1、外部RAM单元和外部I/O口的地址为16位; 2、外部RAM单元和外部I/O口的信息必须通过A累加器才能进入单片机的CPU。
47
3.3.2 指令系统分析 (2)写(输出)指令: 将单片机的累加器A的内容输出到外部RAM某一单元或外部I/O口。
MOVX @DPTR,A ; (A) [(DPTR)] 说明: 上述指令以DPTR为片外RAM单元的16位地址指针,寻址范围为寻址范围为0000~FFFFH ,即64K
48
3.3.2 指令系统分析 MOVX @DPTR, A 被访问单元 (DPTR) A DPL DPH
49
CPU执行写外部数据存储器和外部I/O口指令的时序
3.3.2 指令系统分析 CPU执行写外部数据存储器和外部I/O口指令的时序
50
3.3.2 指令系统分析 例:把单片机内部RAM的20H单元的内容转存到外部RAM的8000H单元。 MOV DPTR, #8000H
MOV A, H MOVX @DPTR, A 注意: 1、外部RAM单元和外部I/O口的地址为16位;而单片机内部RAM的单元地址为8位。 2、单片机片内RAM单元的信息输出到外部RAM单元或外部I/O口,必须通过A累加器实施。
51
3.3.2 指令系统分析 2 .以R0和R1为地址寄存器的指令 (1)读(输入)指令
MOVX ;[(P2)(Ri)] (A),Ri=0, 1; 说明: 上述指令以R0或R1作低8位地址指针,由P0口送出,寻址范围为00~FFH ,256B空间,高8位由当前的P2口状态提供。
52
3.3.2 指令系统分析 MOVX A, @R0 被访问单元 A R0
53
3.3.2 指令系统分析 (2)写(输出)指令 MOVX @Ri,A ;(A) [(P2)(Ri)],Ri=0, 1;
说明: 上述指令以R0或R1作低8位地址指针,由P0口送出,寻址范围为256B空间,高8位由当前的P2口状态提供。 注意: (1)上述2种指令的操作时序与前面访问外部RAM的指令相同。 (2)采用R0或R1作为地址寄存器指出的是外部RAM和外部I/O口的低八位地址,当扩展的数据存储器单元和I/O口的空间不大于256个时,P2口可以作为I/O口使用。
54
3.3.2 指令系统分析 MOVX @R0, A 被访问单元 A R0
55
3.3.3 算术运算指令 (一) 二进制加法指令 (1)不带进位位的加法指令 ADD A,源 ; (A)+源(A)
(一) 二进制加法指令 (1)不带进位位的加法指令 ADD A,源 ; (A)+源(A) 源—— 指令: ADD A,#data ; (A)+ data (A) ADD A,Rn ; (A)+ (Rn) (A) ADD A,direct ; (A)+ (direct) (A) ADD ; (A)+[(Ri)] (A) 影响标志位Cy,AC,OV,P
56
3.3.3 算术运算指令——加法指令 加法指令执行过程与标志位之间的关系 +) D6与D7两位其中一位在运算中有进位,而另一位
算术运算指令——加法指令 加法指令执行过程与标志位之间的关系 D0 D1 D2 D3 D4 D5 D6 D7 (A) 源 +) 结果 进位 (AC)=1 (Cy)=1 (Cy) D6与D7两位其中一位在运算中有进位,而另一位 没有,则(OV)=1,否则,(OV)=0. 运算结果(A)中1的个数为偶数,(P)=0,否则,(P)=1
57
3.3.3 算术运算指令——加法指令 (2)带进位位的加法指令 ADDC A,源 ; (A)+源+(Cy)(A)
算术运算指令——加法指令 (2)带进位位的加法指令 ADDC A,源 ; (A)+源+(Cy)(A) 源—— 指令: ADDC A,#data ADDC A,Rn ADDC A,direct ADDC 影响标志位Cy,AC,OV,P
58
3.3.3 算术运算指令——加法指令 带进位位加法指令执行过程 +) (A) 源 结果 进位 (Cy)=1 (AC)=1 Cy D0 D1
算术运算指令——加法指令 带进位位加法指令执行过程 D0 D1 D2 D3 D4 D5 D6 D7 (A) 源 +) 结果 Cy 进位 (AC)=1 (Cy)=1 58
59
3.3.3 算术运算指令——加法指令 例1:单字节二进制加法:x存放在20H单元,y存放在21H单元,求 z=x+y(设z小于0FFH)
D0 D1 D2 D3 D4 D5 D6 D7 +) (Cy) 程序: MOV A,20H ADD A,21H MOV 22H,A ;结果存22H单元 如果z=x+y的结果大于255,势必会产生进位,进位如何处理?
60
3.3.3 算术运算指令——加法指令 例2:单字节二进制加法:x存放在20H单元,y存放在21H单元,求 z=x+y 进位位处理 +) D0
算术运算指令——加法指令 例2:单字节二进制加法:x存放在20H单元,y存放在21H单元,求 z=x+y D0 D1 D2 D3 D4 D5 D6 D7 +) Cy 进位位处理
61
3.3.3 算术运算指令——加法指令 程序: MOV A, 20H ADD A, 21H MOV 23H, A;和的低八位
算术运算指令——加法指令 程序: MOV A, 20H ADD A, 21H MOV 23H, A;和的低八位 MOV A, #00 ADDC A, #00 ;处理进位 MOV 22H, A ;和的高八位 D0 D1 D2 D3 D4 D5 D6 D7 +) Cy 进位位处理
62
3.3.3 算术运算指令——加法指令 例3:双字节二进制加法:x存放在20H、21H单元(高8位在20H单元),y存放在22H、23H单元(高8位在20H单元) ,求 z=x+y 20H 21H 23H 22H +) 32H 31H 33H XX 20H 21H 22H 23H 24H 25H 26H 27H 内RAM x y 多字节二进制加法与双字节原理相同,可以将此算法推广到多字节!
63
3.3.3 算术运算指令——加法指令 程序: MOV A, 21H ADD A, 23H MOV 31H, A;结果的低8位
ADDC A, 22H MOV 32H, A;结果的中8位 MOV A, #00 ADDC A, #00 ;处理进位 MOV 33H, A ;结果的高8位 20H 21H 23H 22H +) 32H 31H 33H
64
3.3.3 算术运算指令——加法指令 (3)加1指令 INC 源; 源+1 源 源——A,Rn,direct,@Ri 指令 INC A
算术运算指令——加法指令 (3)加1指令 INC 源; 源+1 源 指令 INC A INC Rn INC direct INC @Ri INC DPTR 以上指令不影响标志CY、AC和OV
65
3.3.3 算术运算指令——加法指令 例4:(R7)=0FFH,执行“INC R7”,(R7)为多少? R7 +) R7 丢弃
算术运算指令——加法指令 例4:(R7)=0FFH,执行“INC R7”,(R7)为多少? 1 D0 D1 D2 D3 D4 D5 D6 D7 +) R7 R7 1 丢弃 (R7)=00H,向上溢出!
66
算术运算指令——加法指令 例5:双字节二进制加法:x存放在21H 、20H单元(高8位在21H单元),y存放在31H 、 30H单元(高8位在31H单元) ,求 z=x+y XX 20H 21H 22H 23H 30H 31H 32H 内RAM Cy Cy 21H 20H 30H 31H +) 32H (R0) 00 (R0) 00 (R1) (R1) (R1)
67
3.3.3 算术运算指令——加法指令 21H 20H 30H 31H +) 32H MOV R0, #20H; 指向被加数的低8位
算术运算指令——加法指令 MOV R0, #20H; 指向被加数的低8位 MOV R1, #30H;指向加数的低8位 MOV A, @R0 ADD A, @R1 A;结果的低8位 INC R0; 修改单元地址 INC R1 ADDC A, @R1 A;结果的中8位 MOV A, #00 ADDC A, #00 ;处理进位 A ;结果的高8位 21H 20H 30H 31H +) 32H
68
3.3.3 算术运算指令——加法指令 (4)十进制加法调整指令 DA A ; 影响标志位Cy、AC、OV、P 说明:
算术运算指令——加法指令 (4)十进制加法调整指令 DA A ; 影响标志位Cy、AC、OV、P 说明: 1)该指令必须与加法指令联合使用!将A中的和调整为BCD码,并且ADD或ADDC的两个操作数是BCD码; 2)调整方法: 若(A0~3)>9或(AC)=1,则(A0~3) +6(A0~3); 若(A4~7)>9或(Cy)=1,则(A4~7) +6 (A4~7); 68
69
3.3.3 算术运算指令——加法指令 低四位调整 高四位调整 “DA A” 调整方法:
算术运算指令——加法指令 “DA A” 调整方法: 若(A0~3)>9或(AC)=1,则(A0~3) +6(A0~3); 若(A4~7)>9或(Cy)=1,则(A4~7) +6 (A4~7); CPU执行DA A的流程 低四位调整 高四位调整
70
3.3.3 算术运算指令——加法指令 使用DA A指令时,必须注意以下几点:
算术运算指令——加法指令 使用DA A指令时,必须注意以下几点: (1)该指令的前提是两个2位十进制数(BCD码)的加法,对加法运算的结果进行调整,使结果为十进制数,即将A中的和调整为BCD码。 (2)必须与加法指令联合使用! (3)单独使用该指令是不能把累加器A中的数据转换为BCD码形式的,因为,DA A的调整结果不仅依赖于累加器A的内容,而且与标志位Cy和AC的状态有关。
71
3.3.3 算术运算指令——加法指令 例6: 已知在30H和31H单元中分别存储两个BCD码表 示的十进制数19和53。求两个数之和,并把结果存到32H单元。 程序如下: MOV A, 30H ; (A)=19H ADD A, 31H ; (A)=19H+53H=6CH DA A ; 十进制调(A)=72H MOV 32H, A ; (32 H)=72H
72
算术运算指令——加法指令 例7:4位十进制数x和y,x存放在21H 、20H单元(高8位在21H单元),y存放在31H 、 30H单元(高8位在31H单元) ,求 z=x + y XX 20H 21H 22H 23H 30H 31H 32H 内RAM Cy Cy 21H 20H 30H 31H +) 32H (R0) 00 (R0) 00 DA A DA A (R1) (R1) (R1)
73
3.3.3 算术运算指令——加法指令 21H 20H 30H 31H +) 32H MOV R0, #20H; 指向被加数的低8位
算术运算指令——加法指令 MOV R0, #20H; 指向被加数的低8位 MOV R1, #30H;指向加数的低8位 MOV A, @R0 ADD A, @R1 DA A A;结果的低8位 INC R0; 修改单元地址 INC R1 ADDC A, @R1 A;结果的中8位 MOV A, #00 ADDC A, #00 ;处理进位 A ;结果的高8位 21H 20H 30H 31H +) 32H
74
3.3.3 算术运算指令——减法指令 (二)二进制减法指令 (1)带借位的减法指令 SUBB A,源; (A)-源-(Cy)(A)
源—— 指令: SUBB A,#data SUBB A,Rn SUBB A,direct SUBB 影响标志位Cy,AC,OV,P
75
3.3.3 算术运算指令——减法指令 减法指令执行过程 — (A) 源 结果 借位 (Cy)=1 (AC)=1 Cy D0 D1 D2 D3
算术运算指令——减法指令 减法指令执行过程 D0 D1 D2 D3 D4 D5 D6 D7 (A) 源 — 结果 Cy 借位 (AC)=1 (Cy)=1 75
76
算术运算指令——减法指令 例8: 设累加器A的内容为0C9H,寄存器R2的内容为54H,当前Cy的状态为1,执行指令“SUBB A,R2”,A的内容及标志位的状态是多少? 结果:A的内容为74H,(Cy)=0,(AC)=0,(OV)=1,(P)=0。 减法指令的执行结果与当前进位位的状态有关,因此,在计算时,首次使用减法指令,进位位Cy应清零。 1 D0 D1 D2 D3 D4 D5 D6 D7 A R2 — Cy 1 1 1 1 (A) Cy
77
3.3.3 算术运算指令——减法指令 (2)减1指令 DEC 源;源-1 源 源——A,Rn,direct,@Ri 指令: DEC A
DEC Rn DEC direct DEC @Ri 以上指令不影响标志CY、AC和OV
78
3.3.3 算术运算指令——减法指令 例9:(R7)=00H,执行“DEC R7”,(R7)为多少? R7 −) R7 丢弃
算术运算指令——减法指令 例9:(R7)=00H,执行“DEC R7”,(R7)为多少? D0 D1 D2 D3 D4 D5 D6 D7 1 −) R7 R7 1 1 1 1 1 1 1 1 1 丢弃 (R7)=0FFH,向下溢出!
79
3.3.3 算术运算指令——减法指令 例10: 设R0的内容为7EH,内部RAM的7DH和7EH单元的内容分别为00H和40H,P1口的内容为55H,执行下列指令后,R0、P1、7EH单元的内容分别是多少? DEC R0 DEC 7EH DEC P1 XX 7FH 40 7EH 00 7DH 7CH 02H 01H 7E 00H 内RAM
80
3.3.3 算术运算指令——减法指令 DEC @R0; [(R0)]-1 [(R0)],
[7EH]-1 [7EH], [7EH]=3FH DEC R0 ; (R0)-1(R0), (R0)= 7DH ; [(R0)]-1 [(R0)] [7DH]-1 [7DH], [7DH]=0FFH DEC 7EH ; [7EH]-1 [7EH], [7EH]=3EH DEC P1 ; [P1]-1 [P1], [P1]=54H XX 7FH 40 7EH 00 7DH 7CH 02H 01H 7E 00H 内RAM 3E 3F FF 7D 80
81
算术运算指令——减法指令 例11:双字节二进制x存放在20H 、21H单元(高8位在20H单元),y存放在22H 、 23H单元(高8位在22H单元) ,求 z = x - y XX 21H 20H 1FH 1EH 31H 30H 2FH 内RAM Cy 20H 21H 23H 22H -) (R0) (R0) (R1) (R1)
82
3.3.3 算术运算指令——减法指令 MOV R0, #21H; 指向被减数的低8位 MOV R1, #23H; 指向减数的低8位
算术运算指令——减法指令 MOV R0, #21H; 指向被减数的低8位 MOV R1, #23H; 指向减数的低8位 MOV A, @R0 CLR Cy SUBB A, @R1 MOV @R0, A ;结果的低8位 DEC R0 ;修改单元地址 DEC R1 MOV @R0, A ;结果的高8位 20H 21H 23H 22H -)
83
3.3.3 算术运算指令——乘法指令 (三)乘法指令 MUL AB (A)×(B)的乘积高八位存储在(B),低八位存储在(A)。 说明:
算术运算指令——乘法指令 (三)乘法指令 MUL AB (A)×(B)的乘积高八位存储在(B),低八位存储在(A)。 说明: (1)此指令为无符号数乘法; (2) 指令执行后,(Cy)=0。若乘积大于255,则(OV)=1。
84
3.3.3 算术运算指令——乘法指令 例12: 已知x存放在(20H)中,y存放在(21H),求x*y. MOV A, 20H ;取被乘数
算术运算指令——乘法指令 例12: 已知x存放在(20H)中,y存放在(21H),求x*y. MOV A, 20H ;取被乘数 MOV B, 21H ;取乘数 MUL AB MOV 22H, A ;乘积的低8位 MOV 23H, B ;乘积的高8位 20H 21H 22H 23H 84
85
3.3.3 算术运算指令——乘法指令 例13:多字节乘以单字节的乘法算法。 十进制数乘法运算会给我们什么启示? 8 9 8 9 1 7
算术运算指令——乘法指令 例13:多字节乘以单字节的乘法算法。 十进制数乘法运算会给我们什么启示? 8 9 8 9 1 7 2 9 8 1 8 1
86
算术运算指令——乘法指令 多字节乘以单字节的实现算法 高8位 低8位 部分积 高8位 低8位 部分积 高8位 中8位 低8位
87
3.3.3 算术运算指令——乘法指令 MOV A, R3 ;的低八位 MOV B, R1 ;乘数 MUL AB
算术运算指令——乘法指令 MOV A, R3 ;的低八位 MOV B, R1 ;乘数 MUL AB MOV R6, A ;乘积的低8位 MOV R5, B ;暂存中间结果 MOV A, R2 ;的高八位 ADD A, R5 ;求乘积的中八位 MOV R5, A ;存储乘积的中八位 MOV A, #00 ADDC A, B ;计算乘积的高八位 MOV R4, A ;存储乘积的高八位 R2 R3 R1 R5 R6 R4 R5 R6 B A
88
3.3.3 算术运算指令——除法指令 (四)除法指令 DIV AB (A)/(B)的商存储在(A),余数存储在(B) 说明:
算术运算指令——除法指令 (四)除法指令 DIV AB (A)/(B)的商存储在(A),余数存储在(B) 说明: (1)此指令为无符号数除法; (2)若除数(B)=0,则(OV)=1,若(B)≠ 0,则(OV)=0;(Cy)=0。
89
3.3.3 算术运算指令——除法指令 例14: 已知x存放在(20H)中,y存放在(21H),求x/y. MOV A, 20H ;取被除数
算术运算指令——除法指令 例14: 已知x存放在(20H)中,y存放在(21H),求x/y. MOV A, 20H ;取被除数 MOV B, 21H ;取除数 DIV AB MOV 22H, A ;商存在22H单元
90
算术运算指令——除法指令 例15:2位十进制数以压缩BCD码的形式存储在R4中,把该数转化为分离式BCD码的形式,存储在30H和31H单元。 BCD码:十进制数符的四位二进制编码。 压缩形式BCD码:一个单元存储2位十进制数符的BCD编码。 分离形式BCD码:一个单元存储1位十进制数符的BCD编码。 如79的BCD编码: 压缩形式: 20H 压缩形式: 20H 21H
91
算术运算指令——除法指令 例15:2位十进制数以压缩BCD码的形式存储在R4中,把该数转化为分离式BCD码的形式,存储在30H和31H单元。 MOV A, R ;取压缩BCD码 MOV B, #10H ; DIV AB MOV 31H, A ;低位存在31H单元 MOV 30H, B ;高位存在30H单元
92
3.3.3 算术运算指令——除法指令 例16:把R7中的二进制数转换为十进制数,并以压缩BCD码的格式存放到R4和R5中 。
算术运算指令——除法指令 例16:把R7中的二进制数转换为十进制数,并以压缩BCD码的格式存放到R4和R5中 。 假设:R7中的二进制数为0FEH 0FEH对应的十进制数为254, 把254的百、十、个位分开可用以下方法: (1)提取百位2:254/100的商,余数为54 (2)提取十位5:余数/10的商,它的余数为4 (3)提取十位4:本次的余数 (1)提取百位2:254/100的商,用除法指令“DIV AB”可以实现,0FE/64H,商在A中为02H,余数在B中,
93
3.3.3 算术运算指令——除法指令 例16:把R7中的二进制数转换为十进制数,并以压缩BCD码的格式存放到R4和R5中 。
算术运算指令——除法指令 例16:把R7中的二进制数转换为十进制数,并以压缩BCD码的格式存放到R4和R5中 。 上述过程可用除法指令“DIV AB”可以实现 (1)提取百位:254/100的商,0FE/64H,商在A中为02H,余数在B中。 (2)提取十位:余数/10的商,(B)/0AH,商在A中为05H,余数在B为04,即为个位。 (3)把十位和个位合并成一个压缩BCD码格式
94
3.3.3 算术运算指令——除法指令 MOV A, R7 ;取被转换的二进制数 MOV B, #100 ;
算术运算指令——除法指令 MOV A, R7 ;取被转换的二进制数 MOV B, # ; DIV AB ;被转换数除以100,商为百位数 MOV R4, A ;转换的百位数存到R4, MOV A, B ;取余数 MOV B, #10 ; DIV AB ;商为十位数,余数为个位数, SWAP A ; ADD A, B ;变换成压缩BCD码格式 MOV R5, A ;十进制数的十位个位
95
3.3.4 逻辑运算指令 逻辑运算指令包括与、或、异或、清除、求反、移位等操作。这类指令一般不影响标志位CY、AC和OV。
(1)清零 CLR A 说明:执行结果同“ MOV A,#00H”,只影响标志位P。 (2)累加器A取反指令(按位取反) CPL A ;(/A) ( A) 说明:不影响标志位。 例1: 设(A)=56H ( ) CPL A ;结果为0A9H( )
96
3.3.4 逻辑运算指令——逻辑操作指令 (3)循环左移 RL A ; 说明: (1)每次只移动一位;
D0 D1 D2 D3 D4 D5 D6 D7 说明: (1)每次只移动一位; (2)在(A)07FH时,左移一位相当于(A)乘以2;
97
3.3.4 逻辑运算指令——逻辑操作指令 例2 若(A)=33H, (Cy) =1,执行指令: RL A (A)=? RL A
1 D0 D1 D2 D3 D4 D5 D6 D7 A D0 D1 D2 D3 D4 D5 D6 D7 RL A 1 D0 D1 D2 D3 D4 D5 D6 D7 A (A)=66H
98
3.3.4 逻辑运算指令——逻辑操作指令 (4)带进位位循环左移 RLC A ; 说明: (1)每次只移动一位;左移一位相当于(A)乘以2;
D0 D1 D2 D3 D4 D5 D6 D7 Cy 说明: (1)每次只移动一位;左移一位相当于(A)乘以2; (3)带进位位移动时,影响标志位Cy和P。
99
3.3.4 逻辑运算指令——逻辑操作指令 例3: 若(A)=33H, (Cy) =1,执行指令: RLC A (A)=? RLC A
1 D0 D1 D2 D3 D4 D5 D6 D7 A 1 Cy D0 D1 D2 D3 D4 D5 D6 D7 Cy RLC A 1 D0 D1 D2 D3 D4 D5 D6 D7 A (A)=67H Cy
100
3.3.4 逻辑运算指令——逻辑操作指令 在二进制中,最低位补0左移一位,其结果为原数的2倍。 RLC A RLC A RLC A
例4:双字节数x二进制数乘2。 x存于(R5)(R6) 在二进制中,最低位补0左移一位,其结果为原数的2倍。 D8 D9 D10 D11 D12 D13 D14 D15 D0 D1 D2 D3 D4 D5 D6 D7 双字节数x D16 D8 D9 D10 D11 D12 D13 D14 D15 2*x D0 D1 D2 D3 D4 D5 D6 D7 RLC A Cy Cy D8 D9 D10 D11 D12 D13 D14 D15 RLC A Cy Cy D16 RLC A
101
3.3.4 逻辑运算指令——逻辑操作指令 CLR A ; 例4:多字节二进制数乘2。 RLC A ;处理进位 MOV A, R6 ;
MOV R4, A ;结果的高8位 例4:多字节二进制数乘2。 MOV A, R6 ; CLR Cy RLC A MOV R6, A ;结果的低8位 MOV A, R5 ; MOV R5, A;结果的中8位
102
3.3.4 逻辑运算指令——逻辑操作指令 (5)循环右移 RR A ; 说明: (1)每次只移动一位;
D0 D1 D2 D3 D4 D5 D6 D7 说明: (1)每次只移动一位; (2)在(A)为偶数时,右移一位相当于(A)除以2;
103
3.3.4 逻辑运算指令——逻辑操作指令 (6)带进位位循环右移 RRC A ; 说明: (1)每次只移动一位;移一位相当于(A)除以2;
D0 D1 D2 D3 D4 D5 D6 D7 Cy 说明: (1)每次只移动一位;移一位相当于(A)除以2; (2)带进位位移动时,影响标志位Cy和P。
104
3.3.4 逻辑运算指令——逻辑操作指令 RLC A RLC A 例5:多字节二进制数除以2。
在二进制中,最高位补0右移一位,其结果为原数的1/2。 分解为2个单字节右移 RLC A RLC A 余数
105
3.3.4 逻辑运算指令——逻辑操作指令 例5:多字节二进制数除以2。 设二进制数存放在R5和R6中,结果仍存放在原处:
MOV A, R ;高8位 CLR C RRC A MOV R5, A ;商的高8位 MOV A, R ;低8位 MOV R6, A ;商的低8位
106
3.3.4 逻辑运算指令—与操作指令 (二) 与逻辑操作指令 ANL 目的操作数,源操作数 (1) 以累加器A为目的操作数的与逻辑运算指令
(二) 与逻辑操作指令 ANL 目的操作数,源操作数 (1) 以累加器A为目的操作数的与逻辑运算指令 ANL A,#data ; (A)∧data (A) ANL A,Rn ; (A) ∧(Rn) (A) , n=0~7 ANL A,direct ; (A)∧(direct) (A) ANL ; (A)∧[(Ri)] (A) , i=0,1 这4条指令执行时仅影响标志位P
107
3.3.4 逻辑运算指令—与操作指令 (二) 与逻辑操作指令 ANL 目的操作数,源操作数 (2)以某个单元为目的操作数的与逻辑运算指令
(二) 与逻辑操作指令 ANL 目的操作数,源操作数 (2)以某个单元为目的操作数的与逻辑运算指令 ANL direct,#data ;(direct)∧data (direct) ANL direct,A ;(direct)∧(A) (direct) 指令执行时不会影响任何标志位 107
108
3.3.4 逻辑运算指令—与操作指令 用途:与逻辑操作指令用于实现屏蔽。 设某位数值为di = 0, 1,与运算法则如下:
di ∧ 1 = di (保留) 屏蔽码 x D0 D1 D2 D3 D4 D5 D6 D7 1 单元
109
3.3.4 逻辑运算指令—与操作指令 例6: 设累加器A的内容为0CBH( B),30H单元的内容为0AAH( B),执行指令: ANL A,30H 累加器A的内容为多少? 1 D0 D1 D2 D3 D4 D5 D6 D7 A 30H 1 1 累加器A的内容为8AH
110
3.3.4 逻辑运算指令—或操作指令 (三) 或逻辑运算指令 ORL 目的操作数,源操作数 (1)以累加器A为目的操作数的或逻辑运算指令
(三) 或逻辑运算指令 ORL 目的操作数,源操作数 (1)以累加器A为目的操作数的或逻辑运算指令 ORL A,#data ;(A) ∨data (A) ORL A,Rn ;n = 0~7,(A) ∨(Rn)(A) ORL A,direct ; (A) ∨(direct) (A) ORL ;i=0,1,(A) ∨[(Ri)] (A) 指令执行时仅影响标志位P
111
3.3.4 逻辑运算指令—或操作指令 (三) 或逻辑运算指令 ORL 目的操作数,源操作数 (2) 以某个单元为目的操作数的或逻辑运算指令
(三) 或逻辑运算指令 ORL 目的操作数,源操作数 (2) 以某个单元为目的操作数的或逻辑运算指令 ORL direct,#data ;(direct) ∨data(direct) ORL direct,A ;(direct)∨(A) (direct) 指令执行时不会影响任何标志位 111
112
3.3.4 逻辑运算指令—与操作指令 用途:或逻辑操作指令用于实现置位。 设某位数值为di = 0, 1,或运算法则如下:
di ∨ 0 = di (保留) di ∨ 1 = 1(置位) 置位码 单元 x D0 D1 D2 D3 D4 D5 D6 D7 1
113
3.3.4 逻辑运算指令—与操作指令 例7:设累加器A的内容为0D5H,执行指令 ORL A,#0FH 累加器A的内容为 ?
1 D0 D1 D2 D3 D4 D5 D6 D7 A 码 1 1 累加器A的内容为0DFH 113
114
3.3.4 逻辑运算指令—异或操作指令 (四)异或逻辑运算指令 XRL 目的操作数,源操作数 (1)以累加器A为目的操作数的异或逻辑运算指令
XRL A,#data ;(A)data(A) XRL A,Rn ;n=0~7,(A) (Rn) (A) XRL A,direct ;(A) (direct) (A) XRL ;i=0, 1,(A) [(Ri)] (A) 指令执行时仅影响标志位P。
115
3.3.4 逻辑运算指令—异或操作指令 (四)异或逻辑运算指令 XRL 目的操作数,源操作数 (2)以某个单元为目的操作数的异或逻辑运算指令
XRL direct,#data ;(direct) data (direct) XRL direct,A ;(direct) (A) (direct) 指令执行时不会影响任何标志位 115
116
3.3.4 逻辑运算指令—与操作指令 用途:异或逻辑操作指令用于实现取反。 设某位数值为di = 0, 1,异或运算法则如下:
di 0 = di (保留) di 1 = di (取反) 取反码 单元 x D0 D1 D2 D3 D4 D5 D6 D7 1
117
3.3.4 逻辑运算指令—与操作指令 例8:累加器A的内容为0C3H( B),寄存器R0的内容为0AAH,执行指令:XRL A, R0, 累加器A的内容为? 1 D0 D1 D2 D3 D4 D5 D6 D7 A R0 1 1 累加器A的内容为69H 117
118
3.3.4 逻辑运算指令—与操作指令 例9:一个负数的原码存放在30H单元,求其补码 。 原码: 原码: 反码: 反码: 补码: 补码: 1
x D0 D1 D2 D3 D4 D5 D6 D7 1 x D0 D1 D2 D3 D4 D5 D6 D7 原码: 原码: 1 1 x D0 D1 D2 D3 D4 D5 D6 D7 1 x D0 D1 D2 D3 D4 D5 D6 D7 反码: 反码: + 1 + 1 补码: 补码: y y 118
119
3.3.4 逻辑运算指令—与操作指令 MOV A, 30H 原码: XRL A, #7FH ADD A, #01H MOV 30H, A
1 1 x D0 D1 D2 D3 D4 D5 D6 D7 反码: + 1 补码: y
120
3.3.4 逻辑运算指令—与操作指令 例10:求16位二进制负数(双字节)的补码。 原码: 反码: 补码: 1 x 1 x 1 1 1
D0 D1 D2 D3 D4 D5 D6 D7 1 x D0 D1 D2 D3 D4 D5 D6 D7 原码: 1 1 反码: 1 x + 1 补码: y y
121
3.3.5 位操作指令 位操作指令包括位变量传送、逻辑运算、控制转移等指令,共17条。 适用范围:位地址空间 指令中,位地址的表示方法:
(1)直接用位地址 如:D4H (2)用特殊功能寄存器名加位数 如:PSW.4 (3)用位名称 如:RS1 (4)用伪指令bit定义的有名字的位地址 如:SUB.REG bit RS1, FLAGRUN bit 02H
122
3.3.5 位操作指令—位数据传送指令 (1)位数据传送指令(2条) MOV C,bit ;(bit)(C)
MOV bit,C ;(bit) ( C) 说明: 位与位之间的状态传送必须通过C来进行,2个位地址的位不能直接传送。 例:MOV C,TR0 MOV 08H,C
123
3.3.5 位操作指令—位修正指令 2、位修正指令(6条) ( 1)位清0 CLR C ; 0 (C)
CLR bit ; 0 (bit) ( 2)位置1 SETB C ; 1 (C) SETB bit ; 1 (bit) ( 3)位取反 CPL C ; (/C) (C) CPL bit ; (/bit) (bit) (C) (C)
124
3.3.5 位操作指令—位逻辑运算指令 3、位逻辑运算指令(4条) (1) 位逻辑与运算指令
ANL C,bit ; (C) ∧(bit)(C) (C) (bit) ANL C,/bit ; (C)∧( / bit) C (C) (bit)
125
3.3.5 位操作指令—位逻辑运算指令 (2) 位逻辑或运算指令 ORL C,bit ; (C) ∨ (bit)(C)
≥1 (C) (bit) ORL C,/bit ; (C) ∨ ( / bit) C ≥1 (C) (bit)
126
3.3.5 位操作指令 例1:采用位操作指令实现下列逻辑表达式。假设
U—P1.1,V—P1.2,W—P1.3,X—27H.1,Y—27H.0, Z—TF0,Q—P1.5,编制程序实现下列逻辑表达式:
127
3.3.5 位操作指令 MOV C, P1.2 ;取V ORL C, P1.3 ANL C, P1.1
MOV 20H.0, C ;暂存中间结果 MOV C, 27H.1 ;取X ANL C, /27H.0 CPL C ORL C, /TF0 ORL C, 20H.0 MOV P1.5 C ;输出
128
3.3.6 控制转移指令 CPU控制转移指令将改变程序的执行顺序,这类指令有以下几种: (1)无条件转移指令 (2)条件转移指令
(3)循环控制转移指令 (4)调用/返回指令 本节主要从编程角度出发,根据指令的功能介绍控制转移指令的使用方法。 128
129
3.3.6 控制转移指令—无条件转移 非正式MCS-51单片机指令 一、 无条件转移指令
这组指令相当于高级语言的 “GOTO 标号”语句, CPU在执行程序的过程中,碰到该类型指令将“无条件”地改变PC的内容,改变程序执行的流向。 AJMP addr11 LJMP addr16 SJMP rel JMP 标号 非正式MCS-51单片机指令 JMP LABEL 129
130
3.3.6 控制转移指令—无条件转移 (1) 转移指令 AJMP addr11
CPU的执行过程 ;(PC)+2 (PC) ;addr11 (PC)10~0 ,(PC15~11)不变 (1) 转移指令 AJMP addr11 转移范围:含有下一条指令首地址的同一个2KB范围,即高5位地址相同; 使用方式: AJMP LABEL 例1: AJMP NEXT
131
3.3.6 控制转移指令—无条件转移 (2)长转移指令 LJMP addr16 addr16 ( PC )
CPU的执行过程 addr16 ( PC ) (2)长转移指令 LJMP addr16 说明: 转移范围:64KB全程序空间任何单元 使用方式: LJMP LABEL 例2:长转移指令应用 … ; INC A ; …; LJMP LOOP1 ; 无条件转移到LOOP1执行程序 131
132
3.3.6 控制转移指令—无条件转移 (3)短转移指令(相对转移指令) SJMP rel (PC)+2 (PC),
对应rel值为:00H~7FH(0~+127)、80H~FFH( -128~ -1); CPU的执行过程 (PC)+2 (PC), (PC)+rel (PC) 用法: SJMP LABEL 例3: SJMP NEXT 132
133
3.3.6 控制转移指令—无条件转移 (4)间接转移指令 JMP @A+DPTR ;(A)+(DPTR) (PC) 说明:
(1)具有多分支转移功能,即散转功能,又叫散转指令; (2)转移范围:是以DPTR为首地址的256B。 133
134
3.3.6 控制转移指令—无条件转移 例4: 根据累加器A中的命令键键值,设计命令键操作程序入口跳转表。 CLR C RLC A
MOV DPTR,#JPTAB JMP @A+DPTR JPTAB: AJMP CCS0 AJMP CCS1 AJMP CCS2 : 134
135
3.3.6 控制转移指令—无条件转移 例4: 根据累加器A中的命令键键值,设计命令键操作程序入口跳转表。 CLR C MOV R2, A
RLC A ADD A, R2 MOV DPTR,#JPTAB JMP @A+DPTR JPTAB: LJMP CCS0 LJMP CCS1 LJMP CCS2 : 135
136
条件转移指令相当于高级语言的“ IF 条件 THEN 标号”
3.3.6 控制转移指令—条件转移 二、 条件转移指令 条件转移指令相当于高级语言的“ IF 条件 THEN 标号” (一)以 累加器A内容为判别条件的转移指令 (1)判(A)为零转移 JZ rel ; (PC)+2(PC) 当(A)=0时,(PC)+rel(PC)转移; 当(A)≠0时,顺序执行。 (PC)+2 (PC) (A)=0? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JZ LABEL (A)=0? 下一条指令 LABEL N Y 136
137
3.3.6 控制转移指令—条件转移 (2)判(A)不为零转移 JNZ rel ; (PC)+2(PC)
当(A) ≠ 0时,(PC)+rel(PC)转移; 当(A) = 0时,顺序执行。 (PC)+2 (PC) (A)0? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JNZ LABEL (A) 0? 下一条指令 LABEL Y N 137
138
3.3.6 控制转移指令—条件转移 程序设计时,JZ和JNZ指令建立判断条件的途径如下: (1)数据传送,累加器A作为目的操作数的指令。
(2)算术运算,加、减、乘、除指令。 (3)逻辑运算,与累加器A有关的与、或、异或指令。 (4)移位指令,与累加器A有关移位指令。
139
3.3.6 控制转移指令—条件转移 例5:设无符号数存放于20H单元,存放于21H单元,比较两个数、是否相等,若相等置标志位F0位1,否则,F0清0。 139
140
3.3.6 控制转移指令—条件转移 MOV A, 20H ;取x CLR C SUBB A, 21H ;x-y JZ EQU ;相等
CLR F ;不相等,清F0 RET ;返回 EQU: SETB F0 ;相等,F0置1
141
3.3.6 控制转移指令—比较转移 (二)比较转移指令 (1)累加器A与指定单元比较的转移指令 CJNE A,direct,rel
; (PC)+3(PC) ;若(A) > (direct),则(PC)+rel (PC),且0 (Cy); ;若(A) < (direct),则(PC)+rel PC,且1 (Cy); ;若(A) = (direct),则顺序执行,且0 (Cy)。 (PC)+3 (PC) (A) (direct)? (A) > (direct), 0 (Cy) (A) < (direct),1 (Cy) (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: CJNE A,direct,LABEL (A) (direct)? (A) > (direct), 0 (Cy) (A) < (direct),1 (Cy) 下一条指令 LABEL Y N 141
142
3.3.6 控制转移指令—比较转移 (2)累加器A内容与常数比较的转移指令 CJNE A,#data,rel ; ;(PC)+3(PC)
;若(A) > #data ,则(PC)+rel(PC) ,且0(Cy); ;若(A) < #data ,则(PC)+rel(PC) ,且1(Cy); ;若(A) = #data ,则顺序执行,且0(Cy) 。 使用方式:CJNE A,#data,LABEL; 142
143
3.3.6 控制转移指令—比较转移 (3)工作寄存器内容与常数比较的转移指令 CJNE Rn,#data,rel ;
;(PC)+3(PC) ;若(Rn) >#data ,则(PC)+rel (PC) ,且0 (Cy); ;若(Rn) < #data ,则(PC)+rel (PC) ,且1 (Cy); ;若(Rn) = #data ,则顺序执行,且0 (Cy) 。 使用方式:CJNE Rn,#data,LABEL 143
144
3.3.6 控制转移指令—比较转移 (4)指定单元内容与常数比较的转移指令 CJNE @Ri,#data,rel ;
;(PC)+3(PC) ;若[(Ri)] >#data ,则(PC)+rel (PC) ,且0 (Cy); ;若[(Ri)] <#data ,则(PC)+rel (PC) ,且1 (Cy); ;若[(Ri)] =#data ,则顺序执行,且0 (Cy) 。 使用方式:CJNE @Ri,#data,LABEL 144
145
3.3.6 控制转移指令—比较转移 例6:比较两个数x、y是否相等,若相等置标志位F0位1,否则,F0清0。 MOV A, 20H
CJNE A, 21H, NEQ SETB F0 RET NEQ: CLR F0 145
146
3.3.6 控制转移指令—比较转移 例7:从内部RAM的30H单元开始连续存储20个无符号8位二进制数。统计这组数据中00H的个数,结果存入60H单元。 146
147
3.3.6 控制转移指令—比较转移 MOV A, #20 ;数据长度 MOV 60H, #00H ;统计个数清0
MOV R0, #30H ;设置数据块首地址 NEXT: CJNE @R0, #00H, GOON;逐个比较 INC 60H ;统计00H的个数 GOON:INC R0 ;修改地址 DEC A ;数据长度减1 JNZ NEXT ;比较完否? RET 147
148
3.3.6 控制转移指令—比较转移指令 (三)以进位位Cy状态为判别条件的转移指令 (1)以Cy状态是1为判别条件的转移指令 JC rel
; (PC) +2 (PC) ; ;(Cy)=1,则(PC) +rel (PC) ; (Cy) =0,则顺序向下执行 (PC)+2 (PC) (Cy)=1? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JC LABEL (Cy) =1 下一条指令 LABEL Y N 148
149
3.3.6 控制转移指令—比较转移指令 (2)以Cy状态是0为判别条件的转移指令 JNC rel ; (PC) +2 (PC) ;
;(Cy)=0,则(PC) +rel (PC) ; (Cy) =1,则顺序向下执行 (PC)+2 (PC) (Cy)=0? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JNC LABEL (Cy) = 0? 下一条指令 LABEL Y N 149
150
3.3.6 控制转移指令—比较转移指令 在程序设计时,建立Cy判断条件的途径如下: (1)位传送;MOV C, bit。
(2)算术运算(加、减法指令);ADD/ADDC/SUBB。 (3)带进位移位的指令:RLC A;RRC A。 (4)位逻辑运算:与、或运算。
151
3.3.6 控制转移指令—比较转移指令 例8:比较两个数x、y的大小,将大数存放在MAX单元,若相等置标志位F0位1,否则,F0清0。
151
152
3.3.6 控制转移指令—比较转移指令 MOV A, 20H ;取x CLR C SUBB A, 21H ;减法
JZ EQU ;差为0,相等 CLR F0 ;不相等 JNC GRT ;没有借位,x大于y MOV MAX, 21H ;y大于x, RET ;返回 EQU: SETB F ;和相等 GRT: MOV MAX, 20H ;存大数 RET 152
153
3.3.6 控制转移指令—比较转移指令 MOV A, 20H ;取x CJNE A, 21H, NEQ ;比较 SETB F0 ;相等
MOV MAX, A ;存大数 RET ;返回 NEQ: CLR F ;不相等, F0清0 JC LESS ;(Cy)=1,y大于x MOV MAX, A ;存大数 RET LESS: MOV MAX, 21H ;y大于x 153
154
3.3.6 控制转移指令—比较转移指令 (四)以位状态为判别条件的转移指令 (1)以位状态为1作为判别条件 JB bit,rel ;
; (PC)+3 (PC) ;若(bit)=1,则(PC)+rel (PC) ;若(bit)=0,则顺序向下执行 (PC)+3 (PC) (bit)=1? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JB bit, LABEL (bit)=1? 下一条指令 LABEL Y N 154
155
3.3.6 控制转移指令—比较转移指令 (2)以位状态为0作为判别条件 JNB bit,rel ; (PC)+3 (PC)
;若(bit)=0,则(PC)+rel (PC) ;若(bit)=1,则顺序向下执行 (PC)+3 (PC) (bit)=0? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JNB bit ,LABEL (bit)=0? 下一条指令 LABEL Y N 155
156
3.3.6 控制转移指令—比较转移指令 例9:利用标志位实现控制键的多重定义。 1 按第一次 156
157
3.3.6 控制转移指令—比较转移指令 例9:利用标志位实现控制键的多重定义。 1 按第二次 1 157
158
3.3.6 控制转移指令—比较转移指令 例9:利用标志位实现控制键的多重定义。 需要记忆电机的运行状态 1 按第三次 158
159
3.3.6 控制转移指令—比较转移指令 159
160
3.3.6 控制转移指令—比较转移指令 SETB P1.0 ;置P1.0为输入口 CLR P1.3 ;关电机
CLR 20H.7 ;电机为停机状态 NO_PRESS: JB P1.0, NO_PRESS; S按下? JNB 20H.7, ON;S按下,启动 CLR P ; (20H.7)=1,停机 CLR 20H ;状态:停机 SJMP NO_PRESS ;等待S按 ON: SETB P1.3 ;启动电机, SETB 20H.7 ;状态:启动 SJMP NO_PRESS ;等待S按下 160
161
3.3.6 控制转移指令—比较转移指令 (3) 判断位值并清0 JBC bit,rel ; (PC)+3 (PC)
;若(bit)=1,则(PC)+rel (PC), (bit)=0 ;若(bit)=0,则顺序向下执行 (PC)+3 (PC) (bit)=1? (bit)=0 (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JBC bit, LABEL (bit)=1? 下一条指令 (bit)=0 Y N LABEL 161
162
3.3.6 控制转移指令—比较转移指令 例10: 已知累加器A的内容为56H (01010110B),执行下列指令序列:
JBC ACC.3, LABEL1 JBC ACC.2, LABEL2 程序将转移到LABEL2处,并且累加器A的内容变为52H ( B) 162
163
3.3.6 控制转移指令—循环控制转移 (五)循环控制转移指令 (1)以工作寄存器内容作为循环控制变量 DJNZ Rn,rel
(1)以工作寄存器内容作为循环控制变量 DJNZ Rn,rel ;(PC)+2(PC) ;(Rn)-1 (Rn); ;若(Rn)≠0, 则(PC)+rel (PC); ;若(Rn) = 0, 则结束循环, 顺序执行 CPU执行过程 (Rn)-1 (Rn) (Rn)0? (PC)+rel (PC) 下一条指令 目标地址 Y N (PC)+2 (PC) 用法:DJNZ Rn, LABEL (Rn)-1 (Rn) (Rn)0? 下一条指令 LABEL Y N 163
164
3.3.6 控制转移指令—循环控制转移 (2)以指定单元的内容作为循环控制变量 DJNZ direct,rel
; (PC)+3 (PC); ;(direct) -1 (direct) ; ;若(direct)≠0,则(PC)+rel (PC); ;若(direct) = 0,则结束循环, 顺序执行 用法:DJNZ direct, LABEL 例11: 把内部RAM从20H单元开始的20个单元清0。 164
165
3.3.6 控制转移指令—循环控制转移 例11: 把内部RAM从20H单元开始的20个单元清0。 MOV R0, #20H;数据区首地址
DO: MOV @R0, #00H ;清0 INC R ;修改地址指针 DJNZ R5, DO ;循环结束否? RET 165
166
3.3.6 控制转移指令—循环控制转移 例12:把外部数据RAM中的从ADDRESS_X单元开始存储的LEN个字节数据块传送到内部数据RAM。在内部RAM中数据块从BUFFER单元开始存放。
167
3.3.6 控制转移指令—循环控制转移 MOV DPTR, #ADDRESS_X;源首址 MOV R0, #BUFFER ;目首地址
MOV 20H, #LEN ;数据长度 TRANSFER: MOVX A, @DPTR;取数据 MOV @R0, A ;存数据 INC DPTR ;修改源地址指针 INC R0 ;修改目地址指针 DJNZ 20H, TRANSFER ;传送结束? RET ;返回
168
3.3.6 控制转移指令 三、子程序调用及返回指令 主程序调用子程序是通过调用指令实现的 主程序调用和子程序返回过程 主程序 子程序
SUB: 返回(RET) 主程序 MAIN: NEXT: DISP: CALL SUB 主程序调用和子程序返回过程 CALL SUB 返回(RET) 168
169
3.3.6 控制转移指令—调用指令 (一) 调用指令 (1) 长调用指令 LCALL addr16 ;(PC)+3 (PC)
(一) 调用指令 (1) 长调用指令 LCALL addr16 ;(PC)+3 (PC) ;(SP)+1 (SP), (PC 0~7) [(SP)] ;(SP)+1 (SP), (PC 8~15) [(SP)] ;addr0~15 (PC) 说明:(1)该指令执行后PC值为下一条指令的首地址; (2)转移范围:整个程序存储空间,64KB范围。 用法: LCALL 子程序名 如:LCALL SUBJIA 169
170
3.3.6 控制转移指令—调用指令 (2)短调用指令 ACALL addr11 ;(PC)+2 (PC)
;(SP)+1 (SP), (PC 0~7) [(SP)] ;(SP)+1 (SP), (PC 8~15) [(SP)] ;addr0~10 (PC)0~10, (PC)11~15不变 说明: (1)该指令执行后PC值为下一条指令的首地址; (2)转移范围:含有下一条指令首地址的同一个2KB范围,即高5位地址相同。 用法: ACALL 子程序名 如:ACALL SUBJIA 170
171
3.3.6 控制转移指令—返回指令 (二)返回指令 在程序设计时,子程序的最后一条指令必须是RET,它标志子程序结束。 (1)子程序返回指令
;[(SP)] (PC) 8~15 , (SP)-1 (SP) ; [(SP)] (PC) 0~7, ,(SP) -1 (SP) 用法: RET ;子程序最后一条指令 在程序设计时,子程序的最后一条指令必须是RET,它标志子程序结束。 171
172
3.3.6 控制转移指令—返回指令 172
173
3.3.6 控制转移指令—返回指令 单元地址 标号 机器码(H) 主程序 注释 2000H START : E5 30 MOV A,30H
; 30H单元内容送A 2002H 11 30 ACALL SUB1 调用子程序1 2004H LCALL SUB2 调用子程序2 2007H 80 FE SJMP $ 暂停 … 子程序1 ; 2030H SUB1 : F4 CPL A A求反 22 RET 子程序返回 子程序2 3000H SUB2 : 23 RL A A左循环一位 173
174
3.3.6 控制转移指令—返回指令 例13:编写内部RAM多个单元清0的子程序,并把从 20H单元开始的20个单元清0。
(1) 子程序名:CLR_RAM (2)子程序入口条件:R0中存放待清0的内部RAM区首地址,R2中存放待清0的单元个数。 (3)出口条件:无。 (4)子程序功能:把从固定起始单元开始的多个单元清0。 CLR_RAM: MOV @R0, #00H ;单元内容清0 INC R ;修改地址指针 DJNZ R2, CLR_RAM ;结束否? RET 174
175
3.3.6 控制转移指令—返回指令 例13:编写内部RAM多个单元清0的子程序,并把从 20H单元开始的20个单元清0。 主程序:
MOV R0, #20H ;设置数据区首地址 MOV R5, # ;单元个数 ACALL CLR_RAM RET 175
176
3.3.6 控制转移指令—返回指令 (2)中断返回指令 RETI ;(PC)+ 1 (PC)
; [(SP)] (PC) 8~15 , (SP)-1 (SP) ; [(SP)] (PC) 0~7, ,(SP) -1 (SP) ; 该指令用于中断服务程序中,每一个中断服务程序的最后一条指令必然是RETI指令。RETI指令与RET指令的区别在于RETI指令在实现中断返回的同时,告知CPU本次中断处理已经结束。 用法: RETI ;中断处理程序最后一条指令 176
177
3.3.6 控制转移指令——空操作指令 四 空操作指令 NOP ;(PC)+1 (PC)
四 空操作指令 NOP ;(PC)+1 (PC) 这是一条单字节指令。执行时,不作任何操作(即空操作),仅将程序计数器PC的内容加1,使CPU指向下一条指令继续执行程序。这条指令常用来产生一个机器周期的时间延迟。 177
178
3.3.6 控制转移指令——空操作指令 40×500µs=20000µs=20ms 50×5TM=50×10µs=500µs
例14: 一个能延时1秒钟的软件延时子程序。假设振荡 频率为6 MHz (机器周期TM为2µs) 。 20ms子程序: DL20MS: MOV R6, #40 ; DL1MS: MOV R5, # ; DL0: NOP ;TM NOP ;TM DJNZ R5, DL0 ;2TM DJNZ R6, DL1MS RET 40×500µs=20000µs=20ms 50×5TM=50×10µs=500µs 178
179
3.3.6 控制转移指令——空操作指令 例14: 一个能延时1秒钟的软件延时子程序。假设振荡 频率为6 MHz (机器周期TM为2µs) 。
DL1S: MOV R7, #50 ; DL1: ACALL DL20MS DJNZ R7, DL1 ;50×20ms=1000ms RET 179
180
本章内容结束! 谢谢大家! 180
Similar presentations