1.02k likes | 1.14k Views
计算机硬件技术基础. 专题四 MCS-51 指令系统 第三章. 计算机科学与软件学院计算机基础教学部. 本专题是全书的重点, 是汇编语言程序设计的基础。. 学习指令系统重点要掌握以下几点: 1 、指令功能 2 、寻址方式 3 、操作数的位数和存储结构 4 、对 PSW 的影响 5 、指令与存储区的对应关系 6 、各类指针及其指向的地址范围 7 、转移指令的转移范围 8 、指令字节数和机器周期数. 第三章 单片机的指令系统. Ø 本章主要介绍单片机的寻址方式及指令系统, 是必须掌握的内容。
E N D
计算机硬件技术基础 专题四 MCS-51指令系统 第三章 计算机科学与软件学院计算机基础教学部
本专题是全书的重点, 是汇编语言程序设计的基础。 学习指令系统重点要掌握以下几点: 1、指令功能 2、寻址方式 3、操作数的位数和存储结构 4、对PSW的影响 5、指令与存储区的对应关系 6、各类指针及其指向的地址范围 7、转移指令的转移范围 8、指令字节数和机器周期数
第三章 单片机的指令系统 • Ø 本章主要介绍单片机的寻址方式及指令系统, • 是必须掌握的内容。 • Ø一台计算机所有指令的集合, • 称为该计算机的指令系统。 • Ø各种计算机都有专用的指令系统。 • 学时分配:2学时 1—40+46~49+52+53 • 2学时 41-45+50+51 • 54—100
第三章 单片机的指令系统 • 3.1 MCS-51指令系统概述 • 3.2 寻址方式 • 3.3 MCS-51 单片机的指令系统
3.1 MCS-51 指令系统概述 3.1.1 指令格式 3.1.2 指令字长和指令周期 3.1.3 指令分类
3.1.1 指令格式 • 汇编语言指令格式 • 机器语言指令格式
汇编语言指令 一条用助记符表示的汇编语言指令 操作数 操作码 指令的操作对象 指令的功能 ADD A , #10H ;ADD为操作码, A及#10H为操作数
汇编语言指令格式 标号:操作码助记符 目的操作数,源操作数;注释 例如:Loop:MOV A,R0; (R0) --->(A)
机器语言指令格式 三字节: 操作数或寻址方式 操作数或寻址方式 操作码 单字节: 或 操作码 操作数或寻址方式 操作码 双字节: 操作码 操作数或寻址方式 例:ADD A , #10H
3.1.2 指令字长和指令周期 指令字长有三种: 单字节 RET 双字节 MOV A,#68H 三字节 MOV 30H,46H 指令周期是指执行一条指令所需要的时间 1 机器周期指令 2 机器周期指令 4 机器周期指令 P318附录II 附表1
3.1.3 指令分类 按指令功能分类 按指令执行时间分类 按指令字长分类
3.2 寻址方式 • 寻址方式:7种 • 寄存器寻址 • 直接寻址 • 寄存器间接寻址 • 立即寻址 • 变址间接寻址 • 相对寻址 • 位寻址 • 寻址方式与寻址空间 • MCS-51单片机的两个突出特点 寻址: 1、寻找操作数 2、为PC指针寻找目标地址
寄存器寻址——操作数存放在寄存器中 寄存器为R0~R7,A,DPTR,C,AB SETB RS0 MOV R3,#56H MOV A,R0 MOV R0,#01001111B 工作寄存器(00H—1FH) RS1 RS0 寄存器组 片内RAM地址 寄存器 0 0 第0组 00H~07H R0~R7 0 1 第1组 08H~0FH R0~R7 1 0 第2组 10H~17H R0~R7 1 1 第3组 18H~1FH R0~R7
例如:MOV A , R3 ;机器码为 0EBH 指令功能是把当前R3中的操作数送累加器A。 指令执行示意图如图3-3所示。设(R3)=12H
直接寻址—指令中直接给出操作数的地址 • 功能最强,可访问3种地址空间 • 内部数据存储器地址空间(RAM): • 00H-7FH • MOV A,00H • MOV 30H,20H • 特殊功能寄存器地址空间,唯一方式 • 80H-0FFH • MOV A,90H • MOV A,B • 位地址空间 • 00H-0FFHMOV C,00H
例: MOV A ,30H;机器码为E530H 指令功能是把直接地址30H单元的内容送累加器A,即(30H) →(A)如图3-1所示。 34H 34H
寄存器间接寻址 01 02 03 30H 31H 32H • 将指定的寄存器的内容为地址,由该地址所指定的单元内容作为操作数。 • mov A,@R0 (R0)=31H 指针 (A)=02H ((R0))=(31H)
例如: MOV A ,@R1 ;机器码E7H 设(R1)=60H , (60H)=50H , 执行结果(A)=50H,该指令执行过程如图3-4所示。
立即寻址——在指令中直接给出操作数 例: MOV A,#7Ah; 747AH 把立即数7AH送累加器A,指令执行示意图如图3-2所示。
例: MOV DPTR,#1234h (DPH)=12H (DPL)=34H 注意:立即数前加“ # ”号,以区别直接地址。 例如: MOV A,#30H ;(A) ← 30H MOV A, 30H ; (A) ←(30H)
变址间接寻址 • 基址寄存器+变址寄存器的间接寻址方式 • DPTR/PC A • MOVC A,@ A+DPTR • (A) ((DPTR) + (A)) • MOVC A,@ A+PC • (A) ((PC) + (A) ) • JMP @ A+DPTR • (PC)=(A)+(DPTR)
MOVC A ,@A+PC ;83H 设执行指令之前(A)= 50H 指令功能是把该指令当前地址PC值与A累加器内容相加形成操作码地址3F51H,3F51H中的内容37H送A累加器。 PC 当前值
jc Loop rell Loop: 相对寻址 • 以当前的PC值为基准,加上指令中给出的相对偏移量(rel)形成有效的转移地址。 • jc Loop; 补码 [-128,127] rel
JC rel; 4085H 设rel=85H ,Cy=1 目标地址 PC当前值
位寻址 bit 位寻址范围: 1、内部RAM的位寻址区,共16个单元的128位,字节地址为20H~2FH,位地址为00H~7FH。可用直接位地址或字节地址加位的表示方法。 例如: MOV C , 7AH 或 MOV C , 2FH.2
2、特殊功能寄存器SFR可供位寻址的专用寄存器共11个,实有位地址位83位。位地址有4种表达方式 。 以对程序状态寄存器PSW辅助进位位AC进行操作为例: PSW Cy AC F0 RS1 RS0 OV PD0H D7H D6H D0H 1)直接使用位地址 3)单元地址加位的表示法 MOV C ,0D6H MOV C ,0D0H.6 2)位名称表示法 4)专用寄存器符号加位的表示法 MOV C ,AC MOV C , PSW.6
T1 内部数据存储器与内部I/O口统一编址 1、内部数据存储器的寻址方式 1) 00H~1FH寄存器寻址 4组R0 ~R7 Rn 直接寻址 direct 寄存器间接寻址 @R0,@R1 例:(01H) (02H) MOV 02H,01H ;源寻址和目的寻址均为直接寻址 MOV R2,01H ;源寻址为直接寻址,目的寻址为寄存器寻址 MOV R0,#01H MOV 02H,@R0;源寻址为寄存器间接寻址, 目的寻址为直接寻址
2)20H ~2FH 可位寻址区的寻址方式 字节寻址方式: 直接寻址 direct 寄存器间接寻址@R0,@R1 位寻址: bit 直接寻址 例: MOV 26H,C ; 位寻址 (26H)1位 MOV 26H,A ;字节寻址(26H)8位
3)30H ~7FH 数据缓冲区的寻址方式 字节寻址方式: 直接寻址 direct 寄存器间接寻址@R0,@R1 例:MOV 56H,A ;字节寻址(56H)8位 MOV R0,#66H MOV @R0,#56H 可以将用户堆栈设在该区内,堆栈指针SP
2、SFR 及I/O口的操作——只能直接寻址 例: P1 口 90H MOV A,90H MOV A,P1 MOV P1,A 3、关于A累加器有两种寻址方式: MOV A,#23H ; A寄存器寻址 PUSH ACC POP 0E0H 统一编址 ;直接寻址
4、可做片内RAM的指针有: R0,R1, 四个组共有8个 预先设置RS1、RS0,以选定组。 SETB RS0 CLR RS1; 1组 MOV R0,#34H ;R0的地址是? SETB RS1 ; 3组 MOV R0,#68H ; R0的地址是? R0/R1指向的地址范围:00H~7FH
片外数据存储区和外部扩展的I/O口的寻址方式 指针:R0,R1 8位 DPTR 16位 指令助记符: MOVX 例: MOV DPTR,#2000H MOV A,#34H MOVX@DPTR,A T2 只能寄存器间接寻址 外部数据存储器的地址,或I/O口的地址 16位 统一编址 高8位地址 或 低8位地址 MOV P2,#20H MOV R0,#00H MOV A,#34H MOVX @R0,A R0/R1指向的地址范围: 00H~0FFH
3.3 MCS-51 单片机的指令系统 • 指令描述符号简介 • 指令分类: • 数据传送类指令(29)传送类指令举例 • 算术运算类指令(24) • 逻辑运算类指令(24) • 控制转移类指令 (17) • 布尔处理类指令(17)
指令描述符号(1) P68 • Rn--R0~R7 工作寄存器R0~R7,n=0~7 • direct-- 8位直接地址,表示直接寻址方式 • @Ri-- 只能是R0或R1,所以i=0,1 • #data -- 8位立即数,数据范围00H~FFH • #data16 -- 16位立即数,数据范围0000H~FFFFH • addr16 -- 16位目标地址 • addr11 -- 低11位目标地址
指令描述符号(2) • rel 8位带符号地址偏移量, [-128,127]补码 • bit 位地址 • $ 当前指令地址 • • • ( ) • ( ( ) )
数据传送类指令(1) 内部 direct 直接 寻址 @Ri 间接 寻址 A 累加器 Rn 寄存器 data 立即数
数据传送类指令(2) • mov A,Rn ; (A) (Rn) n=0~7 • mov A,direct ; (A) (direct) • mov A, @Ri ; (A) ((Ri)) i=0,1 • mov A,#data ; (A) #data • mov Rn,A ; (Rn) (A) • mov Rn,direct ; (Rn) (direct) • mov Rn,# data; (Rn) #data
数据传送类指令(3) MOV @R1,@R0 • mov direct,A ; (direct) (A) • mov direct,Rn ; (direct) (Rn) n=0~7 • mov direct,direct ; (direct) (direct) • mov direct, @Ri ; (direct) ((Ri)) i=0,1 • mov direct,#data ; (direct) #data • mov @Ri,A ; ((Ri)) (A) • mov @Ri,direct; ((Ri)) (direct) • mov @Ri,# data ; ((Ri)) #data MOV R3,@R0 MOV @R1, R0 MOV R1, R0
数据传送类指令(4) 交换指令 • xch A, Rn ; (A) (Rn) n=0~7 • xch A,direct ; (A) (direct) • xch A, @Ri ; (A) ((Ri)) i=0,1 • xchd A,@Ri ; (A 0~3) ((Ri)0~3 ) • swap A; (A 0~3 ) (A 4~7)
数据传送类指令(5) 堆栈操作 • pop direct ; (direct) ((sp)) ,(sp) (sp)-1 • push direct ; (sp) (sp)+1,((sp)) (direct) 1、堆栈 一种数据结构,是 “先进后出”的线性表。 2、堆栈操作: 压入 PUSH , 弹出 POP 3、堆栈区: 占片内RAM 中连续的存储单元 复位后,系统自动将SP指针指向07H 用户可将堆栈区设在30H~7FH数据缓冲区内, MOV SP,#5FH
堆栈有两种类型:向上生长型和向下生长型,如图2-5所示。 向上生长型堆栈,栈底在低地址单元。随着数据进栈,地址递增,SP 的内容越来越大,指针上移;反之,随着数据的出栈,地址递减,SP的内容越来越小,指针下移。如(b)图所示。 栈顶 栈顶
MCS-51属向上生长型堆栈,这种堆栈的操作规则如下: 进栈操作:先SP加1,后写入数据。 出栈操作:先读出数据,SP减1。 向下生长型堆栈,栈底设在高地址单元。随着数据进栈,地址递减,SP内容越来越小,指针下移;反之,随着数据的出栈,地址递增,SP内容越来越大,指针上移。其堆栈操作规则与向上生长型正好相反。如(a)图所示。
堆栈的使用有两种方式: 一种是自动方式,即在调用子程序或断点时,断点地址自动进栈。程序返回时,断点地址再自动弹回PC。这种操作无需用户干预。 另一种是指令方式,即使用专用的堆栈操作指令,执行进出栈操作,其进栈指令为PUSH,出栈指令为POP。 例如: 保护现场就是一系列指令方式的进栈操作; 而恢复现场则是一系列指令方式的出栈操作。 需要保护多少数据由用户决定。
保护现场: PUSH ACC PUSH PSW PUSH 01H ….. 恢复现场: POP 01H POP PSW POP ACC 举例:
数据传送类指令(6) 外部 • movx A, @Ri ; (A) ((Ri)) i=0,1 • movx A,@DPTR ; (A) ((DPTR)) • movx @Ri,A; ((Ri)) (A) • movx @DPTR,A ; ((DPTR)) (A) • movc A,@A+DPTR ; (A) ((A)+(DPTR)) • movc A,@A+PC; (PC) (PC)+1 , • (A) ((A)+(PC)) 外部数据 外部程序 内部 16位 mov DPTR,#data16; (DPTR) #data16
传送类指令举例: [例3-1]已知(R0)=30H,问执行如下程序,A、R4、30H和31H单元的内容是什么。 MOV A , #10H MOV R4 ,#36H MOV @R0 ,#7AH MOV 31H ,#01H 解:8031执行上述指令后的结果为: (A)=10H (R4)=36H (30H)=7AH (31H)=01H
[例3-2]设内部RAM中30H单元的内容为40H ,40H单元的内容为10H,P1口作输入口,其输入数据为0CAH,程序及执行后的结果如下: MOV R0,#30H ;单元地址30H送R0中 MOV A ,@R0 ;R0 间址,将30H单元内容送A MOV R1 ,A ;A送R1 MOV B ,@R1;R1间址,将40H单元内容送B MOV @R1,P1;将P1内容送40H单元 MOV P2 , P1 ;将P1内容送P2 执行结果:(R0)=30H , (R1)=40H , (A)=40H , (B) =10H ,(P1)=0CAH (40H)=0CAH , (P2)=0CAH
[例3-3]已知片外RAM 的70H单元中的一个数X ,需送到片外RAM的 1010H单元,试编写程序。 解: ORG 1000H MOV R0 ,#70H MOV DPTR ,#1010H MOVX A ,@R0 MOVX @DPTR ,A SJMP $ END 外部RAM之间不能直接传送数据,必须通过累加器A传送 MOVX @DPTR,@R0
[例3-5]设(30H)=X ,(40H)=Y ,试利用堆栈区域实现30H和40H单元中的数据交换。 解:堆栈区是片内RAM的一个数据区,进栈和出栈的数据符合“先进后出”的原则。 MOV SP ,#50H ;设栈底(栈底不存数) PUSH 40H ;(51H) ← (40H) PUSH 30H ;(52H) ← (30H) POP 40H ;(40H) ← (52H) POP 30H ;(30H) ← (51H)