810 likes | 890 Views
第三章 MCS-51 指令系统 Instruction Set. §3.1 概述. 7 种寻址方式, 111 条指令. 单字节指令: 49 条 双字节指令: 45 条 三字节指令: 17 条. 字节数. 单周期指令: 64 条 双周期指令: 45 条 四周期指令: 2 条. 运算速度. 数据传送类: 28 条 算术运算类: 24 条 逻辑运算类: 25 条 控制转移类: 17 条 位操作类: 17 条. 功能. 指令的格式及标识. 格式. 标号:操作码助记符 [目的操作数],[源操作数];注释. 指令的涵义和对象都很明确.
E N D
第三章MCS-51指令系统 Instruction Set §3.1 概述 7种寻址方式,111条指令 单字节指令:49条 双字节指令:45条 三字节指令:17条 字节数 单周期指令:64条 双周期指令:45条 四周期指令: 2 条 运算速度
数据传送类:28条 算术运算类:24条 逻辑运算类:25条 控制转移类:17条 位操作类: 17条 功能
指令的格式及标识 格式 标号:操作码助记符 [目的操作数],[源操作数];注释 指令的涵义和对象都很明确 单字节指令 用同一字节中的几位数表示操作数或操作数所在的位置 操作码(一个字节) 双字节指令 操作数或操作数地址(一个字节) 操作码(一个字节) 三字节指令 操作数(两个字节) 操作码 立即数 立即数 操作码 立即数 地 址 三字节指令的四种情况 操作码 立即数 地 址 操作码 地 址 地 址
常用符号 Rn:工作寄存器中的寄存器Rn、R1…R7之一, Ri:工作寄存器中的寄存器R0或R1 #data:8位立即数 #data16:16位立即数 direct:片内RAM或SFR的地址(8位) @:间接寻址寄存器 Bit:片内RAM或SFR的位地址 addr11:11位目的地址 addr16:16位目的地址
rel: 补码形式的8位地址偏移量。 偏移范围为-128~127 /:位操作指令中,该位求反后参与操作,不影 响该位 X:片内RAM的直接地址或寄存器 (X):相应地址单元中的内容 →:箭头左边的内容送入箭头右边的单元内
§3.2 寻址方式 3.2.1 立即寻址 Immediate Addressing 操作数存在程序存储器中 操作数就包含在指令代码中,在操作码之后,称为立即数,用“#”表示。 MCS-51 如:MOV P1, #80H MOV R7, #0F5H MOV DPTR,#1245H 8086/8088 MOV AL,80H MOV AL,0F5H MOV BX,1245H
3.2.2 直接寻址 Direct Addressing 直接使用数所在单元的地址找到了操作数,所以称 这种方法为直接寻址。 操作数在SFR、内部RAM、位地址空间。 如: MOV A,00H MOV C,60H MOV A,0F0H 8086/8088CPU MOV AL,[2000H]
3.2.3 寄存器寻址 Register Addressing 对选定的工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR中的数进行操作。 例:MOV A,R0;将R0工作寄存器中的数据送到累加器A中去。 MOV AL,BL (8086CPU的寄存器寻址方式) 提一个问题:我们知道,工作寄存器就是内存单元的一部分,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOV A,00H 和 MOV A,R0不就没什么区别了吗?
的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个机器周期,而第二条则只需要1个机器周期,第一条指令变成最终的目标码要两个字节(E5H 00H),而第二条则只要一个字节(E8H)就可以了。
3.2.4 寄存器间接寻址 Register Indirect Addressing • 把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。 • R0,R1----8位地址,片内低128字节或片外 • DPTR----16位,片外64KB • MCS-51 • 如: MOV A,@R0 • MOVX A,@R0 • MOVX A,@DPTR 操作数在片内RAM中 • 8086/8088CPU • MOV AL,[BX] • MOV AX,[SI] 操作数在片外RAM中 操作数在片外RAM中
3.2.5 变址寻址(基址+变址) Base-Register-plus-Index-Register-Indirect Addressing • 以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两者内容相加,结果作为操作数的地址。 • 常用于查表操作。 • MCS-51 • MOVC A, @A+DPTR ;(A+DPTR) →A • MOVC A, @A+PC ; PC+1 →PC,(A+PC)→A 操作数在程序存储器中 • 8086/8088CPU • MOV AL,[BX+SI] • MOV AX,[BP+DI]
程序存储区 A DPH 20 E0 2040H 93 DPL 00 2041H … …… ALU 20E0H 47 如:MOVC A,@A+DPTR 设DPTR=2000H,A=E0H 47 指令代码 20E0H
程序存储区 A E0 2040H 83 2041H … …… ALU 2120H 47 2121H 45 如:MOVC A,@A+PC 设A=E0H 指令代码 45 当前PC 2121H
3.2.6 相对寻址 改变PC Relative Addressing 将PC中的当前内容与指令第二字节给出的数相加,结 果作为跳转指令的转移地址(转移目的地址)。 PC中的当前内容称为基地址(本指令后的字节地址) 指令第二字节给出的数据称为偏移量,1字节带符号数. 常用于跳转指令。 如: JC 23H 若C=0,不跳转; C=1,跳转.
程序存储区 1000H 40 1001H 23 1002H 30 …… ALU 1024H 47 1025H 45 如:JC 23 指令代码 1002H 23H 当前PC 1025H
3.2.7 位寻址 Bit Addressing 对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。 如: SETB 3DH; 将27H.5位置1 CLR C ;Cy位清0 8086/8088CPU 无此寻址方式 操作数在片内RAM位地址区或SFR某些位中
§3.3 数据传送类指令(29条) Data Transfer Instruction • MCS-51 助记符: 8086/8088 • 助记符: • MOV、MOVX、MOVC MOV • XCH、XCHD、SWAP XCHG • PUSH、POP PUSH、POP • 源操作数寻址方式(5种): 立即寻址、直接寻址、寄存器寻址、 寄存器间接寻址、变址寻址。 • 目的操作数寻址方式(3种): 直接寻址、寄存器寻址、寄存器间接寻址 • 除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响 • 标志位。
3.3.1 以累加器为目的操作数的指令(4条) MOV A,Rn;(Rn)→A MOV A,direct;(direct)→A MOV A,@Ri;((Ri))→A MOV A,#data ;#data→A 将源操作数指定内容送到A中。 3.3.2 以寄存器Rn为目的操作数的指令 (3条) MOV Rn,A ;(A)→ Rn MOV Rn,direct ;(direct)→ Rn MOV Rn,#data ; #data→Rn 这组指令功能是把源操作数指定的内容送入当前工作寄存器,源操作数不变。
3.3.3 以直接地址为目的操作数的指令(5条) MOV direct,A MOV direct,Rn MOV direct1,direct2 MOV direct,@Ri MOV direct,#data 这组指令功能是把源操作数指定的内容送入由直接地址指出的片内存储单元。 例:MOV 20H,A MOV 20H,R1 MOV 20H,30H MOV 20H,@R1 MOV 0A0H,#34H MOV P2,#34H
3.3.4 以间接地址为目的操作数的指令(3条) MOV @Ri,A;(A)→((Ri)) MOV @Ri,direct;(direct)→((Ri)) MOV @Ri,#data; #data→((Ri)) 功能:把源操作数指定的内容送入以R0或R1为地址 指针的片内存储单元中。 例: MOV @R0,A MOV @R1,20H MOV @R0,#34H
3.3.5 十六位数的传递指令(1条) MOV DPTR,#data16; 8051是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。 例:MOV DPTR,#1234H 执行完了之后DPH中的值为12H,DPL中的值为34H。 如果我们分别向DPH,DPL送数,则结果也一样。 如下面两条指令: MOV DPH,#35H MOV DPL,#12H。 则就相当于执行了 MOV DPTR,#3512H。
3.3.6 累加器A与片外RAM之间的数据传递类指令(4条) MOVX A,@Ri MOVX @Ri,A MOVX A,@DPTR MOVX @DPTR,A 说明: 1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有 需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部 RAM中的数据也必需通过A读入。 在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。 比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。
2.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。 3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。 例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。 MOV DPTR,#0100H MOVX A,@DPTR MOV DPTR,#0200H MOVX @DPTR,A
3.3.7 读程序存储器指令(查表指令 2条) MOVC A,@A+DPTR MOVC A,@A+PC 本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格 说明:查找到的结果被放在A中,因此,本条指令执行前后,A 中的值不一定相同。 例:有一个数在R0中,要求用查表的方法确定它的平方值(此 数的取值范围是0-5) MOV DPTR,#100H MOV A,R0 MOVC A,@A+DPTR . … ORG 0100H DB 0,1,4,9,16,25 如果R0中的值为2,则最终地址为100H+2为102H,到102H单元中找到的是4。
3.3.8 堆栈操作(2条) PUSH direct ;SPSP+1,(SP)(direct) POP direct ; (direct) (SP), SPSP-1 第一条为压入指令,就是将direct中的内容送入堆栈中,第二条为弹出指令,就是将堆栈中的内容送回到direct中。例: MOV SP,#5FH MOV A,#100 MOV B,#20 PUSH ACC PUSH B 则执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSH B时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后, 61H单元中的值变为20。
3.3.9 字节交换指令(5条) XCH A,Rn;(A)←→(Rn) XCH A, direct ;(A)←→(direct) XCH A, @Ri;(A)←→((Ri)) XCHD A, @Ri ;A.3~A.0←→(Ri).3~(Ri).0 SWAP A;A.3~A.0←→A.7~A.4 例: 已知A中的内容为34H MOV R6, #29H XCH A, R6 SWAP A XCH A, R6 XCHD A, @R0 ;R6=29H ;A=29H,R6=34H ;A=92H ;A=34H,R6=92H ;A=36H,(R0)=54H (设原来R0 ;指向的单元的内容为56H)
课堂练习 1.设:内部RAM中,(40H)=50H,(41H)=60H,(50H)=30H, (51H)=70H,执行下列片段后: ;R0=50H ;A=30H ;R0=51H ;(51H)=30H ;R0=40H ;A=50H ;(40H)=51H ;A=51H • MOV R0,40H • MOV A,@R0 • INC R0 • MOV @R0,A b. MOV R0,#40H MOV A,@R0 INC @R0 MOV A,@R0 (40H)= H (50H)= H A= H (41H)= H (51H)= H R0= H
DPH DPL 45H 34H 23H 12H R7 R1 R0 XX XX XX XX XX XX XX XX XX XX XX XX XX 30 34 XX XX 23 XX XX XX XX 30 34 34 12 23 67 12 34 34 30 34 34 12 23 67 12 34 34 30 67 34 12 12 2.给出每条指令执行后的结果 ;(23H)=30H ;(12H)=34H ;R0=23H MOV 23H,#30H MOV 12H,#34H MOV R0,#23H MOV R7,12H MOV R1,#12H MOV A,@R0 MOV 34H,@R1 MOV 45H,34H MOV DPTR,#6712H MOV 12H,DPH MOV R0,DPL MOV A,@R0 ;R7=34H ;R1=12H ;A=30H ;(34H)=34H ;(45H)=34H ;DPTR=6712H ;(12H)=67H ;R0=12H ;A=67H 内部RAM
§3.4 算术运算类指令(24条) Arithmetic Operations 主要对8位无符号数;也可用于带符号数运算。 包括:加、减、乘、除、加1、减1运算指令 影响PSW有关位。
3.4.1加法指令 1.不带进位的加法指令(4条) ADD A,#data ; A+data→A ADD A,direct ; A+(direct )→A ADD A,Rn ; A+Rn→A ADD A,@Ri ; A+(Ri)→A 用途:将A中的值与源操作数所指内容相加,最终 结果存在A中。
例1:ADD A,#47H ADD A,34H ADD A,R7 ADD A,@R0 例2: MOV A,#0AEH ; ADD A,#81H ; 则执行完本条指令后,A中的值为2FH; C=1,AC=0,OV=1,P=1。 对无符号数:结果为12FH; 带符号数运算:OV=1,有错。
2.带进位的加法指令(4条) ADDC A,Rn ; A+Rn+CY→A ADDC A,direct ; A+(direct )+CY→A ADDC A,@Ri ; A+(Ri)+CY→A ADDC A,#data ; A+data+CY→A 用途:将A中的值和其后面的值以及进位位C中的值相加, 最终结果存在A,常用于多字节数运算中。 说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0~255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到0~65535。
例: 1067H+30A0H 1067H 0001 0000 0110 0111 30A0H 0011 0000 1010 0000 4107H 0100 0001 0000 0111 先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。 然后再做10H + 30H + CY,结果是41H,所以最终的结果是4107H。
设:1067H存在R1R0中, 30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。 MOV A,R0 ADD A,R2 ;R0+R2→A和CY MOV R4,A MOV A,R1 ADDC A,R3 ;R1+R3+CY→A和CY MOV R5,A
设:1067H存在R1R0中, 3020H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。 又例: 1067H+3020H 1067H 0001 0000 0110 0111 3020H 0011 0000 0010 0000 4087H 0100 0000 1000 0111 先做67H+20H=87H,没有超过0FFH,因此最终保存在A中的是87H,而PSW中的CY=0。 然后再做10H + 30H + CY,结果是40H,所以最终的结果是4087H。
3. 加1指令(5条) INC A ;A+1→A,影响P标志 INC Rn ;Rn+1→Rn INC direct ;(direct)+1→(direct) INC @Ri ;(Rn)+1→(Rn) INC DPTR ;DPTR+1→DPTR 功能很简单,就是将后面目标中的值加1。 例:A=12H,R0=33H,(21H)=32H, (34H)=22H,DPTR=1234H。 连续执行下面的指令: INC A INC R0 INC 21H INC @R0 INC DPTR ; A=13H ; R0=34H ;(21H)=33H ;(34H)=23H ; DPTR=1235H
4. 十进制调整指令(1条) DA A 在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用来对BCD码加法运算结果进行自动修正。 例:A=0001 0101BCD(代表十进制数15) ADD A,#8 ; A=1DH,按二进制规律加 DA A ; A=23H,按十进制规律加
3.4. 减法指令(8条) 1. 带借位的减法指令(4条) SUBB A,Rn ; A-Rn-CY→A SUBB A,direct ; A-(direct )-CY→A SUBB A,@Ri ; A-(Ri)-CY→A SUBB A,#data ; A-data-CY→A 将A中的值减去源操作数所指内容以及进位位C中的 值,最终结果存在A中。 如: SUBB A,R2 设: A=C9H,R2=55H,CY=1, 执行指令之后,A中的值为73H。
说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。 对带符号数,要注意OV标志。OV=1,出错。 2. 减1指令(4条) DEC A ;A-1→A,影响P标志 DEC Rn ;Rn-1→Rn DEC direct ;(direct)-1→(direct) DEC @Ri ;(Rn)-1→(Rn) 与加1指令类似。
3.4.3 乘法指令(1条) MUL AB ;A×B→BA 此指令的功能是将A和B中的两个8位无符号数相乘, 两数相乘结果一般比较大,因此最终结果用1个16位 数来表达,其中高8位放在B中,低8位放在A中。 在乘积大于FFH时,0V置1,否则OV为0;而CY总是0。 例: A=4EH,B=5DH,执行指令MUL AB后, 乘积是1C56H,所以在B中放的是1CH,而A中放的 则是56H。 1 0 OV= P=
3.4.4 除法指令(1条) DIV AB ;A÷B的商→A,余数→B 此指令的功能是将A中的8位无符号数除B中的8位 无符号数(A/B)。除了以后,商放在A中,余数放 在B中。 CY和OV都是0。如果在做除法前B中的值是00H,也 就是除数为0,那么0V=1。 如:A=11H,B=04H,执行指令DIV AB后, 结果:A=04H,B=1。 CY= OV= P= 0 0 1
练习 • 试编写1234H-0FA3H的程序段,将结果高8位存入 • 51H, 低8位存入50H单元。 • MOV A,#34H • SUBB A,#0A3H • MOV 50H,A • MOV A,#12H • SUBB A,#0FH • MOV 51H,A CLR C
§3.5 逻辑运算类指令(24条) Logic Operations • 主要用于对2个操作数按位进行逻辑操作,结果送到 • A或直接寻址单元。 • 主要操作 与、或、异或、移位、取反、清零等。 • 对标志位的影响 除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。
影响P标志 3.5.1 逻辑或指令(6条) OR Logic Instruction ORL A,Rn ;A∨Rn→A ORL A,direct ;A∨(direct)→A ORL A,@Ri ;A∨(Ri)→A ORL A,#data ;A∨data→A ORL direct,A ;(direct)∨A→(direct) ORL direct,#data ;(direct)∨data→(direct) 后两条指令,若直接地址为I/O端口,则为“读-改写”操作。 例:71H和56H相或: 01110001 (71H) ∨) 01010110 (56H) 01110111 即77H
例: MOV A,#45H MOV R1,#25H MOV 25H,#39H ORL A,@R1 ORL 25H,#13H ORL 25H,A ;A=45H ;R1=25H ;(25H)=39H ;45H∨39H = 7DH→A ;39H∨13H = 3BH →(25H) ; 3BH∨7DH =7FH →(25H)
影响P标志 3.5.2 逻辑与指令 (6条) ANd Logic Instruction ANL A,Rn ;A∧Rn→A ANL A,direct ;A∧(direct)→A ANL A,@Ri ;A∧(Ri)→A ANL A,#data ;A∧data→A ANL direct,A ;(direct)∧A→(direct) ANL direct,#data ;(direct)∧data→(direct) 后两条指令,若直接地址为I/O端口,则为“读-改写”操作。(P55例3-9) 例:71H和56H相与: 01110001 (71H) ∧)01010110 (56H) 01010000 即50H
例: MOV A,#45H MOV R1,#25H MOV 25H,#79H ANL A,@R1 ANL 25H,#15H ANL 25H,A ;A=45H ;R1=25H ;(25H)=79H ;45H∧79H = 41H→A ; 79H∧15H = 11H →(25H) ; 11H∧41H = 01H →(25H)
影响P标志 3.5.3 逻辑异或指令(6条) eXclusive-oR Logic Instruction XRL A,Rn ;A ⊕Rn→A XRL A,direct ;A ⊕(direct)→A XRL A,@Ri ;A ⊕(Ri)→A XRL A,#data ;A ⊕ data→A XRL direct,A ;(direct) ⊕A→(direct) XRL direct,#data ;(direct) ⊕data→(direct) 后两条指令,若直接地址为I/O端口,则为“读-改写”操作。 例:71H和56H相异或: 01110001 (71H) ⊕) 01010110 (56H) 00100111 即27H