1.24k likes | 1.38k Views
嵌入式系统设计. 摘自其他学校单片机讲义. 实验准备( MCS-51 汇编指令). 第二章: MCS-51 单片机指令系统. 2.1 概述. 2.2 寻址方式. 2.3 数据传送 指令. 2.4 算逻运算和移位指令. 2.5 控制转移和位操作指令. 2.1 :MCS-51 指令系统的概述. MCS-51 共有 111 条指令,指令的长度和执行时间因不同的指令而各不相同。 2.1.1 指令格式 2.1.2 指令的三种表示形式 2.1.3 指令的字节数 2.1.4 指令的分类. 继续.
E N D
嵌入式系统设计 摘自其他学校单片机讲义 实验准备(MCS-51汇编指令)
第二章:MCS-51单片机指令系统 2.1 概述 2.2 寻址方式 2.3 数据传送指令 2.4 算逻运算和移位指令 2.5 控制转移和位操作指令
2.1:MCS-51指令系统的概述 MCS-51共有111条指令,指令的长度和执行时间因不同的指令而各不相同。 • 2.1.1 指令格式 • 2.1.2指令的三种表示形式 • 2.1.3 指令的字节数 • 2.1.4指令的分类 继续
2.1.1 指令格式: 指令格式:既指令的结构形式。 操作数或操作数地址 操作码 由操作码和操作数(或操作数地址)构成指令的结构。 举例:MOVA,#0FFH ADDA,R0 返回
2.1.2 指令的三种表示形式: 指令的表示形式是识别指令的标志。 • 1,二进制的表示形式:(以“累加器的内容+08H”为例) 00100100B 操作码 OP (加法) 00001000B 操作数DATA(08H) 特点: 能被CPU直接识别、运行的形式。也称机器码、汇编语 言的目标代码。 缺点:不便于阅读、记忆和调试修改。
2,十六进制表示方式: 它是对二进制形式的一种简化。 00100100B 24H 00001000B 08H 在实验室等少数环境下,可以将这种形式作为输入程序的一种辅助手段。但是,这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的“机器码”后存入程序存储器并运行。 二进制表示的形式 十六进制表示的形式
3,指令的“助记符”方式(也称“汇编格式”):3,指令的“助记符”方式(也称“汇编格式”): 00100100B24H 00001000B 08H ADD A,#08H 1,这是一种由英文单词或字母、数字来表征指令功能的 形式。是一种便于阅读、书写和交流的表示形式。 2,这种 “汇编”格式的指令必须把它“翻译”为二进制形式 “机器码”后才能为CPU所识别和执行。 3,三种不同的表示方法适用于不同的场合。 本章内容都以汇编的形式介绍指令系统。 二进制表示形式十六进制表示汇编格式 返回
2.1.3 指令的字节数 在MCS-51单片机的指令系统中,因指令操作码和操作数的不同,指令(在存储器中)长度也各不相同。 分为单字节、双字节和三字节。 • 单字节指令(49条):分无操作数、有操作数两种。 无操作数:如 INC DPTR 10100011B INC A 00000100B 【特点】:操作数隐含在操作码中。 含有操作数寄存器名称的单字节指令: 如:MOV A,R0 11101000B MOV A,R111101001B 【特点】:寄存器名以三位数代码的形式在指令的后三位。
双字节指令(46条): 指令的操作码和操作数各占一个字节。 如: MOV A,#data 01110100B data 很明显:8位的操作数本身占据一个字节。 n mov a,#data n+1 双字节指令在程序存储器的存放示意图
三字节指令(16条): 指令中的操作数为双字节。如: MOV DPTR,#data161001000B,data15-8,data7-0 或者:指令中分别包含1个字节的操作数和1个字节的操作数地址。如: MOV direct,#data举例:MOV 20H,#0FFH MOV direct,#data MOV dptr,#data16 三字节指令在存储器中存放的方式示意图
指令的字节数与指令的运行时间 • 指令的字节多是否意味着指令周期就长? 从表中可见,指令的字节数与指令周期不是对等的关系 返回
2.1.4 指令的分类 MCS-51单片机的指令如果按功能划分可以分为五类: • 1,数据传送类指令:完成数据在单片机内部之间的传送。 分为8位数和16位两种。除了奇偶位外,指令的执行对 PSW无影响。 • 2,算术运算指令:用于操作数之间的加、减、乘除运算。 【特点】:多数情况下:操作数之一在累加器A中,结果也保留在A中,运算结果要影响PSW(进位标志、奇偶和溢出标志等)。 • 3,逻辑操作和循环移位指令:操作数之间的逻辑加、逻辑与、取反和异或等操作。多数情况下一个操作数在A中,结果也存于A。移位指令分为左移、右移和带进位和不带进位几种情况。与算术类指令相比逻辑类指令基本不影响PSW的内容。
4,控制转移类指令:条件转移、无条件转移,调用和返回。4,控制转移类指令:条件转移、无条件转移,调用和返回。 【特点】:通过修改程序指针PC的内容,使CPU转到另一处执行,从而改变程序的流向。 • 5,位操作指令:位传送、位置位、位运算和位控制转移等操作。 【特点】:按位操作而不是按字节的操作。位控转移的判断不是检测某一个字节而是对某一个位进行检测并决定是否进行程序转移。 这类指令基本不影响PSW的内容。 返回
2.2 寻址方式 • 在指令的操作数位置上,用于表征、寻找操作数的方式定义为“寻址方式”。 • 正确的理解、掌握寻址方式,是学习、使用指令的关键。 • 在MCS-51单片机中,共使用了七种寻址方式。 它们分别是: 1,寄存器寻址5,变址寻址; 2,直接寻址6,相对寻址; 3,立即数寻址 7,位寻址。 4,寄存器间接寻址 继续
2.2.1寄存器寻址 • 当所需要的操作数在内部某一个寄存器Rn中时,将此寄存器名Rn直接写在指令的操作数的位置上。如: MOV A,R7 ;将寄存器R7中的内容送累加器A中。 MOV 20H,R0;将寄存器R0中的数据送内存20H单元 INCR1 ;将寄存器R1中的内容加一 ADD A,R3 ;A的内容与寄存器R3的内容相加送A 寄存器寻址方式的指令大多是单字节指令。指令本身并不带有操数,而是含有存放操作数的寄存器的3位代码。以MOV A,Rn为例,使用R7寄存器,所以rrr=111,既指令的机器码为:0EFH 1 1 1 0 1 r r r E8H~EFH MOV A,Rn 操作码 寄存器代码 返回
2.2.2 直接寻址 • 指令本身含有操作数的8位或16位地址。既指令直接给出了操作数的地址。如: MOV A,30H ;将RAM30H单元内容送累加器 这里30H是操作数在RAM中的地址。 • 很明显,直接寻址的指令长度是两个或三个字节。 累加器A n 30H n+1 直接寻址示意图
1,指令助记符中direct是用16进制数表示的操作数地址。1,指令助记符中direct是用16进制数表示的操作数地址。 当地址恰好在SFR区域时,指令也可以用寄存器名来表示。 如: MOV A,80H可以写成 MOV A,P0 后者用SFR中寄存器的名字取代它的物理地址80H。很明显,后者更容易阅读和交流,所以我们提倡使用SFR中寄存器名称来代替直接地址。 如:MOV A,SBUF;串口数据缓冲器数据送A MOV IE,#00H;初始化中断允许寄存器 MOV TH1,#0FEH;为定时器1赋初值 尽管使用SFR的寄存器名称来取代直接地址,可以带来程序的可读性,但是在汇编时,仍要将寄存器名字转换为直接地址。 使用直接寻址应注意的三个问题:
2,当直接地址时在工作寄存器区中时,可以使用两种寻址方式来访问。 如: MOV A,00H;将RAM中00H单元数据送累加器A MOV A,R0;将工作寄存器R0的内容送累加器A 这里使用了不同的寻址方式,其指令的结构也不相同。 前者是:11100101(0E5H)、00000000(00H) 双字节。 后者的机器码是:11101000(0E8H)单字节; 在物理结构上,R0与RAM的00H单元恰好是同一单元,所以不同的指令而执行结果是一样的。 类似的还有累加器A: INC A寄存器寻址方式(单字节); INC ACC直接寻址方式(双字节); INC 0E0H直接寻址方式(双字节)。
3,在指令系统中:字节地址与位地址是完全不同的概念。3,在指令系统中:字节地址与位地址是完全不同的概念。 前者用direct表示,而后者用bit 表示,但在指令中都是用16进制表示的数。 如: MOV A,20H ;将RAM的20H单元内容送A MOV C,20H ;将位寻址区中的位地址为20H位内容送 PSW 中的Cy中。
片内 RAM(20H-2FH)中的位寻址区结构图 2FH 字节地址 位地址 24H 返回 20H 返回前一次
2.2.3立即寻址 • 指令本身直接含有所需要的8位或16位的操作数。 将此数称为“立即数”(使用#标明)。如: MOV A,#30H;将(8位)立即数送累加器A MOV DPTR,#2000H ;16位立即数送DPTR积存器 【注意】:MOV A,#30HMOV A,30H两者的区别。 • 立即数寻址的指令长度为2或3个字节。 ROM ROM DPTR n 累加器A n+1 返回 MOV DPTR,#2000H指令的存储和执行 MOV A,#30H指令执行流程
2.2.4 寄存器间接寻址 • 指令中含有保存操作数地址的寄存器Ri。 MOV A,@Ri ( i=0、1) CPU首先根据指令中寄存器名Ri找到操作数地址,然后再从该地址中找到操作数 x。 如:MOV R0,#30H ;立即数送R0寄存器 MOV A,@R0 ;从RAM的H单元取数送累加器A 【注意】MOV A,@R0和 MOV A,R0指令的区别。 3 累加器A 30H 2 1 00H R0
使用寄存器间址指令时应注意的三个问题: 1,间址寄存器Ri只能使用R0、R1寄存器(i=0、1)。 2,间址方式不仅用于片内RAM,同样也适用于片外RAM。 对于片内RAM使用Ri寄存器,寻址范围为00H~FFH。 对于片外RAM,可以使用Ri,也可以使用DPTR做间址寄存器。两者区别在于后者寻址范围为0000H~FFFFH,两者都可以RAM和ROM。 3,间址方式的指令不能访问SFR中的单元。如下面的程序是错误的: MOV R1,#80H MOV A,@R1 (因为80H为SFR的物理地址)
MCS-51 片内 、片外 数据存储器示意图 注意: 1,访问片内RAM20H存储单元; MOV A,20H 2,访问片外RAM存储单元; MOV R0,#20H MOVX A,@R0 3,尽管片内与片外的RAM单元 的00H-FFH地址相重叠但由 于指令的不同不会发生地址 混乱。 FFFFH 片外数据 存储器 64KB FFH 特殊功能 寄存器 SFR 80H 7FH 通用数据 存储器 00H 0000H 片内数据存储器 片外数据存储器 256B个字节 64KB个字节 返回
2.2.5 变址寻址 • 指令使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,其和作为操作数地址。如: MOVX A,@A+PC ;PC内容与A的内容相加得操作数地址 并将此操作数送A MOVX A,@A+DPTR;DPTR内容与A的内容相加得操作数 地址并将此操作数送A • 使用变址指令时,要事先分别为A、DPTR赋值,以便获得操作数得地址。
变址指令只适用于对ROM存储器得访问,如查表等。变址指令只适用于对ROM存储器得访问,如查表等。 【举例】:已知ROM中0302H 单元有一个数x,现要把它送到累加器A中,试编程。 MOV DPTR,#0300H;立即数送DPTR MOV A,#02H;立即数送累加器A MOVC A,@A+DPTR ;从ROM的00302单元取数送A
变址寻址示意图 累加器A DPTR 02H 0300H 0300H + 02H 0302H ALU 0302H MOVC A,@A+DPTR 返回
2.2.6 相对寻址 • 转移指令中使用的一种寻址方式。MCS-51单片机的指令系统中,有两类转移指令:相对转移( 2个或3个字节) 绝对转移(3个字节)。 在绝对转移指令中,指令直接给出转移的目标地址(2字节地址),执行时将目标地址直接送给PC,从而控制程序转移; 而相对转移指令在执行中是将PC值与指令中的8位偏移量进行相加,形成指令要转移的目标地址。 SJMP rel • 由指令中有一个8位偏移量 rel为带符号位的补码,所以控制程序转移的范围为+127~-128。
例如:SJMP 54H ;(80H、54H) 累加器A PC 54H 2002H 操作码 2000H 2002H + 54H 2056H ALU 偏移量 2002H (LOOP1) 2056H
相对寻址使用中应注意的问题 与绝对寻址相比,相对寻址具有很好的“浮动性”,因此是编程人员普遍使用的一种寻址方式。 使用时,要注意3点: • 1,CPU进行地址计算时,PC取值是执行本指令后的地址值。以上面的例子说明: 指令本身的首地址是2000H,执行完后变为2002H(既下一条指令的首地址)。 如果使用三字节的相对转移指令,则PC=PC+3。 返回上一页
2,偏移量的计算: rel=目标地址-源地址-2 (2字节指令) 或: rel=目标地址-源地址-3 (3字节指令) 结果用补码的形式书写。 为了减少计算偏移量的计算,汇编程序允许使用“符号地址”的方式代替偏移量。如: SJMP loop1 汇编程序在翻译时,自动计算并将结果替换符号地址。 • 3, 如果转移地址的范围超过相对寻址的范围(如:-127~+128)时,就要采用别的方式法,否则在编译时,提示出错。 返回
2.2.7 位寻址 • 在位寻址指令(位操作指令)中使用的位地址。 在一般的情况下,系统的数据都是按字节(8位)来存放、处理。 单片机在控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。这些开关量信号以 bit --- “位”的形式进行各种运算、处理和存储的。 状态信号 外设1 MCS-51 单片机 控制、检测 系统 状态信号 外设2 控制信号 驱动器 电动机
在MCS-51单片机的硬件设计上充分考虑了这种“布尔”变量的处理,不仅在指令系统中设计了“位操作”指令,而且在片内RAM区中还专门开辟了一个 “位寻址区”。这样,布尔变量可以向字节数据一样进行存储、寻址。 • 除了位寻址区外,RAM中的大多SFR都可以按位寻址,换句话,SFR除了有自己的字节地址外,在寄存器内的每一位还有其位地址。
【举例】:SETB 20H ;将位地址为20H的位置一 SETB 90H ;将P1口的d0位置一 • 同字节寻址中的直接寻址一样,为了增加程序的可读性,凡在SFR中的位地址都可以使用符号地址来替代。如第二例中,完全可以使用下面的指令格式: MOV P1.0 ;将P0口的d0位置一 类似还有:MOV C,ACC.7 ;将累加器中的d7位送PSW的cy 这种指令在汇编程序进行翻译时,还是要先将符号地址转换为真正的位地址。 返回
2.3 数据传送指令 • 2.3.0 传送指令的特点 • 2.3.1内部数据传送类指令 • 2.3.2外部数据传送类指令 • 2.3.3堆栈操作指令 • 2.3.4数据交换指令 继续
2.3.0 传送指令的特点 • 数据传送是编程中使用最多、最主要的操作。它的功能是将数据在累加器、片内的RAM、SFR及片外ROM、RAM之间进行传送。 • 在传送类指令中,必须指定被传送数据的源地址和目标地址。在传送过程中,源地址的内容不被改变。 • 传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PWS一概无影响。 指令通式:MOV <dest>,<src> 【举例】:MOV A,R0 ;将R0寄存器中的数据送 累加器A中(注意寻址方式) 返回
2.3.1 内部数据传送类指令 • 特点:指令的源操作数和目的操作数都在单片机内部。 1,立即寻址型传送指令 2,直接寻址型传送指令 3,寄存器寻址型传送指令 4,寄存器间址型传送指令 5,内部数据传送类指令的使用 继续
1,立即寻址型传送指令 • 【特点】:原操作数字节是立即数,处在指令的第二或第三字节,所以这类指令都是多字节指令。这类指令有如下4条。 MOV A,#data ; A data (双字节指令) MOV Rn,#data ; Rn data (双字节指令) MOV @Ri,#data ; (Ri) data (双字节指令) MOV direct,#data ; direct data (三字节指令) • 这类指令多用于程序的初始化。如: MOV R0,#20H MOV A,#00H
立即寻址指令举例 • 已知:R0=20H,试问单片机执行如下指令后,累加器A、 R7、20H和21H单元中的内容是什么。 MOV A,#18H ;立即数18H送累加器A MOV R7,#28H ;立即数28H送寄存器R7 MOV @R0,#38H ;立即数38H送内存20H单元 MOV 21H,#48H ;立即数48H送内存21H单元 返回
2,直接寻址型传送指令 • 【特点】:指令中至少含有一个源操作数或目的操作数的地址。很明显,这也是2个或3个字节的指令格式,其中直接地址在第2或第3个字节上。这类指令有如下5条: MOV A,direct MOV direct,A MOV Rn,direct MOV @Ri,direct MOV direct2,direct1 【注意】:direct为内部寄存器、RAM和SFR的地址,换句话说:direct适用于片内所有的地址(寄存器、SFR和RAM)。
直接寻址指令举例 MOV A,30H ;内存RAM30h单元数据送A MOV 50H,A ;A中内容送RAM的50h单元 MOV R6,31H ;RAM的30h 内容送R6寄存器 MOV @Ri,30H ;RAM30h内容送Ri指定的RAM单元 MOV P1,32H ;RAM32h内容送P1口(p1:符号地址) MOV 90H,32H ;(同上,试比较两种表示方法) 返回
3,寄存器寻址型传送指令 • 指令中含有存放操作数的寄存器名Rn 其中(n∈0,1,2,3,4,5,6,7)。 共有如下三条: MOV A,Rn MOV Rn,A MOV direct,Rn 返回
4,寄存器间接寻址型传送指令 • 指令特点:指令中Ri中存放的不是操作数本身,而是操作数在RAM中的地址(i=0、1)。 格式如下: MOV A,@Ri MOV @Ri,A MOV direct,@Ri 【注意】;Ri中存放操作数的地址是有所选择的,只有非SFR的RAM单元才能使用这种寻址方式。
寄存器间接寻址指令举例 • 已知(40h)=11h,(41h)=22h,R0=40h和R1=41h。试问,下面的指令执行后,累加器A、40h、41h和42h单元中的内容是什么。 MOV A,@R0 ;RAM40h单元内容11h送A MOV @R1,A ;A中的11h送RAM的41h单元 MOV 42H,@R1 ;RAM的41h单元内容11h送 RAM42h中 返回
5,内部数据传送类指令的使用 • 1,在使用传送指令时,可以根据实际情况选用恰当寻址方式。上面给出的各种类型的传送指令是INTEL公司在设计MCS-51的硬件时就已经确定下来。编程人员只能像查字典一样去查找、使用。不能根据主观意愿去“创造”指令。 例如:要将R0中的数据传送到R1中。如何使用指令去完成上面的操作? mov r1,r0是否可以?回答是否定的!因为在MCS-51的指令系统中没有此条指令!只能使用: 1,mov a,r0或: 2, mov 01h,00h mov r1,a 因此,必须从MCS-51的指令表中选择使用指令。
MCS-51内部数据传送类指令方式图 累加器A direct 直接寻址 @Ri间址 Rn寄存器 Data立即数 返回上一次
2,以累加器A为目的寄存器的传送指令会影响PSW中的2,以累加器A为目的寄存器的传送指令会影响PSW中的 奇偶位P,而其余的指令对PSW均无影响。 • 3,要会正确地估计指令的字节。凡是指令中包含有立即 数、直接地址的指令,都应当在原有的基础上加1。 【举例】:mov a,@Ri ( )个字节 mov a,direct ( )个字节 mov direct,data ( )个字节 mov direct2,direct1 ( )个字节
4,对于同一问题可以有不同的编程方法。使用不同的方法虽然都可以实现题目的要求,但从指令长度、运行时间和可阅读性上等综合因素考虑,不同的方法就有合理和不合理、优化和繁杂之分。所以,在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。4,对于同一问题可以有不同的编程方法。使用不同的方法虽然都可以实现题目的要求,但从指令长度、运行时间和可阅读性上等综合因素考虑,不同的方法就有合理和不合理、优化和繁杂之分。所以,在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。 • 5,注意给程序进行正确的注释,这对于阅读、编写和修改程序都是非常重要的。下面就是一些注释的例子: MOV A,30H ;(30h) → A MOV A,R0 ; R0 → A MOV 40H,30H ;(30h) → 40h MOV A,@Ri ; ( Ri ) → A
内部传送类指令举例 • 试编出把30h和40h单元内容进行交换。 MOV A,30H;(30h) → A MOV 30H,40H;(40h) → 30h MOV 40H,A; A → 40h 30H 累加器A 40H 返回
2.3.2 外部数据传送类指令 1,16位数传送指令 2,外部ROM的字节传送 3,外部RAM的字节传送指令 继续