910 likes | 1.1k Views
第 2 章 单片机的指令系统. 本章学习目标 : 了解指令及指令系统常识 熟悉指令中常用符号 在理解的基础上牢记 7 种寻址方式 熟悉各类指令的功能及应用范围 能使用指令完成各种常规任务. 2.1 指令系统概述与寻址方式. 什么是指令?. 2.1.1 指令系统概述. 1 .指令 单片机是靠软件和硬件结合起来完成控制功能的,软件的基础就是指令和指令系统。 指令是计算机设计人员预先设计好的用以完成某种操作的命令。 例如用计算机指令来完成 10+20 的加法运算,用机器代码表示如下:
E N D
第2章 单片机的指令系统 • 本章学习目标: • 了解指令及指令系统常识 • 熟悉指令中常用符号 • 在理解的基础上牢记7种寻址方式 • 熟悉各类指令的功能及应用范围 • 能使用指令完成各种常规任务
2.1 指令系统概述与寻址方式 什么是指令? 2.1.1指令系统概述 1.指令 单片机是靠软件和硬件结合起来完成控制功能的,软件的基础就是指令和指令系统。 指令是计算机设计人员预先设计好的用以完成某种操作的命令。 例如用计算机指令来完成10+20的加法运算,用机器代码表示如下: 01110100 00001010 ;把10送累加器A中 00100100 00010100 ;A加20,结果存A中 机器语言指令
什么是机器语言? 用二进制编码表示的,能够被计算机直接识别和执行的语言称为机器语言。它不便于记忆、查错和修改。用助记符、符号和数字来表示指令的程序语言,称为汇编语言。它与机器语言指令一一对应,便于理解和记忆。上面两条指令用汇编语言可表示为:MOV A, #10 ADD A, #20查找附录A,可以得到这两条指令的十六进制机器代码如下:74H 0AH 24H 14H
机器语言是计算机唯一能够识别和执行的语言,因而我们编写的汇编语言程序必须通过翻译将其转换为机器语言才能被计算机执行,这一翻译过程称为汇编。机器语言是计算机唯一能够识别和执行的语言,因而我们编写的汇编语言程序必须通过翻译将其转换为机器语言才能被计算机执行,这一翻译过程称为汇编。 汇编语言是一种面向机器的语言,它不能在不同类型的计算机上互相移植; 高级语言是独立于机器的,即用高级语言编写的程序可以方便地移植到不同的单片机上。针对单片机的主要有C(C51)语言和PLM语言, 本教材我们只学习汇编语言。因汇编语言编写程序时是面向机器的,结合单片机的硬件资源来学习汇编语言,对初学者来说是最合适不过的了。下面我们给出典型的汇编语言指令的书写格式:
方括号内的字段可以省略 [标号:] 操作码 [操作数1,操作数2,操作数3][;注释] NEXT: MOV A, R0 ;A←(R0) 合法字符举例:LOOP,NEXT_1,START 非法字符举例:2SUM,S+L,ADD,DB 标号是一个名字,用来标明指令的地址,由1~6个字符组成,首字符必须是字母,后面可跟数字和字母字符,也可以是下划线,但系统保留字不能作标号,如操作码等。 MOV是操作码,它表示指令的性质和功能,此处其功能是将R0中的内容送到累加器A中, A是数据传送的目的地,称为目的操作数 R0是数据的来源,称为源操作数
2.指令系统 • 一台计算机的CPU所能执行的全部指令的集合称为这个CPU的指令系统。指令系统是开发和生产厂商定义的,如要使用其单片机,用户就必须了解和遵循这些指令标准,要掌握某种(类)单片机,指令系统的学习是必须的。 • 80C51共有111条指令: • 其指令字节少,单字节指令49条,双字节指令45条,三字节指令17条; • 指令执行时间短,单机器周期指令64条,双机器周期指令45条,4机器周期指令2条, • 该指令系统还有极为丰富的位操作指令,充分体现了单片机面向控制的特点。
2.1.2 寻址方式 • 对于一条汇编语言指令来说,有两个问题要解决: • 一是要说明进行什么操作 • 二是要指出参与操作的数据的值是多少或者到何处取得,以及操作结果放到何处。 寻址方式就是寻找操作数的方法。 • 在计算机中寻址方式越多,操作数的寻找越容易,程序设计也就越方便。 • 51系列单片机共有7种寻址方式,分别为立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。 • 对于两操作数指令,源操作数和目的操作数都有寻址方式,我们下面提到的都是源操作数的寻址方式。 由操作码指出 由寻址方式决定
1.立即数寻址 在指令中直接给出参与操作的数据,这种寻址方式称为立即数寻址。这一直接给出的数据称为立即数,立即数前要加上“#”符号,例如: MOV A,#0EH ;A←0EH MOV DPTR,#2100H ;DPTR←2100H 将8位的立即数0EH送到累加器A 将16位的立即数2100H送到数据指针寄存器DPTR,立即数的高8位21H装入DPH,低8位00H装入DPL。
2.寄存器寻址 参与操作的数据由寄存器给出,这种寻址方式称为寄存器寻址。 由于寄存器在CPU的内部,所以采用该寻址方式可以获得较高的运算速度,可用于该寻址方式的寄存器有R0~R7、DPTR、A、B。 如:MOV A,R1 ;A← (R1) 该指令将R1内的数据传送到累加器A中,源操作数R1和目的操作数均采用了寄存器寻址。 再比如: INC DPTR ;DPTR←(DPTR)+1
3.直接寻址 • 在指令中直接给出操作数的地址的寻址方式称为直接寻址。 • 在该寻址方式中,操作数存放在片内数据存储器中,地址长度为8位。 • 这种寻址方式可以访问:内部数据RAM低128B(该空间还可以采用寄存器间接寻址)和特殊功能寄存器SFR(该空间只能采用直接寻址)。 例如:在片内RAM60H单元存放一个8位二进制数3CH,执行指令MOV A,60H后,结果为(A)=3CH。如图2-1所示。
4.寄存器间接寻址 • 在指令中以指定寄存器的内容作为操作数地址的寻址方式称为寄存器间接寻址。 • 这种方式可用于访问内部RAM和外部数据存储器。 • 能够用于寄存器间接寻址方式的寄存器有:R0、R1、DPTR和SP。 • 在间接寻址寄存器前加“@”表示间接寻址。 例如: MOV A,@R0 ;A←((R0)) 假定R0中的内容为50H,50H单元内容为45H,图2-2给出了寄存器间接寻址方式的执行过程。
寄存器间接寻址的寻址范围: (1)片内128B的RAM,用R0,R1作间址寄存器,如MOV A,@R0; (2)片外64KB的数据存储器,用DPTR作间址寄存器,如MOVX A,@DPTR; (3)堆栈区域,用SP作间址寄存器,如PUSH ACC; (4)片外256B数据存储器,用R0,R1作间址寄存器,如MOVX A,@R0;
5.变址寻址 • 基址寄存器(DPTR或PC)的内容与变址寄存器(累加器A)的内容相加,其和形成16位地址作为操作数的地址的寻址方式称为变址寻址。 • 该类寻址方式用于程序存储器的访问,多用于查表程序。 例如: MOVC A,@A+DPTR ;A← ((A)+(DPTR)) • 设(A)=12H,(DPTR)=02E3H,(02F5H)=1EH,则结果为(A)=1EH,执行情况见图2-3所示。 变址寻址指令只有3条,另外两条是: MOVC A,@A+PC JMP @A+DPTR
6.相对寻址 • 相对寻址是以程序计数器PC的当前值(是指当前跳转指令的下一条指令的地址)为基准,加上指令中给出的相对偏移量rel以得到程序执行地址的寻址方式。 • 这种寻址方式的目的是修改PC的值,从而实现程序的转移。 • 转移的目的地址可参见如下表达式: • 目的地址=转移指令地址+转移指令字节数+rel • 值得注意的是,偏移量rel有正负之分,其取值范围是-128~+127。
例如:有双字节相对转移指令 指令地址 操作码 操作数 指令 注释 3000H 80 54H SJMP rel ;PC← (PC)+2+rel 其中,操作码80H存放在3000H单元中,54H是设定的相对偏移量rel,存放在3001H单元。指令的执行过程如图2-4所示。
7.位寻址 • 位寻址是将8位二进制数中的某一位作为操作数,在指令中给出的是位地址,一般用bit表示。 • 例如: CLR P1.0 ;将P1口的第0位清零 • 位寻址的范围为: • 片内RAM区的20H~2FH的16个单元中的128位, 如 MOV C,30H • 字节地址能被8整除的SFR, 如 SETB P1.0
2.2 数据传送指令(29条) 2.2.1通用传送指令 通用传送指令的助记符为MOV(Move),格式如下: MOV <目的操作数>,<源操作数> 此类指令的功能是把源操作数指定的数据传送到目的操作数(目的地址)所指定的存储单元中。MOV指令的传送关系如图2-5所示。
例1 设内部RAM中(50H)=40H,(40H)=10H,P1口作输入口,(P1)=0ABH,问程序执行后各存储器中的数据是什么? MOV R0,#50H ;立即数50H送R0中,(R0)=50H MOV A,@R0 ;R0间接寻址,将50H单元内容送A,(A)=40H MOV R1,A ;A送R1,(R1)=40H MOV B,@R1 ;R1间接寻址,将40H单元内容送B,(B)=10H MOV @R1,P1 ;将P1内容送40H单元,(40H)=0ABH MOV P2,P1 ;将P1内容送P2 ,(P2)=0ABH 执行结果: (R0)=50H,(A)=40H,(R1)=40H (B)=10H,(P1)=0ABH,(40H)=0ABH (P2)=0ABH 任何不符合格式要求的“指令”都是不合法的。
2.2.2 特殊传送指令 这类指令用于访问片外RAM或扩展的I/O口。 1.读写片外RAM指令MOVX (1)用@DPTR进行间接寻址的指令 读: MOVX A, @DPTR ; A← ((DPTR)) 写: MOVX @DPTR, A ; (DPTR)← A DPTR为16位数据指针,该指令可以寻址外部RAM的64KB范围(0000H—0FFFFH),地址的低8位由P0口输出,高8位由P2口输出,数据通过P0口输入/输出。
(2)用@Ri进行间接寻址的指令 • 读:MOVX A, @Ri ; (A)←((Ri)) • 写:MOVX @Ri, A ; (Ri) ←A • 指令可寻址范围: • 当片外RAM小于或等于256个单元,用@Ri间接寻址进行数据传送时,8位地址线足够使用。 • 当片外RAM单元较多时,8位地址线不够用,此时低8位地址在R0或R1中,P0口分时作低8位地址线和数据线;高8位地址由P2口提供,因此P2口应预先设置。 • 若设计循环程序,则Ri被加到0或减到0时必须考虑对P2口高8位地址进位或借位的影响。
例2 把片外RAM的36H单元中的数据送到片外RAM的1200H单元。 〈分析〉(36H)→(1200H) 程序如下: MOV R1,#36H MOVX A ,@R1 MOV DPTR,#1200H MOVX @DPTR, A <想一想>下面的程序可以实现吗? MOV DPTR, #1200H MOV R1,#36H MOV @DPTR,@R1 注意:片外RAM之间不能直接传送数据,必须经过累加器A
2.查表指令MOVC MOVC A,@A+DPTR ;A←((A)+(DPTR)) MOVC A,@A+PC ;A←((A)+(PC)) 这两条指令主要用于查表,可以完成从程序存储器中取得数据并送入累加器A的功能。 (1) 第一条指令以DPTR为基址寄存器,查表时DPTR用于存放表格的起始地址。表格起始地址可以设置在64KB程序存储器中的任何位置。 (2)第二条指令以PC为基址寄存器,因A为8位无符号数,故该指令的查找范围是从PC当前值开始的255个地址单元内。 若(DPTR)=3000H,(A)=60H,执行指令“MOVC A,@A+DPTR”后,将程序存储器3060H单元的内容送A。
例3已知累加器A中有一个0~9范围内的数,请用查表法编程求出该数的平方值。设平方表表头地址为1000H。例3已知累加器A中有一个0~9范围内的数,请用查表法编程求出该数的平方值。设平方表表头地址为1000H。 〈方法1〉以DPTR为基址寄存器 MOV DPTR,#1000H ;表头地址 MOVC A,@A+DPTR ;查表求出平方值送A 若原(A)=3,查表后(A)=9。 〈方法2〉以PC为基址寄存器 ORG 0FFBH 0FFBH ADD A,#data ;加修正量,此例data=02H 0FFDH MOVC A,@A+PC ;查表 0FFEH SJMP $ ;暂停
例如,若(R1)=16H,(A)=28H,执行“XCH A,R1”后,(A)=16H,(R1)=28H 1000H DB 0 1001H DB 1 1002H DB 4 ┇ 1009H DB 81 END 修正量=表头地址-PC当前值=1000H-0FFEH=02H 所以data=02H(SJMP指令2字节)。 查表指令和被查表格通常在同一页内(页内地址00H~0FFH即0~255)
3.数据交换指令 • 交换类指令完成的传送是双向的,是两个字节间或两个半字节间的双向交换。 • 特点是只能与累加器A进行交换。 • 字节交换 • XCH A,Rn ;(A)(Rn) • XCH A,direct ;(A)(direct) • XCH A,@Ri ;(A)((Ri)) • 功能:字节数据交换,实现3种寻址操作数内容与A中内容的互换。
半字节交换 • XCHD A,@Ri ;(A3~0)((Ri)3~0) • SWAP A ;(A3~0)(A7~4) • 例如,若(R1)=50H,(50H)=74H,(A)=26H。执行指令“XCHD A,@R1”后,(A)=24H,(50)=76H。 • 再如,若(A)=38H,执行指令“SWAP A”后,(A)=83H。
4.堆栈操作指令(PUSH 、POP) • 堆栈操作指令只有两条: • 入栈指令用于保护片内某个单元的内容, • 出栈指令用于恢复片内某个单元的内容。 • 通常入栈指令和出栈指令是成对出现的。 • 入栈: • PUSH direct ;SP←(SP)+1,(SP)← (direct) • 出栈: • POP direct ;direct← ((SP)),SP← (SP)-1 • 入栈操作:首先(SP)+1,然后写入数据; • 出栈操作:首先读出数据,然后(SP)-1。
图2- 6 堆栈存入/取出数据的操作 如图2-6所示,在堆栈的原始状态下执行一条“PUSH ACC”后,堆栈的变化过程如图2-6(b);在堆栈的原始状态下执行一条“POP ACC”后,堆栈的变化过程如图2-6 (c)
例4 设(60H)=X,(70H)=Y,试用堆栈指令实现60H和70H单元内容的互换。 MOV SP,#50H ;设栈底 PUSH 60H ;51H←(60H),X压入51H单元 PUSH 70H ;52H←(70H),Y压入52H单元 POP 60H ;60H←(52H),Y弹出进入60H单元 POP 70H ;70H←(51H),X弹出进入70H单元 〈想一想〉 用数据交换指令如何实现60H和70H单元内容的互换?
2.3 算术运算指令(24条) 算术运算指令可以完成加、减、乘、除四则运算以及加1、减1和二-十进制调整操作。 这类指令多与累加器A有关,A常作为目的操作数,即指令运算结果存放在A中。同时它也能充当源操作数。 这类指令大多影响标志位,因而分析指令运算结果和对标志位的影响是本小节的重点。具体影响见表2-3
表2-3 算术运算指令对标志位的影响 说明: 1 .“√”表示对应的指令操作影响该标志位;“0”表示相应的指令操作对该标志位清0;“×”表示相应的指令操作不影响该标志。 2. 累加器加1(INC A)和减1(DEC A)指令仅影响P标志。
2.3.1加法指令 1.不带CY位的加法指令 格式: ADD A,Rn ;A←(A)+(Rn) ADD A,direct ;A←(A)+(direct) ADD A,@Ri ;A←(A)+((Ri)) ADD A,#data ;A←(A)+ data 功能: 把源操作数与A中内容相加后再送入A中。 在上述4条指令中,参与运算的操作数都是8位二进制数,且其中一个操作数必须是累加器A。 编程人员可以将参与运算的两个操作数视为无符号数(0~255),也可以把它们看作是有符号数。若看作是有符号数,则通常采用补码形式(-128~+127)。
计算机总是把操作数当作有符号数(补码形式)看待并影响PSW的相关标志位。影响情况如下:计算机总是把操作数当作有符号数(补码形式)看待并影响PSW的相关标志位。影响情况如下: • 进位/借位标志CY: • 两数和的D7位有进位时,(CY)=1,否则,(CY)=0。 • 半进位/借位标志AC: • 两数和的D3位有进位时,(AC)=1,否则,(AC)=0。 • 溢出标志OV: 两数和的D7,D6位只有一位有进位时,(OV)=1;否则,(OV)=0,即OV=C6⊕C7。 • 奇偶标志P: 当累加器A中“1”的个数为奇数时,(P)=1;为偶数时(P)=0。
例5 试分析80C51单片机执行下述指令后,累加器A和PSW各标志位的变化。 MOV A,#0A5H ADD A,#0CFH 解:(A)=10100101B + Data=11001111B CY 01110100B C7 C6 AC (CY)=C7=1;(AC)=1;溢出标志(OV)=C7⊕C6=1⊕0=1,有溢出;(P)=0。执行结果:(A)=74H。 若为无符号数运算, (CY)=1,表示结果超出(0~255)范围。若为带符号数运算,因(-49)+(-91)=-140,超出了(-128~+127)的范围,所以OV=1溢出。
2.带CY位加法指令 带CY位加法指令常用于多字节加法运算,格式如下: ADDC A,Rn ;A←(A)+(Rn)+(CY) ADDC A,direct ;A←(A)+(direct)+(CY) ADDC A,@Ri ;A←(A)+((Ri))+(CY) ADDC A,#data ;A←(A)+ data +(CY) 功能:把源操作数与A中内容相加后再加上标志位CY的当前值,将和送入A中。 这组指令的操作影响PSW的CY、AC、OV和P标志。 假设当前(CY)=1,(A)=85H,(R0)=97H,执行指令“ADDC A,R0”后,则使(A)=1DH,(CY)=1,(AC)=0,(OV)=1,(P)=0。
3.加1指令 格式: INC A ;A←(A)+ 1 INC direct ;direct←(direct)+ 1 INC Rn ;Rn←(Rn)+ 1 INC @Ri ;(Ri)←((Ri))+ 1 功能: 把源操作数的内容加1,结果再送回原来的单元。 这些指令仅“INC A”影响奇偶标志P,其余指令都不影响标志位的状态。
4.十进制调整指令 • 格式: • DA A ;若AC=1或A3~A0>9,则A←(A)+06H • ;若CY=1或A7~A4>9,则A←(A)+60H • 功能: • 通常跟在BCD码加法运算之后,用来对累加器A中刚刚进行的两个BCD码的相加结果进行十进制调整。 • 使用该指令时应注意以下几点: • 本指令使用时跟在ADD或ADDC指令之后。 • 不能用DA A指令对BCD码减法操作进行直接调整,如需调整可采用十进制补码相加后,再用DA指令调整。 • 本指令不影响溢出标志位OV • 借助标志位可实现多位BCD码加法结果的调整。
例6 分析下面程序段运行后的结果。 MOV A,#78H ADD A,#93H DA A 解:列竖式分析过程如下: (A)=01111000B + data=10010011B 1 00001011B + 00000110B 低四位>9,加06H调整 1 00010001B + 01100000B CY=1,加60H调整 1 01110001B 结果为171 则(A)=71H,考虑进位/借位标志(CY)=1,操作结果为171。
2.3.2 减法指令 1.带CY位减法指令 与加法指令不同,减法运算中只有带CY位的减法指令,其格式如下: SUBB A,Rn ;A←(A)-(Rn)-(CY) SUBB A,direct ;A←(A)-(direct)-(CY) SUBB A,@Ri ;A←(A)-((Ri))-(CY) SUBB A,#data ;A←(A)- data -(CY) 功能: 把累加器A中内容减去指令指定的单元的内容,再减去标志位CY的值,将结果再送回累加器A中。 SUBB指令对PSW中标志位的影响类似于ADDC加法指令。
例7 已知(A)=78H,(CY)=1,问执行完“SUBB A,#0C5H”后A和各标志位的状态。 解:列竖式为: (A)= 01111000B - data= 11000101B 1 10110011B - 1 减CY 1 10110010B 则(A)=0B2H,(OV)=C7⊕C6=1⊕0=1,有溢出,(P)=0,(AC)=0。 <想一想> 不带借位的减法操作如何实现?
2.减1指令 格式: DEC A ;A←(A)- 1 DEC direct ;direct←(direct)- 1 DEC Rn ;Rn←(Rn)- 1 DEC @Ri ;(Ri)←((Ri))- 1 DEC DPTR ;DPTR←(DPTR)- 1 功能: 把源操作数的内容减1,结果再送回原来的单元。 这组指令仅“DEC A”影响奇偶标志P,其余指令都不影响标志位的状态。
2.3.3 乘法指令 • 格式: • MUL AB ;累加器A与B寄存器相乘 • 功能: • 将累加器A与寄存器B中的2个无符号8位二进制数相乘,乘积的低8位留在累加器A中,高8位存放在寄存器B中。 • 运算结果将对OV、CY、P标志位产生影响: • 当乘积大于0FFH,即255(B中内容不为0)时,溢出标志位(OV)=1;否则(OV)=0; • 标志位CY总是被清0; • P的状态由A中的内容决定。 • 例如:(A)=36H,(B)=03H,执行指令“MUL AB”之后,(A)=0A2H,(B)=00H,(CY)=0,(OV)=0,(P)=1。
2.3.4 除法指令 • 格式: • DIV AB ;累加器A除以寄存器B • 功能:累加器A中的8位无符号数除以寄存器B中的8位无符号数,所得的商存在A中,余数存在B中。 • 对标志位的影响: • 对CY和P标志位的影响与乘法相同; • 当除数为0时,除法没有意义,(OV)=1,否则(OV)=0。 • 例如:(A)=0FBH(十进制是251),(B)=12H(十进制是18),执行指令“DIV AB”之后,(A)=0DH,(B)=11H,(OV)=0,(CY)=0。
2.4 逻辑运算与循环类指令(24条) • 逻辑运算指令可以完成与、或、异或、取反、清0操作; • 循环指令是对累加器A进行循环移位操作,包括向左、向右以及带CY位的移位操作。
2.4.1 逻辑与运算指令 格式1: ANL direct,A ;direct←(direct)∧A ANL direct,#data ;direct←(direct)∧data 功能: 源操作数与直接地址指示的单元内容相与,结果送入直接地址指示的单元。 格式2: ANL A, #data ;A←(A)∧data ANL A, direct ;A←(A)∧(direct) ANL A, Rn ;A←(A)∧(Rn) ANL A, @Ri ;A←(A)∧((Ri)) 功能: 源操作数与A相与,结果送入A中。 例如:(A)=8CH,(R1)=0ABH,执行指令“ANL A,R1”后,(A)=88H,(R1)=0ABH。
2.4.2 逻辑或运算指令 格式1: ORL direct,A ;direct←(direct)∨A ORL direct,#data ;direct←(direct)∨data 功能: 源操作数与直接地址指示的单元内容相或,结果送入直接地址指示的单元。 格式2: ORL A,#data ;A←(A)∨data ORL A,direct ;A←(A)∨(direct) ORL A,Rn ;A←(A)∨(Rn) ORL A,@Ri ;A←(A)∨((Ri)) 功能: 源操作数与A相或,结果送入A中。 例如:(A)=0C5H,(R2)=67H,执行指令“ORL A,R2”后,(A)=0E7H。
2.4.3 逻辑异或运算指令 格式1: XRL direct,A ;direct←(direct)⊕A XRL direct,#data ;direct←(direct)⊕data 功能: 源操作数与直接地址指示的单元内容相异或,结果送入直接地址指示的单元。 格式2: XRL A,#data ;A←(A)⊕data XRL A,direct ;A←(A)⊕(direct) XRL A,Rn ;A←(A)⊕(Rn) XRL A,@Ri ;A←(A)⊕((Ri)) 功能:源操作数与A相异或,结果送入A中。
2.4.4 累加器清0和取反指令 格式: CLR A ;A← 0 CPL A ;A← 功能: 分别对A中内容清0和取反,结果仍存入A中。 例如:(A)=7FH,执行指令“CLR A”和“CPL A”后,A中内容分别为00H和80H。