Presentation is loading. Please wait.

Presentation is loading. Please wait.

第三章 指令系统.

Similar presentations


Presentation on theme: "第三章 指令系统."— Presentation transcript:

1 第三章 指令系统

2 3.1 指令格式和常用标识符 3.1.1 指令系统概述 指令是使计算机完成某种操作的命令。 指令系统是全部指令的集合。
MCS-51系列单片机指令系统功能强、指令短、执行快,共有111条指令。

3 存储空间 单字节指令:49条 双字节指令:45条 三字节指令:17条 运算速度 单周期指令: 64条 双周期指令: 45条 四周期指令: 2 条 功能 数据传送类: 条 算术运算类: 条 逻辑运算及移位类:24条 控制转移类: 条 位操作类: 条

4 3.1.2 指令的机器码 一、单字节指令 计算机操作的直接代码。一般用十六进制数表示。 1. 8位编码仅为操作码
1. 8位编码仅为操作码 如:INC A 功能是累加器A的内容加1。 该指令的编码为: B,十六进制表示为04H,累加器A隐含在操作码中。

5 高5位为操作码,低3位为存放操作数的寄存器编码。
2.8位编码含有操作码和寄存器编码 高5位为操作码,低3位为存放操作数的寄存器编码。 如:MOV A,R0 功能是将当前工作寄存器R0中的数据传送到累加器A中。 编码为 B, 低3位000为寄存器R0的编码。 其十六进制表示为E8H。

6 二、双字节指令 第一字节表示操作码,第二个字节表示参与操作的数据或数据存放的地址。 如:MOV A,#50H
功能是将立即数“50H”传送到累加器A中。 编码为 B , B。 其十六进制表示为74H,50H。

7 三、三字节指令 第一字节表示该指令的操作码,后两个字节表示参与操作的数据或数据存放的地址。 如:MOV 20H,#50H
功能是将立即数“50H”传送到内部RAM 的20H单元中。 编码为 B, B, B。 其十六进制表示为75H,20H,50H。

8 3.1.3 指令的格式 操作码助记符 操作数 ;注释 操作码助记符 ● 表示指令的操作功能
● 为便于记忆,通常用与操作相应的英文缩写表示,如加法用ADD,减法用SUBB,传送用MOV等,编译时还原成一定的二进制代码。

9 操作数 无操作数 单操作数 两操作数 三操作数 ● 指参加操作的数据或数据的地址 ● 操作数的个数
● 在两操作数的指令中,通常目的操作数写在左边,源操作数写在右边。 ● 操作数之间用逗号隔开。

10 注释 ● 是对指令所做的简要说明 ● 可有可无,不是必备的 ● 便于阅读、理解和使用指令 ● 以分号开始,其后为注释部分

11 3.1.4 指令中所用到的标识符 Rn (n=0~7):当前选中的工作寄存器组中的寄存器 R0、R1…R7之一;
指令中所用到的标识符 Rn (n=0~7):当前选中的工作寄存器组中的寄存器 R0、R1…R7之一; Ri (i=0,1) :当前选中的工作寄存器组中的寄存器 R0或R1; #data :8位立即数,00~FFH中的一个; #data16 :16位立即数;

12 direct :片内低128个RAM或SFR的地址;
addr11 :11位目的地址,用于ACALL和AJMP指令; addr16 :16位目的地址,用于LCALL和LJMP指令; rel :补码形式表示的8位带符号地址偏移量, 偏移范围为-128~+127; bit:片内RAM或SFR的位地址; / :该位求反后参与操作,不影响该位原值;

13 @ :间接寻址寄存器的前缀; @Ri : 寄存器间接寻址,Ri为R0或R1; @DPTR : 间接寻址,对外部RAM/ROM寻址。 (×) :表示由×所指的地址单元的内容 ; ← :箭头右边的内容送入箭头左边的单元内; $ :当前指令的地址。

14 3.2 MCS-51单片机寻址方式 寻址 寻址方式 CPU到不同的地址空间寻找操作数的过程。 寻找操作数地址的方法。
寻址方式有哪些呢?

15 寄存器寻址 直接寻址 寄存器间接寻址 立即寻址 变址寻址 相对寻址 位寻址 注意: 下面所提到的寻址方式均指源操作数的寻址方式。

16 1、寄存器寻址 寻址空间为 操作数存放在寄存器中,指令中直接给出寄存器名称。 当前选中的通用寄存器R0~R7;
部分SFR。如累加器A,寄存器B,数据指针DPTR等。

17 MOV A,R5 ;A←R5,即R5里面的数送到A中
若R5中的数为4AH,则指令执行后A 中的数也是4AH。 指令代码为EDH( ) ,低3位中的101表示操作数在R5中。

18 2、直接寻址 寻址空间为 操作数在存储单元中,指令中直接提供存储单元地址。 片内RAM128个单元; 所有特殊功能寄存器(SFR)。

19 注意1 低128单元,在指令中应以单元地址的形式出现。 MOV A,direct ;A←(direct),即直接地址单元中的内容送到A中
MOV direct ,direct ; (direct) ←(direct) 即直接地址单元中的内容送到另一个直接地址单元中 MOV A, 65H ;A ← (65H) 即将65H单元中的数送到A中

20 注意2 对特殊功能寄存器,在指令中可以SFR的名称出现,也可以SFR所在的单元地址出现,但通常都以SFR的名称出现。
MOV A, P0 ; A ← P0,将P0中的数送到A中 MOV A, 80H;A ←(80H),将80H单元的内容送到A中。 汇编后机器码完全一样,都是E5H,80H

21 注意3 通用寄存器Rn是内存单元的一部分,在指令中若以Rn的名称出现,则属于寄存器寻址方式;若以Rn所在的单元地址出现,则属于直接寻址方式。
设通用寄存器选择第0组,则R0就是片内 RAM 00H单元 MOV A,R0 ;A←R0,即R0里面的数送到A中 MOV A,00H ;A←(00H),即00H单元中的数送到A中

22 这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去。
区别:机器码不同 第一个指令为E8H,第二个为E5H,00H。

23 注意4 累加器有A、ACC、E0H三种表示形式,指令的执行结果相同,但分属于两种不同的寻址方法。 INC A ; 寄存器寻址,机器码为04H
INC ACC 直接寻址,机器码为05H,E0H INC 0E0H 说明:在指令中,多数情况下累加器用“A”表示,仅在直接寻址方式中,用“ACC”表示累加器在SFR区的具体地址E0H。

24 3、立即寻址 操作数是常数,包含在指令当中,位于操作码之后,与操作码一起存放在程序存储器中,可以立即得到并执行,不需要经过别的途径去寻找。常数又称为立即数,故又称为立即寻址。 寻址空间为 ROM

25 说明 在汇编指令中,立即数前面以“#”符号作前缀。 立即数可以是1个字节,也可以是两个字节。 由于立即数是一个常数,故只能作为源操作数。
在程序中通常用于给寄存器或存储器单元赋初值。

26 MOV A,#20H ; A←20H MOV R7, #0F5H ;R7←F5H MOV P1, #80H ;P1 ←80H MOV DPTR,#3FA6H ;DPH ←3FH, DPL ←A6H

27 4、寄存器间接寻址 —— 间址 可用的间址寄存器为 以某寄存器的内容为地址,从该地址去取操作数。 @为间址提示符。
R0或R1 —— 用于寻址片内RAM低128字节及片外RAM低256字节。 DPTR —— 用于寻址片外RAM 64K字节。

28 注意 “间址”不能用来访问SFR。 片内RAM访问用MOV指令; 片外RAM访问用MOVX指令。

29 MOV A,@R0 ; A←(R0), 操作数在片内RAM中.
MOVX ; A←(R0), 操作数在片外RAM中. MOVX ; A←(DPTR), 操作数在片外RAM中. 以DPTR的内容为地址,将该地址中的内容送到A中。

30 5、变址寻址 寻址空间为 基址寄存器+变址寄存器 间接寻址 以DPTR或PC为基址寄存器,累加器A为变址寄存器。
把两者内容相加,结果作为操作数的地址。 寻址空间为 ROM , 用于访问ROM中的数据表格

31 JMP @ A+DPTR ; 无条件转移指令 A+DPTR 作为一个地址,程序跳转到该地址执行。 MOVC A+DPTR ; A←(A+DPTR) MOVC A+PC ; A←(A+PC)

32 MOVC A, @ A+DPTR ; A←(A+DPTR)
设DPTR=2000H,A=E0H 程序存储区 E0 A DPH DPL 2040H 20E0H 2041H … … … 47 指令代码 ALU 20E0H

33 MOVC A, @ A+PC ; A←(A+PC) 设A=E0H 当前PC 程序存储区 指令代码 A E0 2040H 83 45
… … 2120H 45 当前PC ALU 2121H

34 MOVC A, @ A+DPTR ; A←(A+DPTR)
MOVC A+PC ; A←(A+PC) 查表操作 ,功能一样,区别是 DPTR在使用前可以赋值,查表范围可达64K。 PC的值是固定的,A的内容为无符号数,因此只能在当前指令下256个地址单元范围内进行查表。

35 6、相对寻址 注意 PC的当前值与指令中给出的偏移量rel相加,结果作为跳转指令的目标地址。
PC的当前值是跳转指令执行时的PC值,即转移指令的下一条地址。 偏移量rel是8位带符号数。以补码表示,它的取值范围为-128~+127。当为负值时,向前转移,当为正数时向后转移。

36 如: SJMP rel ; 转移指令 设rel=23H 当前PC 程序存储区 指令代码 1000H 80 1001H 23 1002H ××
… … 1024H ×× 1002H ×× 23H 1002H 当前PC ALU 1025H

37 6、位寻址 寻址空间为 MCS-51单片机具有位处理功能,因此有相应的位寻址方式。
片内RAM 20H~2FH,共16个单元,128个位地 址,范围为 00H~7FH。 11个可位寻址的SFR,83个位地址。

38 位地址的表示方式 1、直接使用位地址(00~7FH,SFR的83个位地址) 如: SETB 3DH; 将27H.5位置1
MOV C,30H; C ← 26H CLR 0D7H; 将PSW.7位清零 2、字节地址带位号 如: SETB 27H.5; MOV C, 26H.0 ; CLR 0D0H.7;

39 例如: CLR PSW.7 ;PSW.7 表示 PSW的第7位 ; SETB P0.1 ; P0.1表示P0口的第1位。
3、特殊功能寄存器名带位号 例如: CLR PSW.7 ;PSW.7 表示 PSW的第7位 ; SETB P0.1 ; P0.1表示P0口的第1位。 4、特殊功能寄存器所含位的位名称 例如: PSW.0 PSW.1 PSW.2 PSW.3 PSW.4 PSW.5 PSW.6 PSW.7 CY AC F0 RS1 RS0 OV P CLR C; MOV 30H,C

40 3.3 数据传送指令 数据传送指令有29条,是指令系统中数量最多、使用也最频繁的一类指令。 这类指令可分为三组: 指令助记符:
MOV、MOVX、MOVC XCH、XCHD、SWAP PUSH、POP 普通传送指令; 数据交换指令; 堆栈操作指令。

41 源操作数可以是:累加器A、通用寄存器Rn、直接地址direct、间接地址和立即数;

42 一、普通传送指令(22条) 普通传送指令以助记符MOV为基础。 分成片内数据存储器传送指令、片外数据存储器传送指令和程序存储器传送指令。

43 按目的操作数的寻址方式划分为五组: (1)以A为目的操作数(4条) MOV A,Rn ;A←Rn,Rn的内容送给A MOV A,direct ; A←(direct) MOV ;A←(Ri) MOV A,#data ;A← #data (2)以Rn为目的操作数(3条) MOV Rn,A ;Rn←A MOV Rn,direct ;Rn←(direct) MOV Rn,#data ;Rn←#data

44 (3)以直接地址direct为目的操作数(5条)
MOV direct,A ;(direct)←A MOV direct,Rn ;(direct)←Rn MOV direct,direct ;(direct)←(direct) MOV ;(direct)←(Ri) MOV direct,#data ;(direct)← #data 例: MOV 20H,A ;20H←A MOV 20H,R1 ;20H ← R1 MOV 20H,30H ;20H←(30H) MOV ;20H←(R1) MOV 0A0H,#34H ; A0H←34H MOV P2,#34H ; P2←34H

45 MOV @Ri,A ;(Ri)←A MOV @Ri,direct ;(Ri)←(direct) MOV @Ri,#data ;(Ri)← #data 功能:把源操作数指定的内容送入以R0或R1为地址指针 的片内存储单元中。 例:

46 (5)以DPTR为目的操作数(1条) MOV DPTR,#data16 ;DPTR← #data16 8051是8位机,这是唯一的一条16位立即数传送指令。 功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。 例:MOV DPTR,#1234H ;DPH=12H, DPL= 34H 等同于分别向DPH,DPL送数,即 MOV DPH,#12H MOV DPL,#34H

47 注意 源操作数和目的操作数中的Rn和@Ri不能相互配对。
即在MOV指令中,不允许在一条指令中同时出现工作寄存器,无论它是寄存器寻址还是寄存器间接寻址。 例如,不允许下面的指令 MOV Rn,Rn MOV @Ri,Rn

48 例:顺序执行下列指令序列,求每一步执行结果。
MOV A,#30H MOV 4FH,A MOV R0,#20H MOV @R0,4FH MOV 21H,20H ;A=30H ;(4FH)=30H ;R0=20H ;(20H)=30H ;(21H)=30H 练习题:用两种寻址方式实现,将片内RAM 60H单元的 数据传送给累加器A。 解: MOV A,60H MOV R0,#60H MOV

49 说 明: ① 一条指令中不能同时出现两个工作寄存器。 非法指令: MOV R1,R2 MOV R2,@R0
② 间址寄存器只能使用 R0、R1。 非法指令: MOV ③ SFR区只能直接寻址,不能用寄存器间接寻址。 非法指令: MOV R0,#80H MOV

50 ④ 目的操作数不能为立即数。 非法指令: MOV #data,A
⑤ 除了以A为目的操作数的指令影响PSW中的奇偶标志P外,一般不影响标志位。 ⑥ 关注指令表中指令字节数、机器周期数。除操作码外,直接地址或立即数要占一个字节。 ⑦ 只有指令表中的指令才有对应机器码,计算机才能执行。编程时,不能自己随意发明创造指令。

51 课堂练习 ;(23H)=30H MOV 23H,#30H ;(12H)=34H MOV 12H,#34H ;R0=23H
Sub title 课堂练习 ;(23H)=30H ;(12H)=34H ;R0=23H MOV 23H,#30H MOV 12H,#34H MOV R0,#23H MOV R7,12H MOV R1,#12H MOV MOV MOV 45H,34H MOV DPTR,#6712H MOV 12H,DPH MOV R0,DPL ;R7=34H ;R1=12H ;A=30H ;(34H)=34H ;(45H)=34H ;DPTR=6712H ;(12H)=67H ;R0=12H ;A=67H

52 2.片外数据存储器传送指令MOVX (4条) (1) DPTR作16位数据指针,寻址64KB片外RAM空间: MOVX ; A←(DPTR) (读) MOVX @DPTR,A ;(DPTR)←A (写) (2) Ri作8位数据指针,寻址256B片外RAM空间: MOVX ;A←(Ri) (读) MOVX @Ri,A ;(Ri)←A (写)

53 说 明: ① 在51单片机中,与外部存储器RAM打交道的只能是累加器A。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。 例:实现片外数据存储器数据传送(2000H) →(2100H)。 MOV DPTR,#2000H MOVX MOV DPTR,#2100H MOVX @DPTR,A ;DPTR←2000H ;A←X ;DPTR←2100H ;(2100H)←X

54 ② 片外数据存储器不能直接寻址。 使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。
非法指令: MOVX A,2000H MOVX 2100H,2000H ③ 访问片外、片内数据存储器的指令是不同的。 MOVX MOV

55 3.程序存储器传送指令MOVC(2条) ——查表指令
(1) DPTR为基址寄存器: MOVC ; A ← (A+DPTR) (读) 使用前,A为偏移量,DPTR为表格首地址; DPTR可任意被赋值,故可访问整个ROM的64KB空间,表格可放在ROM的任何位置,与MOVC指令无 必然的关系。

56 (2) PC为基址寄存器: MOVC ; A ← (A+PC) (读) 表格只能存放在查表指令以下的256个单元内。 当表格首地址与本指令间有其它指令时,必须调整偏移量,调整量等于当前程序计数器PC值到表格首址之间的字节数。 注意:查表指令的长度为1个字节,当前程序计数器PC值应为查表指令的地址加1。

57 课堂练习 写出完成下列功能的程序段。 (1) 将R0的内容送R6中。 (2) 将片内RAM 30H单元的内容送片外60H单元。
Sub title 课堂练习 写出完成下列功能的程序段。 (1) 将R0的内容送R6中。 (2) 将片内RAM 30H单元的内容送片外60H单元。 (3) 将片外RAM 1000H单元的内容送片内20H单元。 (4) 将ROM 2000H单元的内容送片内RAM的30H单元。

58 二、数据交换指令 普通传送指令实现将源操作数的数据传送到目的操作数,指令执行后源操作数不变,数据传送是单向的。 数据交换指令数据作双向传送,传送后,前一个操作数原来的内容传送到后一个操作数中,后一个操作数原来的内容传送到前一个操作数中。

59 数据交换指令(5条) 字节交换 XCH A,Rn ;A←→Rn XCH A ,direct ;A←→(direct)
1 XCH A,Rn ;A←→Rn XCH A ,direct ;A←→(direct) XCH ;A←→(Ri) 练习:若R0 =80H,A =20H。 执行指令 XCH A,R0 后,A= ,R0= 。

60 XCHD指令的功能是间址操作数的低半字节与A的低半字节内容互换。 SWAP指令的功能是累加器A的高低4位互换。
半字节交换 2 XCHD ;A3~0←→(Ri)3~0 SWAP A ;A3~0←→A7~4 XCHD指令的功能是间址操作数的低半字节与A的低半字节内容互换。 SWAP指令的功能是累加器A的高低4位互换。 练习 (1) 若R0=30H,(30H)=67H, A=20H。 XCHD ;A= , (30H)= (2)若A=30H, 则 SWAP A; A =

61 三、堆栈操作指令(2条) 入栈 PUSH direct ;SPSP+1,(SP)(direct) 将direct中的内容送入堆栈中。
出栈 2 POP direct ; (direct)  (SP), SPSP-1 将堆栈中的内容送回direct中。

62 注意: 例:若入栈保存时入栈的顺序为: PUSH A PUSH B 则出栈的顺序为: POP B POP A
◆ 入栈时SP指针先加1,再入栈; ◆ 出栈时内容先出栈,SP指针再减1; ◆ 用堆栈存取数据的规律是 “先进后出”或“后进先出”。 例:若入栈保存时入栈的顺序为: PUSH A PUSH B 则出栈的顺序为: POP B POP A

63 例:设 A=02H,B=56H,执行下列指令后, SP= ? ,A= ? ,B= ? 。 30H 02H 56H
SBR: MOV SP,#30H ;设栈底 PUSH A PUSH B MOV A,#00H MOV B,#01H POP B POP A SP→ B 00H × 56H 02H A SP→ B 02H × 56H A SP→ B 02H × 56H A SP→ B 02H × 56H A SP→ B 00H × 56H 02H 01H A B 02H 56H A SP→ ×

64 课堂练习 说明程序执行过程中,SP的内容及堆栈中内容的改变过程。程序如下: MOV SP,#30H MOV A,#20H ;SP=30H
Sub title 课堂练习 说明程序执行过程中,SP的内容及堆栈中内容的改变过程。程序如下: MOV SP,#30H MOV A,#20H MOV B,#30H PUSH A PUSH B … … POP A POP B ;SP=30H ;A=20H ;B=30H ;SP=31H (31H)=20H ;SP=32H (32H)=30H … … ;A=30H SP=31H ;B=20H SP=30H

65 3.4 算术运算类指令 主要对8位无符号数;也可用于带符号数运算。 包括:加、减、乘、除、加1、减1运算指令 影响PSW有关位。

66 一、加法 1.不带进位的加法指令(4条) ADD A,Rn ;A←A + Rn ADD A,direct ;A←A +(direct) ADD ;A←A +(Ri) ADD A,#data ;A←A + #data 用途:将A中的值与源操作数所指内容相加,最终结果 存在A中。

67 注意 (1) 参加运算的两个操作数必须是8位二进制数,操作结果也是一个8位二进制数。
(2) 用户根据编程需要既可把参加运算的两个操作数看作时无符号数(0~255),又可看作带符号数。若看作带符号数,一般采用补码形式(-128~127)。 例如: B看作无符号数,其十进制值为211; 若看作带符号数,则其为补码形式,其值为- 45。

68 (3) ADD 指令对PSW中所有标志位产生影响
◆ CY: 和的D7位有进位时,CY=1;否则,CY=0; ◆ AY: 和的D3位有进位时,AY=1;否则,AY=0; ◆ OV: 和的D7、D6位只有一个有进位时,OV=1; 即 OV=D7位进位⊕D6位进位; 溢出表示运算的结果超出了数值所允许的范围。 对带符号数的运算,当OV=1,结果是错误的。 如:两个正数相加结果为负数或两个负数相加结果为正数时属于错误结果,此时(OV)=1。

69 例:下面指令执行后A及PSW中各标志位的值是? MOV A,#19H ADD A,#66H
◆ P:累加器ACC中“1”的个数为奇数时,P=1; 为偶数时,P=0。 例:下面指令执行后A及PSW中各标志位的值是? MOV A,#19H ADD A,#66H A中的值为7FH; C=1,AC=0,OV=0,P=1。 对无符号数:结果为7FH; 对带符号数运算:因为OV=0,结果7FH是正确的;

70 例:下面指令执行后A及PSW中各标志位的值是?
MOV A,#5AH ADD A,#6BH A中的值为C5H; C=0,AC=1,OV=1,P=0; 对无符号数:结果为C5H,正确; 对带符号数运算:因为OV=1,结果错误。

71 例:下面指令执行后A及PSW中各标志位的值是?
MOV A,#0AEH ADD A,#81H A中的值为2FH; C=1,AC=0,OV=1,P=1; 对无符号数:结果为12FH,正确; 对带符号数运算:因为OV=1,结果错误。 0AEH、81H为补码,都是负数,而和2FH也是补码,却为正数,结果就是错的。

72 总结 ◆ 对于无符号运算,要注意检查进位C的值;
◆ 对于有符号运算,要注意检查OV的值,OV=1,表示溢出,计算结果错误;OV=0,无溢出,结果正确。

73 2. 带进位的加法指令(4条) ADDC A,Rn ;A←A+Rn+C ADDC A,direct ;A←A +(direct)+ C ADDC ;A←A +(Ri)+ C ADDC A,#data ;A←A + #data + C 用途:将A中的值与其后面的值以及进位C中的值相加,最终结果存在A,常用于多字节数运算中。 加的进位C的值是在该指令执行之前C里面的值,而不是执行该指令过程中产生的进位 。

74 说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0~255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到0~65535。

75 1067H+30A0H 例: 1067H 30A0H 4107H 67+A0 CY=1, AC=0 , OV=0,P=1 CY=0, AC=0 , OV=0,P=0 R1 R0 R3 R2 R5 R4 C + ADD ADDC MOV A,R0 ADD A,R2 MOV R4,A MOV A,R1 ADDC A,R3 MOV R5,A

76 3. 加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。 仅 INC A 影响P标志。其余指令都不影响标志位。

77 例:A=12H,R0=33H,(21H)=32H,(34H)=22H,DPTR=1234H。
连续执行下面的指令: INC A INC R0 INC 21H INC DPTR ; A=13H ; R0=34H ;(21H)=33H ;(34H)=23H ; DPTR=1235H

78 二、十进制调整指令 DA A 在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用来对BCD码加法运算结果进行自动修正。 例:A=(15H)BCD(代表十进制数15) ADD A,#8 ; A=1DH,按二进制规律加 DA A ; A=23H, 按十进制规律加

79 例:在R3中有十进制数67,在R2中有十进制数85,用十进制运算,运算的结果放于R5中。
MOV A, R3 ; A=R3=67 ADD A, R2 ; R2=85,A=0ECH DA A ; A =52H MOV R5, A ; R5=52H 程序中DA指令对ADD指令运算出来的放于累加器A中的结果进行调整,调整后,累加器A中的内容为52H,CY为1,则结果为152,最后放于R5中的内容为52H(十进制数52)。

80 三、减法 1. 带借位的减法指令(4条) SUBB A,Rn ;A←A - Rn - C SUBB A,direct ;A←A -(direct)- C SUBB ;A←A -(Ri)- C SUBB A,#data ;A←A - #data - C 将A中的值减去源操作数所指内容以及进位位C中的 值,最终结果存在A中。

81 P:累加器ACC中“1”的个数为奇数时,P=1;为偶数时,P=0。
SUBB指令在执行时要影响CY、AC、OV和P标志位 CY:差的D7位需借位时,(CY)=1;否则,(CY)=0。 AC:差的D3位需借位时,(AC)=1;否则,(AC)=0。 OV:差的D7、D6位只有一个需借位时,OV=1; 对于带符号数的计算,要注意OV的值: OV=1,计算结果出错。 P:累加器ACC中“1”的个数为奇数时,P=1;为偶数时,P=0。 没有不带借位的减法指令,如果要做不带借位的减法,还是用SUBB指令,只要将CY预先清零即可。

82 课堂练习 试编写1234H-0FA3H的程序段,将结果高8位存入 51H, 低8位存入50H单元。 CLR C MOV A, #34H
SUBB A, #0A3H MOV 50H, A MOV A, #12H SUBB A, #0FH MOV 51H, A

83 2. 减1指令 DEC A ;A←A - 1 DEC Rn ;Rn←Rn - 1 DEC direct ;direct←(direct)- 1 DEC @Ri ;(Ri)←(Ri)- 1 与加1指令类似,但没有“DEC DPTR”指令。 除第一条“DEC A”指令影响P标志外,其它指令不影响任何标志位 。

84 OV:当积大于FFH(255)时(即B中不为0),OV为1;否则,OV为0。
四、乘法指令 MUL AB ; BA ←A×B 将A和B中的两个8位无符号数相乘,积的高8位放在B中,低8位放在A中。 指令执行后将影响CY和OV标志: CY清0; OV:当积大于FFH(255)时(即B中不为0),OV为1;否则,OV为0。

85 五、除法指令 DIV AB ; A ←商,B ←余数 将A和B中的两个8位无符号数相除(A÷B),商的整数部分放在A中,余数部分放在B中。 指令执行后将影响CY和OV标志: 一般情况下CY、OV都清0; 当除数为0时,则结果的A和B的内容不定,且溢出标志位(OV)=1,表示除数为0结果无意义。

86 3.5 逻辑运算类指令 主要用于对2个操作数按位进行逻辑操作,结果送到 A或直接寻址单元。 主要操作 与、或、异或、移位、取反、清零等。
对标志位的影响 除了目的操作数为ACC的指令影响奇偶标志 P外,一般不影响标志位。

87 一、逻辑与指令 ANL A,Rn ;A←A  Rn ANL A,direct ;A←A (direct) ANL ;A←A  (Ri) ANL A,#data ; A←A  data ANL direct,A ;(direct)←(direct) A ANL direct,#data ;(direct)←(direct) data 影响P标志

88 二、逻辑或指令 ORL A,Rn ;A←A  Rn ORL A,direct ;A←A (direct) ORL ;A←A  (Ri) ORL A,#data ;A←A  data ORL direct,A ;(direct)←(direct) A ORL direct,#data ;(direct)←(direct) data 影响P标志

89 三、逻辑或指令 XRL A,Rn ;A← A⊕ Rn XRL A,direct ;A← A⊕(direct) XRL ; A← A⊕(Ri) XRL A,#data ;A← A⊕data XRL direct,A ;(direct)← (direct)⊕A XRL direct,#data ;(direct)←(direct)⊕data 影响P标志

90 例:71H和56H相与: ∧) 清0:与0 不变:与1 例:71H和56H相或: ∨) 置1:或1 不变:或0 例:71H和56H相异或: ⊕) 取反:异或1 不变:异或0

91 逻辑与用于实现对指定位清0,其余位不变; 逻辑或用于实现对指定位置1,其余位不变; 逻辑异或用于实现指定位取反,其余位不变。 例 写出完成下列功能的指令段。 1.对累加器A中的1、3、5位清0,其余位不变 ANL A,# B 2.对累加器A中的2、4、6位置1,其余位不变 ORL A,# B 3.对累加器A中的0、1位取反,其余位不变 XRL A,# B

92 四、累加器清零和取反指令 清零指令:CLR A ;A← 0 求反指令:CPL A ;A← Ā
在MCS-51系统中,只能对累加器A中的内容进行清零和取反,如要对其它的寄存器或存储单元进行清零和取反,则须放在累加器A进行,运算后再放回原位置。 例: 写出对R0寄存器内容取反的程序。 MOV A,R0 CPL A MOV R0,A

93 四、循环移位指令 不带进位的循环移位: RL A ;A循环左移一位 RR A ;A循环右移一位 A A 带进位循环移位: RLC A ;带CY循环左移一位 RRC A ;带CY循环右移一位 A C A C

94 例:若A=5CH,CY=1,执行 RLC A 后,
结果:A=B9H,CY=0,P=1 1

95 利用带进位的循环移位指令实现多字节移位:
例:编程将寄存器 R6R5中的双字节数X左移一位。 CLR C MOV A,R5 RLC A MOV R5,A MOV A,R6 MOV R6,A ;CY=0,设 R6=55H,R5=0AAH ;R6= B,R5= B,CY=0 ;A= B,CY=1 ;R6= B,R5= B,CY=1 1 CY R6 R5 ;R6= B,R5= B,CY=0

96 对RLC、RRC指令,在CY=0时,RLC相当于乘以2,RRC相当于除以2;
例:若A= BDH = B,CY=0。 执行指令RLC A 后,CY=1,A= B = 7AH。 结果为:17AH(378)=2×BDH(189)。

97 3.6 控制转移类指令 通常情况下,程序的执行是顺序进行的,但也可以根据需要改变程序的执行顺序,这种情况称作程序转移。 无条件转移指令
子程序调用及返回指令

98 一、无条件转移指令 无条件转移指令是指当执行该指令后,程序将无条件地转移到指令指定的地方去。 LJMP addr 长转移指令 AJMP addr 绝对转移指令 SJMP rel 相对转移指令 JMP @A+DPTR 间接转移指令

99 1、长转移指令(64KB范围内转移指令) LJMP addr ; PC←addr16 ◇ 把指令码中的目标地址addr16装入PC,使机器执行下一条指令时无条件转移addr16到处执行,不影响标志位。 ◇ addr16是一个16位地址(范围0000H~FFFFH),可在64KB范围内转移。 ◇ 为编程方便,addr16常用标号地址表示,如LOOP、LOOP1、MAIN、START、NEXT……, 最后通过编译软件汇编成16位二进制地址。

100 2、绝对转移指令(2KB范围内的转移指令) AJMP addr ; PC← PC+2 ; PC10~0 ← addr11 ; PC15~11 不变 ◇ 执行时,先将PC的值加2(该指令长度为2字节), 再把指令中的11位地址addr11送给PC的低11位, 而PC的高5位不变,执行后转移到PC所指向的新位置。 ◇由于addr11是11位地址的,转移范围为2KB。 ◇ 在程序中, addr11可用标号代替。

101 例:若AJMP指令地址为3000H,addr11为123H,
则执行指令AJMP addr11后转移的目的位置是多少? AJMP指令的PC值加2 =3000H+2=3002H= B 指令中的addr11=123H= B 转移的目的地址为 B=3123H

102 3、相对转移指令 SJMP rel ;PC ← PC+2+rel ◇ rel 为偏移量, 8位带符号补码数,取值范围为 -128~+127。 ◇ 转移的目的地址= SJMP指令所在地址+2+rel ◇ 两字节指令。 ◇ 在程序中,rel 可用标号代替,由汇编软件自动编译成具体的数值。

103 注意:在程序设计中,通常用到一条SJMP指令:
该指令等效于 HERE: SJMP HERE 功能是在自己本身上循环,进入等待状态。其中符号 $ 表示转移到本身,它的机器码为80 FEH。 程序的最后一条指令通常用它,可使程序固定下来,不再向后执行,以避免执行后面的内容而出错。

104 4、间接转移指令(又称为散转指令) ;PC ← A+DPTR ◇ 转移地址由数据指针DPTR的16位数和累加器A的8位数进行无符号数相加形成,并直接装入PC。指令对A、DPTR和标志位均无影响。 ◇数据指针DPTR的内容为基址,累加器A的内容为相对偏移量,在64 KB范围内无条件转移。根据累加器A的值来实现转移到不同的分支。在使用时往往与一个转移指令表一起来实现多分支转移。

105 例: MOV DPTR,#TAB ;将TAB代表的地址送入DPTR
;跳转 TAB: AJMP ROUT0 ;跳转ROUT0开始的程序段 AJMP ROUT1 ;跳转ROUT1开始的程序段 AJMP ROUT2 ;跳转ROUT2开始的程序段 AJMP ROUT3 ;跳转ROUT3开始的程序段 ... ROUT0: ROUT1: ROUT2: ROUT3: 执行该段程序后,程序将根据A中的内容转移到不同的程序段去执行----散转。 A=0,转ROUT0 A=2,转ROUT1 A=4,转ROUT2 A=6,转ROUT3

106 二、条件转移指令 条件转移指令是指当条件满足时,程序转移到指定位置,条件不满足时,程序将继续顺次执行。 MCS-51系统中,条件转移指令有三种: 累加器A判零条件转移指令 比较不等转移指令 减1不为零转移指令

107 1、累加器A判零条件转移指令 JZ rel ;如果A=0,则转移,否则顺序执行。 JNZ rel ;如果A≠0,就转移。 转移到相对于当前PC值的8位移量的地址去。即:新的PC值 = 指令所在的地址+2+偏移量rel 编程时,用 JZ 标号 ,即转移到标号处。

108 例:把片外RAM的30H单元开始的数据块传送到片 内RAM的40H开始的位置,直到出现零为止。
程序如下: MOV R0,#30H MOV R1,#40H LOOP: MOVX MOV @R1,A INC R1 INC R0 JNZ LOOP SJMP $

109 2、比较不等转移指令 CJNE A,#data,rel CJNE A,direct,rel CJNE Rn,#data,rel 此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。

110 因此,程序转移后再次利用CY就可判断出哪个数大,哪个数小了。
编程时,我们可以将rel写成标号,即: CJNE A,#data,标号 CJNE A,direct,标号 CJNE Rn,#data,标号 利用这些指令,可以判断两数是否相等。 若两数不相等,用CY反映哪个数大,哪个数小。 如果前面的数大,则CY=0,否则CY=1。 因此,程序转移后再次利用CY就可判断出哪个数大,哪个数小了。

111 举例: MOV R0,#0FH MOV A,R0 CJNE A,#10H,L1;A<#10,CY=1,A>10H,CY=0
MOV R1,#0 ;如R0=10H,则不转移R1=00H; AJMP L3 L1:JC L ;如CY=1即 R0<10H,则转移 MOV R1,#0AAH ;否则CY=0即 R0>10H,则转移 L2:MOV R1,#0FFH L3:SJMP L3 因此最终结果是:本程序执行前, 如果R0=10H,则R1=00H; 如果R0>10H,则R1=0AAH; 如果R0<10H,则R1=0FFH。

112 3、减1不为0转移指令 DJNZ Rn,rel DJNZ direct,rel 执行过程: 它将第一个参数中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到第二个参数所指定的地方去。

113 该程序执行后: A=10+9+8+7+6+5+4+3+2+1=37H 例 有一段程序如下: MOV 23H, #0AH CLR A
例 有一段程序如下: MOV 23H, #0AH CLR A LOOPX: ADD A, 23H DJNZ 23H, LOOPX SJMP $ 该程序执行后: A= =37H

114 例:利用DJNZ设计循环延时程序,已知fosc=12MHz。
T=12/12MHz=1µs 1)  单循环延时: DELAY: MOV R7,#10 ;1T DJNZ R7,$ ;2T △t=2×1µs×10+1×1µs=21µs 2)  双重循环延时: DELAY: MOV R7,#0AH ;1T DL: MOV R6,#64H ;1T DJNZ R6,$ ;2T DJNZ R7,DL ;2T △t=(2µs× )×10+1=2031µs

115 3) 三重循环延时: =1006031µs ≈ 1 秒 DELAY:MOV R7,#10 DL2: MOV R6,#200
3)  三重循环延时: DELAY:MOV R7,#10 DL2: MOV R6,#200 DL1: MOV R5,#250 DJNZ R5,$ DJNZ R6,DL1 DJNZ R7,DL2 △t=(((2us× )×200)+2+1)×10+1 = µs ≈ 1 秒

116 三、调用与返回指令 1、子程序调用指令(2条) ACALL addr11 ;短调用指令(2字节) LCALL addr16 ;长调用指令(3字节) 对ACALL指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的2KB存储区之内,即它们的高5位地址相同。 对LCALL指令,被调用的子程序的首址可以设在64K字节范围内的程序存储器空间的任何位置。

117 为方便编程,通常用标号来表示子程序的首地址:
LCALL 标号 ACALL 标号 指令的执行过程是:当前PC压栈,子程序首地址送 PC,实现转移。

118 2、子程序返回指令(2条) 子程序执行完后必须回到主程序,如何返回呢? 只要执行一条返回指令就可以了。 RET ;子程序返回指令 RETI ;中断子程序返回指令 两者不能互换使用。

119 四、空操作指令 NOP ; PC ←PC+ 1 不产生任何控制操作,只是将程序计数器PC的内容加1。该指令在执行时间上要消耗1个机器周期,在存储空间上可以占用一个字节。因此,常用来实现较短时间的延时。

120 3.7 位操作指令 位操作又称布尔操作,是以位为单位进行的各种操作。 操作对象是 片内RAM的位寻址区
字节地址为 20H-2FH,共16个字节单元; 共128个位单元,位地址为00~7FH。 SFR中的11个可位寻址的寄存器。 P0、P1、P2、P3、TCON、SCON、IE、IP、 PSW、A、B

121 位地址表达方式 例如,PSW中的第5位可用下列方式表达: 直接地址方式:如 0D5H 点操作符方式:如 0D0H.5、PSW.5等 位名称方式:如 F0 伪指令定义方式:如 MYFLAG BIT F0,定义后可 用MYFLAG代替F0。

122 一、位传送指令 MOV C,bit ; C ←bit MOV bit,C ; bit ← C 实现位运算器(CY)和其它位地址间的数据传递。 例:MOV C,P1.0 ;将P1.0的状态送给C。 MOV P1.0,C ;将C中的状态送到P1.0 引脚。 例:把片内RAM20H位的内容传送到30H位。 MOV C,20H MOV 30H,C

123 二、位清零和位置位指令 CLR C ; Cy ← 0 CLR bit ; bit ← 0 SETB C ; Cy ← 1 SETB bit ; bit ← 1 CLR 05H ;位清零 MOV 05H,# 00H ; 字节操作 CLR P ; 使P1.0变为0 SETB P ;使P.0变为1

124 三、位逻辑运算指令 ANL C,bit ;Cy ← Cy∧(bit) ANL C, /bit ;Cy ← Cy∧/(bit) ORL C,bit ;Cy ← Cy∨(bit) ORL C, /bit ;Cy ← Cy∨/(bit) 注意:上述指令中bit中的值本身并不发生变化。 CPL C ;Cy ← /Cy CPL bit ;bit ← /bit

125 四、位条件转移指令 1、以C为条件 JC rel ; CY=1转移,否则顺序执行 JNC rel ; CY=0转移,否则顺序执行 2、以bit为条件 JB bit,rel ; 若(bit)=1,转移;否则顺序执行 JNB bit,rel ; 若(bit)=0,转移;否则顺序执行 JBC bit,rel ; 若(bit)=1,转移,且(bit)←0; 否则顺序执行

126 举例: +5V P3.2和P3.3上各接有一只按键, 要求它们分别按下时 (P3.2=0 或P3.3=0),分别使P1口为0或 FFH。
8051 举例: P3.2和P3.3上各接有一只按键, 要求它们分别按下时 (P3.2=0 或P3.3=0),分别使P1口为0或 FFH。 START: MOV P1,#0FFH MOV P3,#0FFH L1: JNB P3.2,L ; JNB P3.3,L ; P3.2=1, P3.3=1,等待 LJMP L1 L2: MOV P1,#00H ; P3.2=0,使P1口全为“0” L3: MOV P1,#0FFH ; P3.3=0,使P1口全为“1”

127 Have a Break


Download ppt "第三章 指令系统."

Similar presentations


Ads by Google