900 likes | 1.05k Views
第三章. MCS-51 指令系统. 与指令系统相关的一些概念. 指令 : CPU 根据人们的意图来执行某种操作的命令。 指令系统 :是计算机所能够执行的全部指令的集合。 程序 :是按人们的要求所编制的指令操作序列。 程序设计语言 :是编写程序的某种规则。 三类编程语言 :机器语言、汇编语言、高级语言. 3.1 汇编语言的指令格式. MCS-51 汇编指令由操作码助记符字段和操作数字段所组成。指令格式如下 : 标号:操作码 ︹ [ 操作数 1] [, 操作数 2] [, 操作数 3] [; 注释 ].
E N D
第三章 MCS-51指令系统
与指令系统相关的一些概念 指令:CPU根据人们的意图来执行某种操作的命令。 指令系统:是计算机所能够执行的全部指令的集合。 程序:是按人们的要求所编制的指令操作序列。 程序设计语言:是编写程序的某种规则。 三类编程语言:机器语言、汇编语言、高级语言
3.1 汇编语言的指令格式 MCS-51汇编指令由操作码助记符字段和操作数字段所组成。指令格式如下: 标号:操作码 ︹ [操作数1] [,操作数2] [,操作数3] [;注释] 标号加在指令之前,标号必须以字母开始,后跟1~8个字母或数字,并以“:”结尾,用户定义的标号不能和汇编保留符号(包括指令操作码助记符以及寄存器名等)重复。标号的值是它后面的指令存储地址。 它由2~5个英文字母所组成,如JB、MOV、CJNE、LCALL等。 它以一个或几个空格和操作码隔开,根据指令功能的不同,操作数可以有1、2、3个或没有(如NOP)。操作数之间以“,”分开。 它以“;”和操作数分开。如果一行写不下,可以另起一行,但都必须以“;”开始。注释的作用:是用户对某一条指令或某一段程序的功能说明,在指令中不起作用。指令汇编后,注释没有被汇编成机器码
3.1.2 汇编伪指令 标准的MCS-51汇编程序还定义了许多伪指令供用户使用,多数伪指令汇编时不产生机器语言指令,仅提供汇编控制信息。 1、定位伪指令 ORG m m为十进制或十六进制数。 m指出该伪指令后的指令的汇编地址。在一个汇编语言源程序中允许使用多条定位伪指令,但其值应和前面生成的机器指令存放地址不重叠。
2、定义字节伪指令 DB X1,X2,X3,…,Xn Xi为单字节数据,它为十进制或十六进制数,也可以为一个表达式。 Xi也可以为由两个单引号“‘”所括起来的一个字符串,这时Xi定义的字节长度等于字符串的长度,每个字符为一个ASCII码 该伪指令把X1,X2,X3,…,Xn送目标程序存储器,通常用于定义一个常数表。
3、字定义伪指令 DW Y1,Y2,Y3,…,Yn Yi为双字节数据,它可以为十进制或6十六进制数,也可以为一个表达式。 该伪指令把Y1,Y2,Y3,…,Yn送目标程序存储器,经常用于定义一个地址表。
4、字或字节赋值伪指令 EQU m 例: ASDF EQU 30H 则ASDF 等价于30H 5、定义存储空间伪指令 DS 表达式 例:ORG 1000H DS O7H ;从地址1000H开始保留7个单元 7、定义位地址符号伪指令 字符名称 BIT 位地址 例:P11 BIT P1.1;P1口位1地址91H赋给P11
7、数据地址赋值伪指令 字符名称 DATA 表达式 例:AA DATA 35H 8、汇编结束伪指令 END 该伪指令指出结束汇编,即使后面还有指令,汇编程序也不作处理。
3.2 寻址方式 • 寻址方式:就是指令中给出参与运算的操作数的方式 • MCS-51单片机有八种寻址方式: 1、寄存器寻址 5、变址寻址 2、寄存器间接寻址 6、相对寻址 3、直接寻址 7、位寻址 4、立即数寻址 8、页面寻址
寄存器寻址 • 由指令指出某一个寄存器的内容作为操作数,这种寻址方式称为寄存器寻址。 寄存器寻址对所选的工作寄存器区中的R0~R7进行操作时,由PSW的4、3位决定是哪个工作寄存器区 可用寄存器寻址方式访问的寄存器有: R0~R7、A、B、DPTR、进位标志C(布尔处理器的累加器C)等 • 如:MOV A,R0 ;(R0)A DEC B ;(B)-1 B ADD A,R1 ;(A)+(R1) A INC DPTR ;(DPTR)+1 DPTR MOV bit,C ;(C) bit
直接寻址 在指令中含有操作数的直接地址,该地址指出了参与运算或传送的数据所在的字节单元或位地址。即直接给出操作数所在存储单元的地址或位地址。
直接寻址方式 • 直接寻址方式访问以下三种存储空间: ●特殊功能寄存器(SFR只能用直接寻址方式访问); ●内部数据存储器RAM低128字节(对于8032/8052等单片机,其内部高128字节RAM(80H~0FFH)不能用直接寻址方式访问 ) ●位地址空间 • 如: MOV A,3AH ;(3AH)A • MOV P1,R0 ;(R0)P1口 INC 58H ;(58H)+1 58H SUBB A,TL0 ;(A)-(TL0) A 例如:ANL 70H,#48H ;(70H)∧48H 70H
寄存器间接寻址 寄存器间接寻址用符号@ 8051规定:R0、R1和DPTR可以作为间接寻址寄存器。 由指令指出某一寄存器中的内容作为操作数的地址。这种寻址方式称为寄存器间接寻址。 1、用选定的工作寄存器区中的R0或R1作地址指针来寻址片内RAM的256B(00~0FFH)或片外RAM的低256B空间(00~0FFH)。 • 如:设(R0)=65H,(65H)=47H MOV A,@R0 ;(65H)A,A中的值是47H MOV @R0,#3AH;3AH65H MOVX A,@R0 ;外RAM的(65H) A 带X为访问外部RAM的指令
2、用DPTR作地址指针来进行寄存器间接寻址 如:设(DPTR)=2000H MOVX @DPTR,A ;A外部RAM的2000H单元 MOVX A,@DPTR;外RAM的2000H单元的内容A 例如:ANL A,@R0 ;(A)∧((R0)) A
立即寻址 • 立即寻址方式中操作数包含在指令中。即操作数以指令字节的形式存放于程序存储器中。在操作码后面。用“#”表示。 操作数可以是8位的,也可以是16位的。 • 如:MOV A,3AH ;(3AH)A× MOV A,#3AH ; 3AHA MOV DPTR,#23C8H ; 23C8H DPTR ADD A,#0D4H ;(A)+0D4H A 例如:MOV A,#70H ; 70HA
变址寻址 这种寻址方式以16位的程序计数器PC或数据指针DPTR作为基寄存器,以8位的累加器A作为变址寄存器。基寄存器和变址寄存器的内容相加形成16位的地址,该地址即为操作数的地址。 • 只能访问程序存储器,范围:64KB • MCS-51指令系统中总共有如下三条基寄存器加变址寄存器间接寻址指令
如: MOVC A,@A+DPTR ;((A)+(DPTR))A MOVC A,@A+PC ;((A)+(PC))A JMP @A+DPTR ;((A)+(DPTR))PC 该寻址方式多用于查表操作。
相对寻址 以当前的程序计数器PC值加上指令中给定的偏移量rel所得的结果作为转移地址 2字节或3字节 目的地址=源地址+相对转移指令字节数+rel 如 JC 75H ;(PC)+2+75H->PC
位寻址 操作数按8位二进制数中的某一位为单元进行存取和操作。 位寻址的两种方式: 直接使用位地址 特殊功能寄存器可由寄存器名字加位数表示 如: MOV C,01H ;01H为位地址 SETB EA ;中断允许寄存器IE的位7置1
页面寻址 用R0,R1作为地址指针访问片外RAM时的寻址方式。 如: MOV P2,#0A0H MOV R0,#01H MOV A,#10H MOVX @R0,A ;(A)->0A00H
3.3 MCS-51的指令系统 MCS-51指令系统按功能分类如下: • 数据传送类指令(29条) • 算术运算类指令(24条) • 逻辑运算类指令(24条) • 位操作类指令 (17条) • 控制转移类指令(17条)
数据传送指令 • 绝大多数指令都有操作数,所以数据传送操作是一种最基本最重要的操作之一。数据传送是否灵活快速对程序的编写和执行速度产生很大影响。 MCS-51的数据传送操作可以在累加器A、工作寄存 器R0~R7、内部数据存贮器、外部数据存贮器和程 序存贮器之间进行,其中对A和R0~R7的操作最多
MOV A,Rn ;(Rn)A n=0~7 MOV A,direct ;( direct )A MOV A,@Ri ;((Ri))A i=0~1 MOV A,#data ; data A • 一、以累加器A为目的操作数的指令(4条) 这组指令的功能是把源操作数的内容送入累加器A。源操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等寻址方式。 例1: MOV A,R6 ;(R6) A, 寄存器寻址 MOV A,70H ;(70H) A, 直接寻址 MOV A,@R0 ;((R0)) A, 间接寻址 MOV A,#78H ; 78H A, 立即寻址
二、以Rn为目的操作数的指令(3条) MOV Rn ,A;(A)Rn MOV Rn ,direc;( direct )Rn MOV Rn ,#data; data Rn 这组指令的功能是把源操作数的内容送入当前工作寄存器区的R0~R7中的某一个寄存器。源操作数有寄存器寻址、直接寻址和立即寻址等寻址方式。 例2: MOV R2,A ;(A) R2,寄存器寻址 MOV R7,70H ;(70H) R7,直接寻址 MOV R3,#0A0H ; 0A0H R3,立即寻址
三、以直接寻址的单元为目的操作数的指令(5条)三、以直接寻址的单元为目的操作数的指令(5条) MOV direct,A;(A)direct MOV direct,Rn;(Rn)direct MOV direct,direct;(源direct)目的direct MOV direct,@Ri;((Ri))direct MOV direct,#data; datadirect • 这组指令的功能是把源操作数送入由直接地址指出的存贮单元。源操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等寻址方式。 • 例3: MOV P1,A ;(A)P1,寄存器寻址 MOV 70H,R2 ;(R2)70H,寄存器寻址 MOV 0E0H,78H ;(78H)ACC,直接寻址 MOV 40H, @ R0 ;((R0)) 40H,寄存器间接寻址 MOV 01H,#80H ; 80H 01H,立即寻址
四、以寄存器间接寻址的单元为目的操作数的指令(3条)四、以寄存器间接寻址的单元为目的操作数的指令(3条) MOV @Ri,A;(A)(Ri) MOV @Ri,direct;(direct)(Ri) MOV @Ri,#data; data(Ri) • 这组指令的功能是把源操作数的内容送入当前工作寄存器区的R0或R1内容所指出的内部RAM存贮单元中。源操作数有寄存器寻址、直接寻址和立即寻址等寻址方式。 • 例4: MOV @R1,A ; (A)(R1) 寄存器寻址 MOV @R0,70H ; (70H)(R0)直接寻址 MOV @R1,#80H ; 80H(R1) 立即寻址
五、十六位数据传送指令(1条) MOV DPTR,#data16;dataHDPH,dataL DPL 上述MOV指令中,累加器A是一个特别重要的8位寄存器,CPU对它具有其它寄存器所没有的操作指令,后面将介绍的加、减、乘、除指令都是以A作为操作数的,Rn为CPU当前选择的寄存器区中的R0~R7,在指令编码中rrr=000~111,分别对应于R0~R7。 直接地址指出的存贮单元为内部RAM的00~7FH和特殊功能寄存器。 在间接寻址中,用R0或R1作地址指针,访问内部RAM的00~0FFH这256个单元。 这条指令的功能是把16位常数送入DPTR。16位的数据 指针DPTR由DPH和DPL组成,这条指令执行结果把高位 立即数送入DPH,低位立即数送入DPL。
例5 设(70H)=60H,(60H)=20H,P1口为输入口,当前的输入状态为B7H,执行下面的程序: MOV R0,#70H ; 70HR0 MOV A,@R0 ; 60HA MOV R1,A ; 60HR1 MOV B,@R1 ; 20HB MOV @R0,P1 ; B7H70H 结果(70H)= B7H,(B)=20H (R1)=60H,(R0)=70H
六、查表指令 1 MOVC A ,@ A+PC ;((A)+(PC))A • 例10 设(A)=30H,执行指令: 地址 指令 1000H MOVC A , @ A+PC 结果:将程序存贮器中1031H单元内容送入A。 这条指令以PC作为基寄存器,A的内容作为无符号数和PC内容(下一条指令的起始地址)相加后得到一个16位的地址,由该地址指出的程序存贮器单元内容送到累加器A。 这条指令以PC作为基寄存器,当前的PC值是由该查表指令的存贮地址确定的,而变址寄存器A的内容为0~255,所以(A)和(PC)相加所得到的地址只能在该查表指令以下256个单元的地址之内,因此所查的表格只能存放在该查表指令以下256个单元内,表格的大小也受到这个限制。
例11 ORG 8000H MOV A,#30H MOVC A , @ A+PC … ORG 8030H DB 41H,42H,43H,44H,45H DB 46H,47H,48H,49H,4AH … • 上面的查表指令执行后,将8003H+30H=8033H所对应的程序存贮器中的常数44H送A。
2 MOVC A , @A+ DPTR ;((A)+(DPTR)) 这条指令以DPTR作为基寄存器,A的内容作为无符号数和DPTR的内容相加得到一个16位的地址,由该地址指出的程序存贮器单元的内容送到累加器A。 • 例12 设(DPTR)= 8100H,(A)=40H,执行指令: MOVC A , @ A+DPTR 结果:将程序存贮器中8140H单元中内容送入累加器A。 这条查表指令的执行结果只和数据指针DPTR及累加器A的内容有关,与该指令存放的地址无关,因此表格大小和位置可在64K字节程序存贮器中任意安排,只要在查表之前对DPTR和A赋值,就使一个表格可被各个程序块公用。
七、 累加器A与外部数据存贮器传送指令(4条) MOVX A,@DPTR ; ((DPTR))A MOVX A,@ Ri ; ((Ri))A i=0,1 MOVX @ DPTR ,A ; (A)( DPTR) MOVX @ Ri , A ; (A)(Ri) i=0,1 1.第1,3两条指令以DPTR作为外部RAM的16位地址指针,寻址范围为(0000H~0FFFFH)64KB空间; 2.第2,4两条指令以R0或R1作为低8位地址指针,由P0口送出,寻址范围为(0000H~00FFH)256B空间(P2口仍可作通用I/O口)。 • 这组指令的功能是累加器A和外部扩展的RAM/IO口之间的数据传送指令。由于外部RAM/IO口是统一编址的,共占一个64K字节的空间,所以指令本身看不出是对RAM还是对I/O口操作,而是由硬件的地址分配确定的。
八、堆栈操作指令 如前所述,在MCS-51内部RAM中可以设定一个后进先出(LIFO)的堆栈,在特殊功能寄存器中有一个堆栈指针SP,它指出栈顶的位置,在指令系统中有两条用于数据传送的堆栈操作指令。
1. 进栈指令 PUSH direct ;(SP)+1 SP ,(direct) SP 这条指令的功能是首先将堆栈指针SP加1,然后把直接地址指出的内容传送到堆栈指针SP寻址的内部RAM单元中。 例6 设(SP)=60H,(ACC)=30H,(B)=70H,执行下述指令: PUSH ACC ;(SP) +1,61H SP, (ACC)61H PUSH B ;(SP) +1,62H SP, (B)62H 结果:(61H)=30H,(62H)=70H,(SP)=62H • 进栈指令用于保护CPU现场。
2. 退栈指令 POP direct • 例7 设(SP)=62H,(62H)=70H,(61H)=30H,执行下述指令: POP DPH ;((SP)) DPH,(SP)-1 SP POP DPL ;((SP))DPL,(SP)-1 SP 结果:(DPTR)=7030H,(SP)= 60H 这条指令的功能是把堆栈指针SP寻址的内部RAM单元内容送入直接地址指出的字节单元中,堆栈指针SP减1。 • 退栈指令用于恢复CPU现场。
九、字节交换指令(5条) XCH A,Rn ;(A)(Rn) XCH A,direct :(A)(direct) XCH A,@Ri :(A)((Ri)) 这组指令的功能是将累加器A的内容和源操作数内容相互交换。源操作数有寄存器寻址,直接寻址和寄存器间接寻址等寻址方式。 • 例8 设(A)=80H,(R7)=08H,执行指令: XCH A,R7 ;(A) (R7) 结果:(A)=08H,(R7)=80H
半字节交换指令 XCHD A,@Ri ;(A)0~3((Ri) ) 0~3 这条指令将A的低4位和R0或R1指出的RAM单元低4位相互交换,各自的高4位不变。 • 例9 设(A)=15H,(R0)=30H,(30H)=34H,执行指令: XCHD A,@R0 ; 结果:(A)=14H,(30H)=35H
算术运算指令 MCS-51的算术运算指令有加、减、乘、除法指令,增量和减量指令;第一操作数一般为A;一般影响标志位CY、AC、OV和P。共24条指令。
一、加法指令 1. 不带进位的加法指令(4条) • ADD A,Rn ;(A)+(Rn)A • ADD A,direct ;(A)+(direct)A • ADD A,@Ri ;(A)+((Ri))A • ADD A,#data ;(A)+#dataA 这组加法指令的功能是把所指出的第二操作数和累加器A的内容相加,其结果放在累加器A中。 如果位7有进位输出,则置“1”进位CY;否则清“0”CY。如果位3有进位输出,置“1”辅助进位AC;否则清“0”AC。如果位6有进位输出而位7没有或者位7有进位输出而位6没有,则置位溢出标志OV;否则清“0”OV。第二操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等寻址方式。
例13 设(A)=53H,(R0)=0FCH,执行指令: ADD A, R0 01010011 + 11111100 (1) 01001111 结果:(A)=4FH,CY=1,AC=0,OV=0,P=1 例14 设(A)=85H,(R0)=20H,(20H)=0AFH,执行指令: ADD A,@ R0 10000101 + 10101111 (1) 00110100 结果:(A)=34H,CY=1,AC=1,OV=1,P=1
二、带进位加法指令(4条) ADDC A,Rn ;(A)+(Rn)+CYA ADDC A,direct ;(A)+(direct) +CY A ADDC A,@Ri ;(A)+((Ri)) +CY A ADDC A,#data ;(A)+ #data +CY A • 此指令影响程序状态字PSW的CY、AC、OV、P位 例15 设(A)=85H,(20H)=0FFH,CY=1,执行指令: ADDC A,20H 10000101 11111111 + 1 (1)10000101 结果: 和(A)=85H,CY=1,AC=1,OV=0,P=1
三、增量指令(5条) INC A ;(A)+1 A INC Rn ;(Rn)+1 Rn INC direct ;(direct)+1 direct INC @Ri ;((Ri))+1 (Ri) INC DPTR ;(DPTR)+1 DPTR 例16 设(A)=0FFH,(R3)=0FH,(30H)=0F0H,(R0)=40H, (40H)=00H,执行指令: INC A ;(A)+1 A INC R3 ;(R3)+1 R3 INC 30H ;(30H)+1 30H INC @R0 ;((R0))+1 (R0) 结果:(A)=00H,(R3)=10H,(30H)=0F1H,(40H)=01H PSW状态不改变。 • 这组增量指令的功能是把所指出的操作数加1,若原来为0FFH将溢出为00H,除对A操作影响P外,此类指令不影响标志位。操作数有寄存器寻址、直接寻址和寄存器间接寻址方式。
四、十进制调整指令(1条) DA A • 这条指令对累加器A中由上一条加法指令(加数和被加数均为压缩的BCD码)所获得的8位结果进行调整,使它调整为压缩BCD码的数; • 调整方法: 若(A)0~3>9或AC=1,则(A) +06H(A); 若(A)4~7>9或CY=1,则(A) +60H(A); 对标志的影响:若结果(A)>99H,则CY=1;不影响OV。 例17 设(A)=56H,(R5)=67H,执行指令: ADD A,R5 DA A 结果:(A)=23H,CY=1
例186位十进制加法程序 完成功能:(32H)(31H)(30H)+(42H)(41H)(40H) 52H51H50H,假设32H,31H,30H,42H,41H,40H中的数均为2位BCD码,程序如下:
MOV A,30H ;(30H)+(40H) ACC ADD A,40H DA A ;对(A)十进制调整后50H MOV 50H,A MOV A ,31H ;(31H)+(41H)+CY A ADDC A,41H DA A ;对A十进制调整后51H MOV 51H,A MOV A,32H ; (32H)+(42H)+CY ACC ADDC A,42H DA A ;对A十进制调整后52H MOV 52H,A
减法指令 • 一、带进位减法指令 • SUBB A,Rn SUBB A,direct SUBB A,@Ri SUBB A,#data • 这组带进位减法指令从累加器A中减去第二操作数和进位标志,结果放在累加器A中。 • 影响CY、AC、OV、P • 第二操作数允许有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等寻址方式。 • 例19 设(A)= 0C9H,(R2)= 54H,CY=1,执行指令 SUBB A,R2 11001001 01010100 - 1 01110100 结果:(A)=74H,CY=0,AC=0,OV=1,P=0
二、减1指令(4条) DEC A DEC Rn DEC direct DEC @Ri • 这组指令的功能是将指定的操作数减1。若原来为00H,减1后下溢为0FFH,不影响标志(除(A)减1影响P外)。 • 例20 设(A)=0FH,(R7)=19H,(30H)=00H, (R1)=40H,(40H)=0FFH,执行指令: DEC A ;(A)-1 A DEC R7 ;(R7)-1 R7 DEC 30H ;(30H)-1 30H DEC @R1 ;((R1))-1 (R1) 结果: (A)=0EH,(R7)=18H,(30H)=0FFH, (40H)=0FEH,P=1 不影响其它标志。
乘法指令 MUL AB • 这条指令的功能是把累加器A和寄存器B中的8位无符号整数相乘,其16位积的低位字节放在累加器A中,高位字节放在B中。如果积大于255(0FFH),则置位溢出标志OV;否则清“0”OV。进位标志CY总是清“0” • 例21 设(A)=50H,(B)=0A0H。执行指令: MUL AB 结果:(B)=32H,(A)=00H,即积为3200H。
除法指令 DIV AB • 这条指令的功能是把累加器A中的8位无符号整数除以寄存器B中的8位无符号整数,所得商的整数部分存放在累加器A中,余数放在寄存器B中。 • 如果原来B中的内容为0,即除数为0,则结果A和B中内容不定,并置位溢出标志OV。在任何情况下,都清“0”CY • 例22 设(A)=0FBH,(B)=12H,执行指令: DIV AB 结果:(A)=0DH,(B)=11H,CY=0,OV=0
逻辑运算指令 累加器A的逻辑操作指令 一、CLR A 这条指令的功能是将累加器ACC清“0”,不影响CY、AC、OV等标志。只影响P。 二、CPL A 这条指令的功能是将累加器ACC的每一位逻辑取反,原来为1的位变0,原来为0的位变为1。不影响CY、AC、OV等标志。 • 例23 设(A)=10101010B,执行指令: CPL A 结果:(A)=01010101B