370 likes | 652 Views
第三章 MCS-51 指令系统. 3.1 指令系统概述 3.2 寻址方式 3.3 指令系统. 第三章节 MCS-51 指令系统. MCS-51 系列单片机指令基本情况. 51 系列单片机 指令集含有 111 条 指令 每条指令在程序存储器 ROM 中占据一定 空间 ,以字节为单位 按指令 所占字节数 分类: 单字节 (49 条 ); 双字节 (46 条 );3 字节 (16 条 ) 每条指令在执行时要花去一定的 时间 ,以机器周期为单位 按指令 执行时间 分类: 单周期 (64 条 ); 双周期 (45 条 );4 周期 (2 条 )
E N D
第三章MCS-51指令系统 3.1 指令系统概述 3.2 寻址方式 3.3 指令系统
第三章节MCS-51指令系统 MCS-51系列单片机指令基本情况 • 51系列单片机指令集含有111条指令 • 每条指令在程序存储器ROM中占据一定空间,以字节为单位 • 按指令所占字节数分类: • 单字节(49条);双字节(46条);3字节(16条) • 每条指令在执行时要花去一定的时间,以机器周期为单位 • 按指令执行时间分类: • 单周期(64条);双周期(45条);4周期(2条) • 按指令的功能分类,可分为5大类:数据传送类(29条);算术运算类(24条) 逻辑运算及移位类(24);控制转移类(17条) 位操作类(17条)
ASM-51指令格式 51系列单片机采用ASM-51指令格式,格式如下: [标号:]操作码[目的操作数][,源操作数][;注释] 其中包含: 方括符[ ]表示可选项 标号代表指令所在地址,1-8个字母/数字,“:”结尾 操作码就是指令功能助记符,指令实体 目的操作数 源操作数 注释,以“;”开头
第一节 MCS-51系列单片机寻址方式 寻址方式:计算机指令中操作数(按地址)获取的方式 MCS-51系列单片机提供了7种寻址方式,如果一条指令中包含多个操作数,就可能用到一种以上的寻址方式 1、立即寻址 2、直接寻址 3、寄存器寻址 4、寄存器间接寻址 5、变址寻址 6、相对寻址 7、位寻址
1、立即寻址(一) 在指令中直接给出操作数的寻址方式称为立即寻址。这个操作数叫立即数,如指令: MOV A, #3AH 该指令是将立即数3AH送累加器,由于MCS-51单片机的片内存储器是8位存储器,因此立即数一般为8位二进制数。在MCS-51的指令系统中,用#来识别立即数。 程序存储器 PC 74H 操作码 PC+1 3AH 立即数 A 3AH
01H 01H 23H 23H 1、立即寻址(二) 在有的指令中,也会用到16位立即数,如: MOV DPTR, #0123H 该指令是将16位立即数0123H送数据指针DPTR(用于对16位地址的存储器寻址),DPTR由两个特殊功能寄存器DPH和DPL组成,在后面的寻址方式中会使用到DPTR。 SFR 程序存储器 PC 90H 操作码 PC+1 DPH 高位立即数 PC+2 DPL 低位立即数
2、直接寻址 在指令中直接给出操作数地址的寻址方式称为直接寻址,直接寻址何以寻址特殊功能寄存器、内部RAM(128字节)和位地址,如: MOV A, 70H; A←(70H) 该指令是将RAM单元70H(地址)的内容送累加器。 内部RAM 程序存储器 70H XX PC 74H 操作码 70H PC+1 直接地址 A XX
3、寄存器寻址 在指令的操作码中包含了某一工作寄存器的地址(Rn:R0—R7),而操作数则存放在该寄存器中,如: MOV A, R5; A←(R5) 该指令是将R5的内容送累加器。 内部RAM 程序存储器 R7 PC 1101 101 操作码 R6 R5 XX A XX
4、寄存器间接寻址 在指令的操作码中包含了某一工作寄存器的地址(可用作地址指针的工作寄存器是@Ri:R0、R1),而操作数地址则存放在该寄存器中,如: MOV A, @R1; A←((R1)) 该指令是将R1的内容送作为地址,将该地址所对应的RAM单元的内容送累加器。 内部RAM 程序存储器 XX 68H PC 111001 1 操作码 A XX R1 68H
DPH DPL ALU 5、变址寻址 将PC或DPTR的值作为基地址,将Acc的值作为变址地址,二者向加得到的值作为操作数的地址,如: MOV A, @A+DPTR; A←((A)+(DPTR)) 这种寻址方式一般用于常数表,DPTR的内容为表头地址,Acc的内容就是数据在表中的位置。 SFR 程序存储器 1EH XX A PC 10010011 操作码 02H 02F1H F1H 030FH XX 02F1H +1EH=030FH
6、相对寻址(一) 相对寻址以PC当前值(PC当前值是执行完指令后的值,也就是当前指令的PC值+指令所占的字节数)作为基地址,与指令中给定的偏移量rel相加,所得的结果作为程序的转移地址,指令中的偏移量rel是一个用补码表示的8位带符号数。相对寻址用于相对转移指令中,如: JZ 30H; 当A=0时,PC←PC+2+rel 当A≠0时,PC←PC+2 //程序顺序执行 该指令以累加器Acc的值是否为0为转移条件,如果为Acc的值0则转移,如果Acc的值不为0则程序顺序执行。程序的执行过程见相对寻址(二)。 在MCS-51的指令系统中,相对转移指令多为2字节指令,因此目的地址一般是PC+2+rel;如果是3字节指令,目的地址是PC+3+rel。偏移量rel是一个8位带符号数,因此程序转移的范围在PC当前值的+127—-128之间。
PC 0123H ALU 6、相对寻址(二) 程序存储器 PC 0100H 60H 操作码 PC rel=30H PC+1 0101H 偏移量 30H 0102H 0132H PC+2 0102H XX 0102H +30H= 0132H
7、位寻址 MCS-51系列单片机中有专用的位运算指令,可以对位寻址区的每一个位进行数据传送、逻辑运算等操作,如: MOV C, 07H; C←(07H) 该指令属于位操作指令,作用是将位地址为70H的位单元(字节地址20H单元的D7位)传送到位累加器C中。 程序存储器 PC A2H 操作码 PC+1 07H 07 00 X 20H SFR PSW X C
MCS-51指令集(包含5大类功能) 1、数据传送类指令: (29条) 2、算术运算类指令: (24条) 3、逻辑运算及移位类指令: (24条) 4、控制转移类指令: (17条) 5、位操作指令: (17条)
1、数据传送类指令(一) 片内数据存储器间传送: (MOV—16条) 片外数据存储器送累加器: (MOVX—4条) 程序存储器送累加器: (MOVC—2条) 数据交换: (XCH,XCHD,SWAP—5条) 数据交换: (PUSH,POP—2条)
1、数据传送类指令(二) 片内数据存储器间传送: (MOV—16条) MOV类指令带有两个操作数,前一个是目的地址,后一个是源操作数。作用是将源操作数送目的地址,如:MOV A, 30H; A←(70H) Acc Direct直接寻址 @Ri间接寻址 Rn寄存器寻址 #data立即数
1、数据传送类指令(三) 片外数据存储器数据送累加器:(MOVX—4条) MOVX类指令可以在累加器和@Ri或@DPTR(@Ri为8位地址;@DPTR为16位地址)所指向的外部数据存储器间相互传送数据, 具体指令有: MOVX A, @Ri; A←((Ri)) MOVX A, @DPTR; A←((DPTR)) MOVX @Ri, A; ((Ri)) ← A MOVX @DPTR, A; ((DPTR)) ←A
1、数据传送类指令(四) 程序存储器数据送累加器:(MOVC—2条) MOVX类指令采用变址寻址方式进行寻址。该类指令通常称为查表指令,送入累加器Acc的数据是事先写入的表格数据,通常使用伪指令DB或DW预先定义在程序存储器中, 具体指令有: MOVC A, A+@DPTR; MOVX A, A+@PC;
1、数据传送类指令(五) 数据交换指令:(5条) XCH A,direct (字节互换) XCH A,@Ri (字节互换) XCH A,Rn (字节互换) XCHD A,@Ri 累加器Acc的低4位与((Ri))的低4位互换,各自的高4位不变 SWAP A 累加器Acc的高低4位互换
1、数据传送类指令(六) 堆栈操作指令:(2条) • PUSH 压栈指令 • POP 弹栈指令 • 堆栈由特殊功能寄存器SP(堆栈指针)进行管理 • 理论上堆栈在存储器中可以放在任意位置,但为了不和工作寄存器冲突,一般将堆栈放在存储器靠后的位置 • 堆栈指针SP总是指向栈顶(自动变化,见第二章相关内容) • PUSH和POP一般是成对使用的
2、算术运算类指令(一) 算术运算类指令共有6种24条 加法运算: (ADD—4条) 带进位加法运算: (ADDC—4条) 带借位减法运算: (SUBB—4条) 加1/减1操作: (INC,DEC—9条) 单字节乘/除法运算: (MUL,DIV—2条) 十进制调整: (DA A—1条)
2、算术运算类指令(二) • 加法运算:(ADD—4条) • 带进位加法运算: (ADDC—4条) • 带借位减法运算: (SUBB—4条) 所有的加法(ADD)、带进位加法(ADDC)、带借位减法(SUBB)运算都是以 Acc为一个加数或被减数,最终结果也存进 Acc 加法(ADD)、带进位加法(ADDC) 以及带借位减法(SUBB)运算中,如果产生了进位或借位,将自动对PSW中的Cy标志位置“1” 带进位加法(ADDC):(A) ←(A)+(Cy)+(第二操作数) 带借位减法(SUBB):(A)←(A)-(Cy)-(第二操作数)
2、算术运算类指令(三) 加1/减1操作: (INC,DEC—9条) INC, DEC与用加/减法指令做加1/减1 操作不同之处在于INC、DEC不影响标志位。 单字节乘/除运算: (MUL,DIV—2条) 两个单字节数的乘/除法运算只在A与B之间进行。 MUL AB: (A)与(B)相乘, 积为16位数, (A) ←积的高8位; (B) ←积的低8位 DIV AB: (A)除以(B),结果用2字节表示, (A) ←商的整数部分;(B) ←余数
2、算术运算类指令(四) 十进制调整: (DA A—1条) 用于两个BCD码之间的相加,这条指令只能跟在ADD 或 ADDC 之后 BCD码是指“用二进制表达的十进制数”。如: 十进制数20可以用二进制数00010100B表示; 也可以用十六进制数14H表示; 还可以用BCD码 00100000B 或 20H 表示。 4个二进制位就可以表示一位BCD码: 0000~1001 可表示十进制数(BCD数) 0~9; 8个二进制位就可以表示两位压缩的BCD码: 00000000~10011001 表示 00~99。
2、算术运算类指令(五) DA A指令的执行过程 若(A)3~0>9或(AC)=1则(A)3~0←(A)3~0+6; 若(A)7~4>9或(CY)=1则(A)7~4←(A)7~4+6; 如:两个十进制数“65”与“58”相加,根据常识,显然其和应当为“123”。 MOV A, #65H ADD A, #58H DA A 结果:(A) = 23H (Cy) = 1 6 5 0110 0101 5 8 0101 1000 +) +) 6 6 0110 0110 18 19 0010 0011 1 2 3
3、逻辑运算及移位类指令(一) 该类指令共有5种24条 逻辑与运算: (ANL—6条) 逻辑或运算: (ORL—6条) 逻辑异或运算: (XRL—6条) 累加器清零/取反: (CLR,CPL—2条) 累加器移位操作: (RL,RLC,RR,RRC—4条)
3、逻辑运算及移位类指令(二) 逻辑与(ANL),逻辑或(ORL),逻辑异或(XRL): 累加器清零/取反操作 (CLR,CPL—2条) CLR A —对累加器清零1 Byte 1 Tm CPL A ——对累加器按位取非1 Byte 1 Tm
3、逻辑运算及移位类指令(三) 逻辑运算指令在程序中的应用(下面的例子认为Acc的内容为9AH) 逻辑与ANL运算用于对某些位进行清0或者保留: 例: ANL A, #0FH; 则(A) = 0AH 逻辑或ORL运算用于对某些位进行置1或者保留: 例: ORL A, #0FH; 则(A) = 9FH 逻辑异或XRL运算用于对某些位进行取反或者保留: 例: XRL A, #0FH; 则(A) = 95H (A) 1001 1010 #0FH 0000 1111 95H 1001 0101
3、逻辑运算及移位类指令(四) 累加器移位操作: (RL,RLC,RR,RRC—4条) RL A循环右移 累加器Acc RR A循环左移 累加器Acc RLC A带进位循环右移 累加器Acc Cy RRC A带进位循环左移 Cy 累加器Acc
4、控制转移类指令(一) 控制转移类指令用于对程序的执行顺序进行控制(即改变PC指针的当前值),该类指令共有4种17条 无条件转移:(LJMP,AJMP,SJMP,JMP—4条) 条件转移(判断跳转):(JZ,JNZ,CJNE,DJNZ—8条) 子程序调用及返回:(LCALL,ACALL,RET,RETI—4条) 空操作:(NOP—1条) “消耗”一个机器周期
4、控制转移类指令(二) 无条件转移:(LJMP,AJMP,SJMP,JMP—4条) LJMP addr16长跳转指令 ——可在64K范围内跳转 AJMP addr11 绝对跳转指令 ——可在指令所在的2K范围内跳转 SJMP rel 相对跳转指令 ——可在当前PC-128与+127范围内跳转 JMP @A+DPTR 间接长跳转指令 ——可在以DPTR为基址 + A为偏移量 之和所指向的64K程序范围内跳转
4、控制转移类指令(三) 条件转移:(JZ,JNZ,CJNE,DJNZ—8条) JZ rel JNZ rel ——根据Acc的内容是否为0决定是否跳转 DJNZ direct, rel DJNZ Rn, rel ——将direct(或Rn)里的内容减 1,结果不 等于0就跳转;等于0则不跳转继续执行 程序
4、控制转移类指令(四) 条件转移: CJNE A,#data, rel CJNE A,direct,rel CJNE @Ri,#data, rel CJNE Rn,#data, rel ——将A(或@Ri,或Rn)与#data(或direct)相比 较,其值不相等就跳转;相等则不跳转,继 续执行程序
4、控制转移类指令(五) 子程序调用及返回:(LCALL,ACALL,RET,RETI—4条) LCALL addr16 子程序长调用指令 ——可在64K范围内调用子程序 ACALL addr11 子程序绝对调用指令 ——可在指令所在的2K范围内调用子程序 RET子程序返回指令 ——子程序结束并返回调用的下一条指令 RETI中断服务子程序返回指令 ——中断结束/返回被打断处的下一条指令
5、位操作指令(一) 该类指令共有17条 位传送: (MOV—2条) 位清零/置位:(CLR,SETB—4条) 位逻辑与/或/非运算:(ANL,ORL,CPL—6条) 位条件转移:(JC,JNC,JB,JNB,JBC—5条)
5、位操作指令(二) 位传送指令(2条): MOV C, bit—— (C)(bit) MOV bit, C—— (bit)(C) 注: bit表示位地址 位清零/置位指令(4条): CLR bit(或C) —— (bit或 C)“0” SETB bit(或C) —— (bit或 C)“1” 位逻辑与/或/非指令(6条): ANL C,bit(或/bit) ORL C,bit(或/bit) CPL bit (或 C) 注: “/bit”表示对bit位先取反然后再参加运算
5、位操作指令(三) 判位条件转移指令(5条): JC rel —— (Cy)=“1”就跳转;否则不跳转 JNC rel —— (Cy)≠“1”就跳转;否则不跳转 JB bit,rel —— (bit)=“1”就跳转;否则不跳转 JNB bit,rel —— (bit)≠“1”就跳转;否则不跳转 JBC bit,rel —— (bit)=“1”就先将其清零再跳转; 否则不动此位也不跳转。