1.37k likes | 1.54k Views
第三章 指令系统. 3.1.1 指令系统概述. 3.1 指令格式和常用标识符. 指令 是使计算机完成某种操作的命令。 指令系统 是全部指令的集合。. MCS-51 系列单片机指令系统功能强、指令短、执行快,共有 111 条指令。. 数据传送类: 29 条 算术运算类: 24 条 逻辑运算及移位类: 24 条 控制转移类: 17 条 位操作类: 17 条. 单字节指令: 49 条 双字节指令: 45 条 三字节指令: 17 条. 单周期指令: 64 条 双周期指令: 45 条
E N D
3.1.1 指令系统概述 3.1 指令格式和常用标识符 指令是使计算机完成某种操作的命令。 指令系统是全部指令的集合。 MCS-51系列单片机指令系统功能强、指令短、执行快,共有111条指令。
数据传送类: 29条 算术运算类: 24条 逻辑运算及移位类:24条 控制转移类: 17条 位操作类: 17条 单字节指令:49条 双字节指令:45条 三字节指令:17条 单周期指令: 64条 双周期指令: 45条 四周期指令: 2 条 存储空间 运算速度 功能
3.1.2 指令的机器码 计算机操作的直接代码。一般用十六进制数表示。 一、单字节指令 1. 8位编码仅为操作码 如:INC A 功能是累加器A的内容加1。 该指令的编码为:0000 0100B,十六进制表示为04H,累加器A隐含在操作码中。
2.8位编码含有操作码和寄存器编码 高5位为操作码,低3位为存放操作数的寄存器编码。 如:MOV A,R0 功能是将当前工作寄存器R0中的数据传送到累加器A中。 编码为1110 1000B, 低3位000为寄存器R0的编码。 其十六进制表示为E8H。
二、双字节指令 第一字节表示操作码,第二个字节表示参与操作的数据或数据存放的地址。 如:MOV A,#50H 功能是将立即数“50H”传送到累加器A中。 编码为0111 0100B , 0101 0000B。 其十六进制表示为74H,50H。
三、三字节指令 第一字节表示该指令的操作码,后两个字节表示参与操作的数据或数据存放的地址。 如:MOV 20H,#50H 功能是将立即数“50H”传送到内部RAM 的20H单元中。 编码为0111 0101B,0010 0000B,0101 0000B。 其十六进制表示为75H,20H,50H。
3.1.3 指令的格式 操作码助记符 操作数 ;注释 • 操作码助记符 ●表示指令的操作功能 ● 为便于记忆,通常用与操作相应的英文缩写表示,如加法用ADD,减法用SUBB,传送用MOV等,编译时还原成一定的二进制代码。
无操作数 单操作数 两操作数 三操作数 • 操作数 ●指参加操作的数据或数据的地址 ●操作数的个数 ●在两操作数的指令中,通常目的操作数写在左边,源操作数写在右边。 ●操作数之间用逗号隔开。
注释 ●是对指令所做的简要说明 ● 可有可无,不是必备的 ●便于阅读、理解和使用指令 ● 以分号开始,其后为注释部分
3.1.4 指令中所用到的标识符 • Rn (n=0~7):当前选中的工作寄存器组中的寄存器 R0、R1…R7之一; • Ri (i=0,1) :当前选中的工作寄存器组中的寄存器 R0或R1; • #data :8位立即数,00~FFH中的一个; • #data16 :16位立即数;
direct:片内低128个RAM或SFR的地址; • addr11:11位目的地址,用于ACALL和AJMP指令; • addr16:16位目的地址,用于LCALL和LJMP指令; • rel:补码形式表示的8位带符号地址偏移量, 偏移范围为-128~+127; • bit:片内RAM或SFR的位地址; • /:该位求反后参与操作,不影响该位原值;
@:间接寻址寄存器的前缀; • @Ri : 寄存器间接寻址,Ri为R0或R1; • @DPTR : 间接寻址,对外部RAM/ROM寻址。 • (×):表示由×所指的地址单元的内容; • ←:箭头右边的内容送入箭头左边的单元内; • $:当前指令的地址。
对MCS-51单片机,操作数存放在哪些地方? 寻址方式有哪些呢? 3.2 MCS-51单片机寻址方式 • 寻址 CPU到不同的地址空间寻找操作数的过程。 • 寻址方式 寻找操作数地址的方法。
寄存器寻址 直接寻址 寄存器间接寻址 立即寻址 变址寻址 相对寻址 位寻址 注意: 下面所提到的寻址方式均指源操作数的寻址方式。
当前选中的通用寄存器R0~R7; 部分SFR。如累加器A,寄存器B,数据指针DPTR等。 1、寄存器寻址 操作数存放在寄存器中,指令中直接给出寄存器名称。 寻址空间为
MOV A,R5 ;A←R5,即R5里面的数送到A中 若R5中的数为4AH,则指令执行后A 中的数也是4AH。 指令代码为EDH(1110 1101) ,低3位中的101表示操作数在R5中。
片内RAM128个单元; 所有特殊功能寄存器(SFR)。 2、直接寻址 操作数在存储单元中,指令中直接提供存储单元地址。 寻址空间为 说明:这是唯一能访问SFR的寻址方式。
注意1 • 低128单元,在指令中应以单元地址的形式出现。 MOV A,direct ;A←(direct),即直接地址单元中的内容送到A中 MOV direct ,direct ; (direct) ←(direct) 即直接地址单元中的内容送到另一个直接地址单元中 MOV A, 65H ;A ← (65H) 即将65H单元中的数送到A中
注意2 • 对特殊功能寄存器,在指令中可以SFR的名称出现,也可以SFR所在的单元地址出现,但通常都以SFR的名称出现。 MOV A, P0; A ← P0,将P0中的数送到A中 MOV A, 80H;A ←(80H),将80H单元的内容送到A中。 汇编后机器码完全一样,都是E5H,80H
注意3 • 通用寄存器Rn是内存单元的一部分,在指令中若以Rn的名称出现,则属于寄存器寻址方式;若以Rn所在的单元地址出现,则属于直接寻址方式。 设通用寄存器选择第0组,则R0就是片内 RAM 00H单元 MOV A,R0 ;A←R0,即R0里面的数送到A中 MOV A,00H ;A←(00H),即00H单元中的数送到A中
这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去。这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去。 • 区别:机器码不同 第一个指令为E8H,第二个为E5H,00H。
注意4 • 累加器有A、ACC、E0H三种表示形式,指令的执行结果相同,但分属于两种不同的寻址方法。 INC A ; 寄存器寻址,机器码为04H INC ACC 直接寻址,机器码为05H,E0H INC 0E0H 说明:在指令中,多数情况下累加器用“A”表示,仅在直接寻址方式中,用“ACC”表示累加器在SFR区的具体地址E0H。
ROM 3、立即寻址 操作数是常数,包含在指令当中,位于操作码之后,与操作码一起存放在程序存储器中,可以立即得到并执行,不需要经过别的途径去寻找。常数又称为立即数,故又称为立即寻址。 寻址空间为
说明 • 在汇编指令中,立即数前面以“#”符号作前缀。 • 立即数可以是1个字节,也可以是两个字节。 • 由于立即数是一个常数,故只能作为源操作数。 • 在程序中通常用于给寄存器或存储器单元赋初值。
MOV A,#20H ; A←20H MOV R7, #0F5H ;R7←F5H MOV P1, #80H ;P1 ←80H MOV DPTR,#3FA6H ;DPH ←3FH, DPL ←A6H
R0或R1 —— 用于寻址片内RAM低128字节及片外RAM低256字节。 DPTR —— 用于寻址片外RAM 64K字节。 4、寄存器间接寻址 —— 间址 以某寄存器的内容为地址,从该地址去取操作数。 @为间址提示符。 可用的间址寄存器为
注意 • “间址”不能用来访问SFR。 • 片内RAM访问用MOV指令; • 片外RAM访问用MOVX指令。
MOV A,@R0 ; A←(R0), 操作数在片内RAM中. 以R0的内容为地址,将该地址中的内容送到A中。 MOVX A,@R0 ; A←(R0), 操作数在片外RAM中. MOVX A,@DPTR ; A←(DPTR), 操作数在片外RAM中. 以DPTR的内容为地址,将该地址中的内容送到A中。
ROM , 用于访问ROM中的数据表格 5、变址寻址 • 基址寄存器+变址寄存器 间接寻址 • 以DPTR或PC为基址寄存器,累加器A为变址寄存器。 • 把两者内容相加,结果作为操作数的地址。 寻址空间为
JMP @A+DPTR ; 无条件转移指令 A+DPTR 作为一个地址,程序跳转到该地址执行。 MOVC A, @A+DPTR ; A←(A+DPTR) MOVC A, @A+PC ; A←(A+PC)
程序存储区 2040H 93 A ALU DPH 20 2041H … DPL 00 E0 …… 20E0H 47 MOVC A, @A+DPTR ; A←(A+DPTR) 设DPTR=2000H,A=E0H 47 指令代码 20E0H
程序存储区 2040H 83 A ALU 2041H… E0 …… 2120H 47 2121H 45 MOVC A, @A+PC ; A←(A+PC) 设A=E0H 指令代码 45 当前PC 2121H
MOVC A, @A+DPTR ; A←(A+DPTR) MOVC A, @A+PC ; A←(A+PC) 查表操作 ,功能一样,区别是 • DPTR在使用前可以赋值,查表范围可达64K。 • PC的值是固定的,A的内容为无符号数,因此只能在当前指令下256个地址单元范围内进行查表。
6、相对寻址 PC的当前值与指令中给出的偏移量rel相加,结果作为跳转指令的目标地址。 注意 • PC的当前值是跳转指令执行时的PC值,即转移指令的下一条地址。 • 偏移量rel是8位带符号数。以补码表示,它的取值范围为-128~+127。当为负值时,向前转移,当为正数时向后转移。
程序存储区 1000H 80 ALU 1001H23 1002H×× …… 1024H ×× 1025H ×× 如: SJMP rel ; 转移指令 设rel=23H 指令代码 1002H 23H 当前PC 1025H
片内RAM 20H~2FH,共16个单元,128个位地 址,范围为 00H~7FH。 11个可位寻址的SFR,83个位地址。 6、位寻址 MCS-51单片机具有位处理功能,因此有相应的位寻址方式。 寻址空间为
位地址的表示方式 1、直接使用位地址(00~7FH,SFR的83个位地址) 如: SETB 3DH; 将27H.5位置1 MOV C,30H; C ← 26H.0 CLR 0D7H; 将PSW.7位清零 2、字节地址带位号 如: SETB 27H.5; MOV C, 26H.0 ; CLR 0D0H.7;
PSW.4 PSW.3 PSW.7 PSW.6 PSW.5 PSW.2 PSW.1 PSW.0 3、特殊功能寄存器名带位号 例如: CLR PSW.7 ;PSW.7 表示PSW的第7位 ; SETB P0.1 ; P0.1表示P0口的第1位。 4、特殊功能寄存器所含位的位名称 例如: CLR C; MOV 30H,C
3.3 数据传送指令 数据传送指令有29条,是指令系统中数量最多、使用也最频繁的一类指令。 这类指令可分为三组: 指令助记符: MOV、MOVX、MOVC XCH、XCHD、SWAP PUSH、POP • 普通传送指令; • 数据交换指令; • 堆栈操作指令。
源操作数可以是:累加器A、通用寄存器Rn、直接地址direct、间接地址和立即数;源操作数可以是:累加器A、通用寄存器Rn、直接地址direct、间接地址和立即数; • 目的操作数可以是:累加器A、通用寄存器Rn、直接地址direct、间接地址。
一、普通传送指令(22条) 普通传送指令以助记符MOV为基础。 分成片内数据存储器传送指令、片外数据存储器传送指令和程序存储器传送指令。 1.片内数据存储器传送指令MOV (16条) 指令格式:MOV 目的操作数,源操作数 源操作数可为:A、Rn、@Ri、direct、#data; 目的操作数可为:A、Rn、@Ri、direct。
按目的操作数的寻址方式划分为五组: (1)以A为目的操作数(4条) MOV A,Rn ;A←Rn,Rn的内容送给A MOV A,direct ; A←(direct) MOV A,@Ri ;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
(3)以直接地址direct为目的操作数(5条) 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 例: MOV 20H,A ;20H←A MOV 20H,R1 ;20H ← R1 MOV 20H,30H ;20H←(30H) MOV 20H,@R1 ;20H←(R1) MOV 0A0H,#34H ; A0H←34H MOV P2,#34H ; P2←34H
(4)以间接地址@Ri为目的操作数(3条) MOV @Ri,A ;(Ri)←A MOV @Ri,direct ;(Ri)←(direct) MOV @Ri,#data ;(Ri)← #data 功能:把源操作数指定的内容送入以R0或R1为地址指针 的片内存储单元中。 例: MOV @R0,A MOV @R1,20H MOV @R0,#34H
(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
注意 • 源操作数和目的操作数中的Rn和@Ri不能相互配对。 即在MOV指令中,不允许在一条指令中同时出现工作寄存器,无论它是寄存器寻址还是寄存器间接寻址。 例如,不允许下面的指令 MOV Rn,Rn MOV @Ri,Rn
例:顺序执行下列指令序列,求每一步执行结果。 • 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 A,@R0
说 明: ① 一条指令中不能同时出现两个工作寄存器。非法指令: MOV R1,R2 MOV R2,@R0 ② 间址寄存器只能使用 R0、R1。非法指令: MOV A,@R2 ③ SFR区只能直接寻址,不能用寄存器间接寻址。非法指令: MOV R0,#80H MOV A,@R0
④ 目的操作数不能为立即数。非法指令: MOV #data,A ⑤ 除了以A为目的操作数的指令影响PSW中的奇偶标志P外,一般不影响标志位。 ⑥ 关注指令表中指令字节数、机器周期数。除操作码外,直接地址或立即数要占一个字节。 ⑦ 只有指令表中的指令才有对应机器码,计算机才能执行。编程时,不能自己随意发明创造指令。