1.24k likes | 1.51k Views
第 3 章 8051 指令系统. 3.1 指令系统简介 3.2 寻址 方式 3.3 指令系统. 第 3 章主要内容. 退出. 3.1 MCS-51 单片机指令系统简介. 复习几个概念 指令:控制命令。 程序:指令序列。 指令系统:所有指令的集合。. MCS-51 单片机能够识别并执行的指令共有 111 条。这 111 条指令,构成了 MCS-51 单片机的指令系统。 3.1.1 MCS-51 单片机指令系统的分类 1 、 MCS-51 单片机指令系统按指令所占的字节数可分为以下三类: ( 1 )单字节指令( 49 条)
E N D
3.1 指令系统简介 3.2 寻址 方式 3.3 指令系统 第3章主要内容 退出
3.1 MCS-51单片机指令系统简介 复习几个概念 指令:控制命令。 程序:指令序列。 指令系统:所有指令的集合。
MCS-51单片机能够识别并执行的指令共有111条。这111条指令,构成了MCS-51单片机的指令系统。MCS-51单片机能够识别并执行的指令共有111条。这111条指令,构成了MCS-51单片机的指令系统。 3.1.1 MCS-51单片机指令系统的分类 1、MCS-51单片机指令系统按指令所占的字节数可分为以下三类: (1)单字节指令(49条) (2)双字节指令(46条) (3)三字节指令(16条)
2、按指令的执行时间可分为以下三类: (1) 单周期指令(65条) (2) 双周期指令(44条) (3) 四周期指令(2条) 3、按指令的功能可分为以下五类: (1) 数据传送类指令(28条) (2) 算术运算类指令(24条) (3) 逻辑运算类指令(25条) (4) 控制转移类指令(17条) (5) 位操作类指令(17条)
3.1.2 指令格式 MCS-51单片机汇编语言指令由操作码和操作数两部分组成。 指令格式为:操作码 [操作数] 操作数或操作数地址 操作码 举例: MOVA,#0FFH ADDA,R0
3.1.3 指令中的常用符号 Rn: 表示当前工作寄存器R0~R7中的一个。 @Ri: 表示寄存器间接寻址,常常作间接寻址的地址指针。其中Ri代表R0和R1寄存器中的一个。 Direct: 表示内部数据存贮器单元的地址及特殊功能寄存器SFR的地址,对SFR而言,既可使用它的物理地址,也可直接使用它的名字。 #date: 表示8位立即数,即8位常数,取值范围为#00H~#0FFH
#date16: 表示16位立即数,即16位常数,取值范围为#0000H~#0FFFFH addr16: 表示16位地址 addr11: 表示11位地址 rel: 用补码形式表示的地址偏移量,取值范围为-128~+127。 Bit: 表示内部RAM和SFR中的具有位寻址功能的位地址。SFR中的位地址可以直接出现在指令中,为了阅读方便,往往也可用SFR的名字和所在的数位表示。如:表示PSW中奇偶校验位,可写成D0H,也可写成PSW.0的形式出现在指令中。 @: 表示间接寻址寄存器或基址寄存器的前缀符号。 $: 表示当前指令的地址。
立即寻址 立即寻址是将操作数直接存放在指令中,作为指令的一部分存放在代码段里。立即寻址中的数,称为立即数。 例如:MOV A,#30H 直接寻址 直接寻址是将操作数的地址直接存放在指令中。这种寻址方式的操作数只能存放在内部数据存贮器和特殊功能寄存器中。 例如:MOV A,30H 3.2 寻址方式 寻址方式要解决什么问题? 8051指令系统共有7种寻址方式。
【注意】:MOV A,#30H 与 MOV A,30H 两者的区别。 【思考】:立即数存放在RAM还是ROM中?
寄存器寻址 寄存器寻址是指操作数存放在以上所说的寄存器中,并且寻址时的寄存器已隐含在指令的操作码中。 例如:MOV A,R0 寄存器间址 寄存器间址是指操作数存放在以寄存器内容为地址的单元中。 例如:MOV A,@R0 指令中的间址寄存器只能使用R0、R1寄存器(i=0、1)。 在使用间接寻址指令前,必须先对Ri赋初值。 例:MOV R0,#30H ;立即数送R0寄存器 MOV A,@R0 ;从RAM的30H单元取数送累加器A
【注意】MOV A,@R0和 MOV A,R0指令的区别。 间接寻址的指令常用于循环程序中,对 “数据块”进行操作的一种非常方便的方式。 间接寻址操作过程如下图所示。 3 MOV A,@R0指令机器码 累加器A 30H 2 1 00H R0
此方式是访问片外RAM的唯一方法。 ①对于片内RAM使用Ri寄存器,寻址范围为00H~FFH; ②对于片外RAM,使用Ri时寻址范围256,如果使用DPTR做间址寄存器,寻址范围为0000H~FFFFH。 使用寄存器间址指令时应注意
③间址方式的指令不能访问SFR中的单元。 如访问8051的80H单元,下面的程序是错误的: MOV R1,#80H MOV A,@R1 (因为80H为SFR的物理地址) 对于SFR只能采用直接寻址的方式访问,如: MOV A,80H
变址寻址 变址寻址是指操作数存放在变址寄存器和基址寄存器的内容相加形成的数为地址的单元中。其中累加器A作变址寄存器、程序计数器PC或寄存器DPTR作基址寄存器。 例如:MOVC A,@A+PC ;PC内容与A的内容相加得操作数地址,并将此操作数送A MOVC A, @A+DPTR * 一种访问程序存储器ROM的寻址方式,使用变址指令时,要事先分别为A、DPTR赋值,A中为8位无符号数。
变址寻址示意图 ROM 累加器A DPTR 02H 0300H 0300H (DPTR) + 02H (A) 0302H ALU 0302H MOVC A,@A+DPTR 0300H
相对寻址 相对寻址是转移指令中使用的一种寻址方式。 执行指令时将当前PC值与指令中的8位偏移量rel(补码)进行相加,形成实际转移的目标地址。 例如:JZ 61H
偏移量 rel为带符号位的补码,转移的范围为+127~-128。 例如:SJMP 03H;(机器码 80H、03H) 累加器A PC 03H 2002H 操作码 2000H 2002H + 03H 2005H ALU 偏移量 2002H 当前PC值 LOOP 2005H
与绝对寻址相比,相对寻址具有很好的“浮动性”,因此是编程人员普遍使用的一种寻址方式。使用时,要注意3点:与绝对寻址相比,相对寻址具有很好的“浮动性”,因此是编程人员普遍使用的一种寻址方式。使用时,要注意3点: 1. CPU进行地址计算时,PC取值是执行本指令后的地址 值,PC=PC+2 。上例: 指令本身首地址:2000H, 执行完后:2002H(下一条指令的首地址) 即PC总是指向下一个要执行的指令。。 如果使用三字节的相对转移指令,则PC=PC+3。 相对寻址使用中应注意的问题
2. 偏移量的计算: rel=目标地址-源地址-2 (2字节相对转移指令) 或: rel=目标地址-源地址-3 (3字节相对转移指令) 结果用补码的形式书写。 实际计算公式: 正向跳转:rel=目标地址-源地址-2 =地址差-2 反向跳转:rel=FEH-|地址差| 通常计算偏移量的工作由汇编程序完成,编程时允许使用“符号地址”的方式代替偏移量。如: SJMP loop1 汇编程序在翻译时,自动计算并将结果替换符号地址。
3. 如果转移地址的范围超过相对寻址的范围(如:-128~+127)时,在编译时提示出错。3. 如果转移地址的范围超过相对寻址的范围(如:-128~+127)时,在编译时提示出错。 思考: 1、指令SJMP $的相对偏移量是多少? 2、相对寻址的范围超过-128~+127时,程序应怎么处理?
位寻址 位寻址,是指对片内RAM中20H~2FH中的128个位地址,以及SFR中的11个可进行位寻址的寄存器中的位地址寻址。 例如:位寻址指令MOV C,20H,此指令是将RAM中位寻址区20H位地址中的内容,送给位累加器C。 与字节地址寻址指令区别:MOV A,20H,此指令是将内部RAM中20H单元中的内容送给累加器A。
位寻址指令(位操作指令)的使用 在一般的情况下,系统的数据都是按字节(8位)来存放、处理。 单片机在控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。这些开关量信号以 bit --- “位”的形式进行各种运算、处理和存储的。 状态信号 外设1 MCS-51 单片机 控制、检测 系统 状态信号 外设2 控制信号 驱动器 电动机 【例】:SETB 20H ;将位地址为20H的位置1 SETB 90H ;将P1口的d0位置1
与字节操作中的直接寻址一样,为了增加程序的可读性,凡在SFR中的位地址都可以使用符号地址来替代。如第二例中,完全可以使用下面的指令格式:与字节操作中的直接寻址一样,为了增加程序的可读性,凡在SFR中的位地址都可以使用符号地址来替代。如第二例中,完全可以使用下面的指令格式: MOV P1.0 ;将P0口的d0位置一 类似还有:MOV C,ACC.7 ;将累加器的d7位送PSW的cy 这种指令在汇编程序进行翻译时,还是要先将符号地址转换为真正的位地址。
数据传送指令:28条 算术运算指令:24条 逻辑运算及移位指令:25条 控制转移指令:17条 位操作指令或布尔操作指令:17条 3.3 指令系统
数据传送是编程中使用最多、最主要的操作。 功能:将数据在累加器、片内的RAM、SFR及片外ROM、RAM之间进行传送。 在指令中,必须指定被传送数据的源地址和目标地址。 在传送过程中,源地址的内容不被改变(COPY)。 传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PWS一概无影响。 3.3.1 数据传送指令 传送指令的特点:
例: MOV A,30H ;(30h) → A MOV A,R0 ; R0 → A MOV 40H,30H ;(30h) → 40h MOV A,@Ri ; ( Ri ) → A
例:分析下列指令 1、 MOV R0,#20H MOV @R0,#05H 与MOV 20H,#05H 2、 MOV P1,#80H 与MOV 90H, #80H 3、 MOV R1,#82H MOV A,@R1 与 MOV A,82H 4、 MOV A,84H; (该单元没有定义) 5、 MOV P3,P1 6、 设PSW中的RS1,RS0为“11”,则选中第三组工作寄存器,指令 MOV 40H,R0 与 MOV 40H,18H等价
MOV R0,#70H; MOV A,@R0 MOV R1,A MOV 40H,@R1 MOV @R0,P1 例:已知(70H)=60H,(60H)=20H
近程查表指令: 由于A的内容为8位无符号数,查表范围只能是以PC当前值开始后的256B内。 使用特点:预处理较少,不影响其它寄存器的值,不用保存原先值,但程序空间的分配受到限制。 远程查表指令: 查表范围为64KB程序存储器空间。 使用特点:若DPTR已有他用,在赋表首地址之前须保护现场,执行完查表后再予以恢复。
ORG 8000H MOV A ,#40H MOVC A,@A+PC;(A)=? … ORG 8040H DB 41H 42H 43H 44H 查表指令举例1 (A)=44H
ORG 8000H … PUSH DPH PUSH DPL MOV A ,#03H MOV DPTR,#8040H MOVC A,@A+DPTR;(A)=? POP DPL POP DPH … ORG 8040H DB 41H 42H 43H 44H 查表指令举例2 (A)=44H
注:8051系统中,CPU对片外RAM的访问只能用寄存器间接寻址方式。注:8051系统中,CPU对片外RAM的访问只能用寄存器间接寻址方式。 7、累加器A与片外RAM传送指令(4条)
思考: 怎么将数据由内部数据存储器送往外部数据存储器?
【例】将内部数据存贮器30H~4FH单元中的内容传送至外部数据存贮器2000H开始的单元中。【例】将内部数据存贮器30H~4FH单元中的内容传送至外部数据存贮器2000H开始的单元中。 编程说明:内部数据区首址: R0←30H 外部数据区首址: DPTR←2000H 循环次数: R2←20H 程序流程如图所示。
参考程序如下: START: MOV R0 , #30H MOV DPTR , #2000H MOV R2 , #20H LOOP: MOV A , @R0 MOVX @DPTR , A INC R0 INC DPTR DJNZ R2 , LOOP END
(1)PUSH(入栈)指令 8、栈操作指令(2条) (2)POP(出栈)指令
产生延时的子程序delay。 org 0800h delay: push psw push 00h push 01h mov r0,#00h Loop1: mov r1,#00h Loop2: djnz r1,loop2 djnz r0,loop1 pop 01h pop 00h 思考题:如何将R0、R1的 pop psw 内容压入堆栈? ret 堆栈操作指令举例(一) SP
堆栈操作指令举例(二) • 堆栈操作指令除了可以在子程序的设计中,对主程序的数据进行保护。还可以根据堆栈操作的特点完成一些特殊的操作。 【举例】:设片内RAM的30h单元存有x,40h单元存有y。试将两个单元内容互换。 push 30h ;x进栈 push 40h ;y进栈 pop 30h ;y送30H单元 pop 40h ;x送40H单元 40h 30h SP=08h
(1)字交换指令 9、交换指令(4条) (2)半字交换指令
提供一种方便的累加器和寄存器/RAM之间的数据交换。避免了使用mov指令交换时的不便。提供一种方便的累加器和寄存器/RAM之间的数据交换。避免了使用mov指令交换时的不便。 例:将R0和R1的内容交换。 MOV A, R1 ;取数据送A XCH A, R0 ;与R0交换 MOV R1, A ;送回到R1
数据交换指令举例 • 举例:已知,片外RAM20h单元、内部RAM20h单元分别有数x和y,试编程将两数互相交换。 MOV R1,#20H ;指针赋初值 MOVX A,@R1 ;X → A XCH A,@R1 ;交换A↔(20H),Y→A MOVX @R1,A ;Y→(20H)片外RAM 累加器A 1 (y)x 2 20H 20H 3