版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,第三章 指令系统,3.1 程序设计语言简介,计算机根据人的意图执行操作的命令称为指令。计算机所能执行的全部指令组成了指令系统。计算机完成一项工作,必须按顺序执行各项操作,即一步一步地执行一条条指令。这些按人的要求编排的指令序列称为程序,编排程序的过程就是程序设计。,按使用层次,可以划分为:,高级语言,汇编语言,3.2指令格式和寻址方式,3.2.1指令方式 1.指令格式 8051汇编语言指令格式如下: 标号:操作码助记符目的操作数,源操作数;注释 (1)标号是用户设定的符号,表示该指令所在的地址。标号是以字母开始的18个字母或数字串组成,以冒号“:”结尾; (2)操作码助记符是由英文缩写组成的
2、字符串,它限定了指令的操作功能; (3)目的操作数项指出操作结果存放单元的地址(目的地址); (4)源操作数项指出了操作数据来源的地址(源地址); (5)注释是用户为该条令或程序段功能的说明,便于阅读。,2.伪指令 伪指令不参与和影响程序的执行,也不在计算机中运行。 (1)ORG 2000H。 ORG后面16进制数指出程序在储存器中的起始地址。 (2)DB 8,11,21。 表示将DB后面几项数值存入指定的连续单元中去。每项数值占一个字 节单元。常用于定义数据常数表。 (3)DW 3246,1784。 表示将DW后面的几项数据存入指定的连续单元中去。每项数据占用2个字节单元。常用于定义地址表。
3、 (4)END。 END是程序结束的标志。,3.2.2寻址方式,1.立即寻址 这种寻址方式的指令多数是双字节的。第一个字节是操作码,第二个字节是立即操作数,用“#”号表示。 如:MOV A ,#0FH 其功能将立即数0FH送入累加器A,常数0FH是指令代码中的一部分。,2.直接寻址 指令直接给出操作数所在存储单元的地址。直接寻址是访问专用寄存器的唯一方式。它多数是双字节指令,第一字节是操作码,第二字节是存储单元的直接地址。 如:MOV A ,0FH 其功能是把片内RAM 0FH地址单元中的内容送累加器A,即实际操作数在0FH地址单元中。 对于专用寄存器,在用助记符指令中,可直接用符号代替地址。
4、如下面两条指令是等价的 MOV A ,P3 和 MOV A ,B0H,3.寄存器寻址 指令指出所选定的寄存器组R0R7中某一个寄存器的内容为操作数,这时指令的操作码包含了所选用的寄存器,其低三位的8种组合对应于R0R7,即同一类指令有8种操作码。 MOV A ,R0 其功能是把所选用的寄存器组中R0的内容送入累加器A。 此外,ACC、B、DPTR、AB和C(位累加器)都可作寄存器寻址。 要注意在寄存器寻址指令前,通过PSW中RS1和RS0设定当前工作寄存器组。,4.寄存器间接寻址 这种寻址方式是用于访问片内数据存储器或片外数据存储器。当访问片内RAM低128字节或片外RAM低256字节时,可采
5、用当前工作寄存器组中的R0或R1作间接地址寄存器(用表示)。 例:MOV A,R0和MOVX A,R0 前一条指令是将R0指定的片内RAM单元中内容送到A中;后一条指令则将R0指定的片外RAM单元的内容送到A中。 访问片外数据存储器时,还可用数据指针DPTR作间址寄存器。DPTR是16位寄存器,故它可对整个64KB片外数据存储器空间寻址。 如:MOVX A,DPTR 其功能把DPTR指定的片外RAM中的内容送到A中。,5.变址寻址(基址寄存器+变址寄存器间接寻址) 这种寻址方式以DPTR或PC为基址寄存器、累加器A为变址寄存器,两者内容相加形成的16位程序存储器地址作为操作数的地址。这种方式用
6、于查表操作。 如:MOVC A,A+DPTR 其功能是把DPTR和A的内容相加所得到的程序存储器地址单元中的内容送A。,6.相对寻址 以本指令的下一条指令第一个字节地址PC为基址,转移到-128+127范围内某一程序存储器地址。由指令给出补码形式的偏移字节数。 7.位寻址 在8051片内数据存储器中,一些可寻址的位构成了位处理机。这些位是片内RAM20H2FH字节单元,对应的位地址是00H7FH;专用寄存器SFR中某些单元也可位寻址,其位地址是80HFFH中的一部分。,3.2.3寻址空间及符号注释,1.寻址空间,操作数寻址方式和有关空间,2.寻址方式中常用符号注释,Rn,当前选中的工作寄存器组
7、R0R7(n=07)。它在片内数据存储器中的地址由PSW中RS1、RS0确定,可以是00H07H(第0组)、08H0FH(第1组)、10H17H(第2组)或18H1FH(第3组);,Ri,当前选中的工作寄存器组中可作为地址指针的两个工作寄存器R0、R1(i=0或1)。它在片内数据存储器中的地址由RS1、RS0确定,分别为01H、02H,08H、09H,10H、11H和18H、19H;,# data,8位立即数,即包含在指令中的8位常数;,# data16,16位立即数,即包含在指令中的16位常数;,direct,8位片内RAM单元(包括SFR)的直接地址;,addr11,11位目的地址。用于A
8、CALL和AJMP指令中,目的地址必须在与下条指令地址相同的2K字节程序存储器地址空间之内;,addr16,16位目的地址。用于LCALL和LJMP指令中,目的地址在64K字节程序存储器地址空间;,rel,补码形式的8位地址偏移量。对应下条指令第一字节地址为基值,地址偏移量在-128+127范围中;,bit,片内RAM或专用寄存器的直接寻址位地址;,间接寻址方式中,表示间址寄存器的符号;,/,位操作指令中,表示对该位先取反再参与操作,但不影响该位原值;,(),中的内容;,(),由指出的地址单元中的内容;,指令操作流程,将箭头左边的内容送入箭头右边的单元内。,3.3指令系统,8051指令系统由1
9、11条指令组成。如按字节数分类,单字节指令占49条,双字节指令占46条,三字节指令占16条;若按运算速度分类,单周期指令占64条,双周期指令占4条,四周期指令占2条。由此可见,8051指令系统在用存储空间方面和运行时间方面,效率都比较高。,3.3.1数据传送指令组,1.以累加器为目的操作数的指令(4条) MOV A, Rn ;(Rn) (A) MOV A, direct ;(direct) (A) MOV A, Ri ;(Ri) (A) MOV A, #data ;data (A) 这组指令的功能是将源操作数所指定的内容送入累加器A。源操作数可以采用寄存器寻址、直接寻址、寄存器间接寻址和立即寻
10、址四种方式。,例:(A)=8CH,(R0)=10H,(R5)=47H,(10H)=D8H,(70H)=F2H,执行指令: MOV A, R5 ;(R5) (A),(A)=47H MOV A, 70H ;(70H) (A),(A)=F2H MOV A, R0 ;(R0) (A),(A)=D8H MOV A, #78H ;78H (A),(A)=78H,2.以寄存器Rn为目的操作数的指令(3条) MOV Rn, A ;(A) (Rn) MOV Rn, direct ;(direct) (Rn) MOV Rn, #data ;data (Rn) 这组指令的功能是把源操作数所指定的内容送到当前工作寄存
11、器组R0R7中某个寄存器中。源操作数有寄存器寻址、直接寻址和立即寻址三种方式。,例:(A)=78H,(R5)=47H,(70H)=F2H,执行指令: MOV R5, A ;(A) (R5),(R5)=78H MOV R5, 70H ;(70H) (R5),(R5)=F2H MOV R5, #A3H ; A3H (R5),(R5)=A3H 注意:在8051指令系统中没有“MOV Rn, Rn”传送指令。,3. 以直接地址为目的操作数的指令(5条) MOV direct, A ;(A) (direct) MOV direct, Rn ;(Rn) (direct) MOV direct, direc
12、t ;(direct) (direct) MOV direct, Ri ;(Ri) (direct) MOV direct, #data ;data (direct) 这组指令的功能是把源操作数所指定的内容送入由直接地址direct所指出的片内存储单元中。源操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等方式。,例: MOV A0H, A ;(A) (P2),A0H为P2的地址 MOV P2, R2 ;(R2) (P2),A0H也可写成P2 MOV E0H, 78H ;(78H) (A),E0H为A的地址 MOV D0H, R1 ;(R1) (PSW),D0H为 PSW的地址 MOV
13、02H, #89H ;89H (R2),R2的地址是02H 注意“MOV direct,direct”指令在译成机器码时,源地址存前,目的地址在后。如“MOV A0H,90H”机器码为8590A0。,4.以间接地址为目的操作数的指令(3条) MOV Ri, A ;(A) (Ri) MOV Ri, direct ;(direct) (Ri) MOV Ri, #data ;data (Ri) 这组指令的功能是把源操作数所指定的内容送入以R0或R1为地址指针的片内存储单元中。源操作数有寄存器寻址、直接寻址和立即寻址三种方式。,5.十六位数据传送指令(1条) MOV DPTR, #data16 ;da
14、taH (DPH), dataL (DPL) 这是唯一16位立即数传送指令。其功能是把16位常数送入DPTR。 如:“MOV DPTR,#1234H”,其机器码是901234,执行结果为,6查表指令(2条) MOVC A,A+PC ;(PC)+1 (PC), (A)+(PC) (A) MOVC A,A+DPTR ;(A)+(DPTR) (A) CPU读取前条单字节指令后,PC的内容自动加1。其功能将新的PC的内容与累加器A内8位无符号数相加形成地址,取出该地址单元中的内容送累加器A。 后条指令以DPTR为基址寄存器进行查表。使用前,我们先给出DPTR赋予任何地址,所以查表范围可达整个程序存储器
15、64K字节空间。但此前,若DPTR已赋值待用,装入新值之前必须保存原值,可用栈操作指令“PUSH”保存。,例如,在程序存储器中,数据表格为: 1010H:02H 1011H:04H 1012H:06H 1013H:08H 执行程序: 1000H:MOV A,#0DH ;0DH (A) 1002H:MOVC A,A+PC ;(0DH+1003H) (A) 1003H:MOV R0,A ;(A) (R0) 结果:(A)=02H,(R0)=02H,(PC)=1004H,又如,在程序存储器中,数据表格为: 7010H:02H 7011H:04H 7012H:06H 7013H:08H 执行程序: 10
16、00H:MOV A,#10H ;10H (A) 1002H:PUSH DPH ;DPH入栈 保护DPTR 1004H:PUSH DPL ;DPL入栈 1006H:MOV DPTR,#7000H ;7000H (DPTR) 1009H:MOVC A,A+DPTR ;(10H+7000H) (A) 100AH:POP DPL ;DPH出栈 恢复DPTR,先进后出 100CH:POP DPH ;DPL出栈 结果:(A)=02H,(PC)=100EH,(DPTR)=原值,7.累加器A与片外数据存储器传送指令(4条) MOVX A,DPTR ;(DPTR) (A) MOVX DPTR ,A ;(A) (
17、DPTR) MOVX A,Ri ;(Ri) (A) MOVX Ri ,A ;(A) (Ri) 前两条指令以DPTR为片外数据存储器16位地址指针,寻址范围达64KB。其功能是将DPTR所指定的片外数据存储器与累加器A之间传送数据。 后两条指令是用R0或R1作低8位地址指针,由P0口送出,寻址范围是256字节。此时,P2口仍可用作通用I/O口。这两条指令完成以R0或R1为地址指针的片外数据存储器与累加器A之间传送数据。,例:(R0)=12H,(R1)=34H,片外RAM (34H)=56H,执行指令: MOVX A,R1 MOVX R0 ,A 结果将数据56H送入累加器A及片外RAM12H单元中
18、。,8.栈操作指令(两条) PUSH direct ;(SP)+1 (SP), (direct) (SP) POP direct ;(SP) (direct), (SP)-1 (SP) 前一条指令是入栈指令。其功能是先将栈指针SP的内容加1,然后将直接寻址单元的内容存入SP所指出的单元中。从其操作过程可见,8051的堆栈是向上生成。 后一条指令是出栈指令。其功能是先将栈指针SP所指出的单元的内容送入直接寻址单元中,然后将SP的内容减1。,例如,(SP)=30H,(DPTR)=0123H,执行下列操作: PUSH DPL ;(SP)+1 (SP),(DPL) (31H) PUSH DPH ;(S
19、P)+1 (SP),(DPH) (32H) 结果:(31H)=23H,(32H)=01H,(SP)=32H 再继续执行下列操作: POP A ;(32H) (A),(SP)-1 (SP) POP B ;(31H) (B),(SP)-1 (SP) 结果:(A)=01H,(B)=23H,(SP)=30H,9.字节交换指令(4条) XCH A,Rn ;(A) (Rn) XCH A,direct ;(A) (direct) XCH A,Ri ;(A) (Ri) XCHD A,Ri ;(A.3A.0) (Ri.3Ri.0) 这组指令的前三条指令功能是将累加器A与源操作数所指出的数据相互交换,其操作也可表
20、示为:,这组指令的最后一条为低半字节交换指令。该指令将累加器A的低4位与R0或R1所指出的片内RAM单元的低4位数据相互交换,各自的高4位不变,其操作表示为: 如:(R0)=20H,(A)=3FH,(20H)=75H,执行指令 XCHD A,R0 结果:(R0)=20H,(A)=35H,(20H)=7FH,3.3.2算术运算指令组,1.加法指令(4条) ADD A,Rn ;(A) +(Rn) (A) ADD A,direct ;(A) +(direct) (A) ADD A,Ri ;(A) +( Ri) (A) ADD A,#data ;(A) + data (A) 这组指令的功能是把源操作数
21、所指出的内容加到累加器A,其结果存在A中。源操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址四种方法。,在加法运算中,如果位7有进位,则进位CY置1,否则清0;如果位3有进位,则半进位AC置1,否则清零。两个带符号数相加,还要考虑溢出OV,若OV为1,表示和数溢出。 例:(A)=C2H,(R0)=A9H,执行指令 ADD A,R0 结果:(A)=6BH,(AC)=0,(CY)=1,(OV)=1,2.带进位加法指令(4条) ADDC A,Rn ;(A) +(Rn)+(CY) (A) ADDC A,direct ;(A) +(direct) +(CY) (A) ADDC A,Ri ;(A)
22、+( Ri) +(CY) (A) ADDC A,#data ;(A) + data+(CY) (A) 这组指令的功能是同时把源操作数所指出的内容和进位标志CY都加到累加器A,结果存放在A中,其余和上面ADD指令相同。,下面列举一段双字节加法程序,其功能为:(R0 R1)+(R2 R3) (R4 R5)。其中R0用于存放16位数的高字节,R1用于存放低字节,其余类推。 MOV A,R1 ;取低位 ADD A,R3 ;低位相加 MOV R5,A ;存放低位 MOV A,R0 ;取高位 ADDC A,R2 ;高位带低位进位相加 MOV R4,A ;存放高位,3.带借位减法指令(4条) SUBB A,
23、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中减去源操作数所指出的数及进位CY的值,差值保留在累加器A中。,如:(A)=C9H,(R2)=54H,(CY)=1,执行指令 SUBB A,R2 结果:(A)=74H,(R2)=54H,(CY)=0,(OV)=1,4.乘法指令(1条) MUL AB ;(A)*(B) (BA) 这条指令的功能是把累加器A和寄存器B中两个无符号
24、8位数相乘,所得16位积低字节存放在A中、高字节存放在B中。若乘积大于FFH,则OV置1,否则清零。CY总是被清零。 例如:(A)=4EH,(B)=5DH,执行指令 MUL AB 结果:(B)=1CH,(A)=56H,表示积(BA)=1C56H,5.除法指令(1条) DIV AB ;(A)/(B)商 (A), (A)/(B)的余数 (B) 这条指令的功能是进行A除以B的运算,A和B的内容均为8位无符号整数。指令操作后,整数商存于A中,余数存于B中,CY和OV均被清零。若原(B)=00H,则结果无法确定,用(OV)=1表示,而CY仍为0。 例如,(A)=BFH,(B)=32H,执行指令 DIV
25、AB 结果:(A)=03H,(B)=29H,(CY)=0,(OV)=0,6.加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) 这组指令的功能是将操作数所指定的单元内容加1,其操作不影响PSW。若原单元内容为FFH,加1后溢出为00H,也不会影响PSW标志。,另外,“INC A”和“ADD A,#01H”这两条指令都将累加器A的内容加1,但后条指令对标志位有影响,并且多占一个字节。 第三条指令,若直接
26、地址是I/O端口,则进行“读-改-写”操作。如指令“INC P1”。 最后一条指令是8051指令系统中唯一的一条16位加1指令。这条指令在加1过程中,若低8位有进位,可直接向高8位进位,也不影响标志。 例如,(DPTR)=03FFH,执行指令 INC DPTR 结果:(DPTR)=0400H,7.减1指令(4条) DEC A ;(A)-1 (A) DEC Rn ;(Rn)-1 (Rn) DEC direct ;(direct)-1 ( direct) DEC Ri ;(Ri)-1 (Ri) 这组指令的功能是将操作数所指定的单元内容减1,其操作不影响标志。若原单元内容为00H,减1后为FFH,也
27、不会影响标志。其他情况与加1指令类同。,8.十进制调整指令(1条) DA A 这条指令跟在ADD或ADDC指令后,将相加后存放在累加器中的结果进行十进制调整,完成十进制加法运算功能。 例如,(A)=84H,(R3)=67H,若执行“ADD A,R3”指令后,其结果为EBH,且CY=0;若执行 ADD A,R3 DA A 其结果为51H,且(CY)=1,表示84D+67D=151D。运算前累加器A和寄存器R3与运算后的累加器A内都存放两位BCD数,称为压缩BCD数。,3.3.3逻辑运算指令组,1.简单操作指令(2条) CLR A ;0 (A) CPL A ; (A) 前条指令的功能是将累加器A的
28、内容清零;后条指令的功能是将累加器A的内容按位逻辑取反。 如:(A)=00110101B=35H,执行指令 CPL A 结果:(A)=11001010B=CAH,2.移位指令(4条),前两条指令的功能分别是将累加器A的内容循环左移或右移1位;后两条指令的功能分别是将累加器A的内容带进位CY一起循环左移或右移一位。 此外,我们通常用“RLC A”指令将累加器A的内容作乘2运算。 例如:无符号8位二进制数(A)=10111101B=BDH,(CY)=0,将(A)乘2,执行指令 RLC A 结果:(A)=01111010B=7AH,(CY)=1,而17AH正是BDH的2倍。,3.累加器半字节交换指令
29、(1条) 这条指令的功能是将累加器A的高低两半字节交换。 如:(A)=FAH,执行指令 SWAP A 结果:(A)=AFH,4.逻辑与指令(6 条) 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) 这组指令中前4条指令是将累加器A的内容和操作数所指出的内容按位逻辑与,结果存放在A中。
30、后两条指令是将直接地址单元中的内容和操作数所指出单元的内容按位逻辑与,结果存入直接地址单元中。若直接地址正好是I/O端口,则为“读-改-写”操作。,例:(A)=C8H,(R1)=A9H,执行指令 ANL A,R1 结果:(A)=88H,(R1)=A9H,5.逻辑或指令(6条) 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, #d
31、ata ; (direct)data ( direct) 这组指令的功能是将两个指定的操作数按位逻辑或,前四条指令的操作结果存放在累加器A中,后两条指令的操作结果存放在直接地址单元中(也具有“读-改-写”操作)。,例如:根据累加器A中位40状态,利用逻辑与、或指令,控制P1端口位40状态。 程序设计如下: ANL A,#00011111B ;屏蔽A.7A.5 ANL P1,#11100000B ;清P1口的低5位 ORL P1,A ;按A.4A.0设置P1.4P1.0 分析以上程序段,将位口线先输出0状态,再按A.4A.0内容置位,有可能发生一个机器周期短暂的“闪烁”,这在控制中是不允许的。改
32、用下段程序可消除这种“闪烁”现象: ANL A,#00011111B ;屏蔽A.7A.5 ORL P1,A ;使P1.4P1.0按A.4A.0值置位 ORL A,#11100000B ANL P1,A ;使P1.4P1.0按A.4A.0值置位,6.逻辑异或指令(6条) 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 ; (dir
33、ect)data ( direct) 这组指令的功能是将两个指定的操作数按位异或,前四条指令的操作结果存放在累加器A中,后两条指令的操作结果存放在直接地址单元中(同样有“读-改-写”操作)。,如:(70H)=C8H,执行指令 XRL 70H,#49H 结果:(70H)=61H,3.3.4控制转移指令组,1.无条件转移指令(3条) LJMP addr16 ;addr16 (PC) AJMP addr11 ; (PC)+2 (PC), addr11 (PC.10PC.0) SJMP rel ; (PC)+2+rel (PC) 第一条指令是长转移指令。 第二条指令是短转移。 第三条指令是相对转移指令
34、。,例如,在(PC)=0100H地址单元有条“SJMP rel”指令,若rel=55H(正数),则转移到0102H+0055H=0157H地址上;若rel=F6H(负数)则转移到0102H+FFF6H=00F8H地址上。 在用汇编语言编写程序时,rel可以是一个转移目的地址的标号,由汇编程序在汇编过程中自动计算偏移字节数,并且填入指令代码中;在手工汇编时,我们可用“转移目的地址减转移指令所在源地址,再减转移指令字节数”得到偏移字节数rel。,2.条件转移指令(8条) JZ rel ;(A)=0:(PC)+2+rel (PC) ;(A)0:(PC)+2 (PC) JNZ rel ;(A)0:(P
35、C)+2+rel (PC) ;(A)=0:(PC)+2 (PC) ;(A)= direct:(PC)+3 (PC),0 (C) CJNE A,direct, rel ;(A)direct:(PC)+3+rel (PC),0 (C) ;(A)direct:(PC)+3+rel (PC),1 (C) ;(A)= data:(PC)+3 (PC),0 (C) CJNE A,# data, rel ;(A)data:(PC)+3+rel (PC),0 (C) ;(A)data:(PC)+3+rel (PC),1 (C),;(Rn)= data:(PC)+3 (PC),0 (C) CJNE Rn,# d
36、ata, rel ;(Rn)data:(PC)+3+rel (PC),0 (C) ;(Rn)data:(PC)+3+rel (PC),1 (C) ;(Ri)= data:(PC)+3 (PC),0 (C) CJNE Ri,# data, rel ;(Ri)data:(PC)+3+rel (PC),0 (C) ;(Ri)data:(PC)+3+rel (PC),1 (C) ;(Rn)0:(PC)+2+rel (PC) ;(Rn)=0:(PC)+2 (PC) ;(direct)0: (PC)+3+rel (PC) ;(direct)=0: (PC)+3 (PC),DJNZ Rn,rel ; (Rn
37、)-1 (Rn),DJNZ direct,rel ; (direct)-1 (direct),例:当P1口输入为58H时,程序进行下去,否则进入等待,直至P1口出现58H。程序为 MOV A,#58H WAIT:CJNE A,P1,WAIT 例: 从P1.0输出四个方波,程序如下: MOV R7,#08H ;预置方波数 PAUSE:CPL P1.0 ;一个机器周期 DJNZ R7,PAUSE ;两个机器周期 方波的脉宽为三个机器周期,由取反指令CPL切换电平。若P1.0初始为0,则执行上面程序后,P1.0输出的波形为:,3.间接转移指令(1条) JMP A+DPTR ;(A)+(DPTR) (
38、PC) 该指令的转移地址由数据指针DPTR的16位数和累加器A的8位数作无符号数相加形成,并直接送入PC。指令执行过程对DPTR、A和标志均无影响。这条指令可代替众多的判别跳转指令,具有散转功能(又称散转指令)。,例:根据累加器A中命令键键值,设计命令键操作程序入口跳转表: CLR C ;清进位 RLC A ;键值乘2 MOV DPTR,#JPTAB ;指向命令键跳转表首 JMP A+DPTR ;散转入命令键入口 JPTAB: AJMP CCS0 AJMP CCS1 AJMP CCS2 . . . 从程序中看出,当(A)=00H时,散转到CCS0;(A)=01H时,散转到CCS1;由于AJMP
39、是双字节指令,散转前A中键值应先乘2。,4.调用子程序及返回指令(4条) LCALL addr16 ;(PC)+3 (PC),(SP)+3 (SP), (PC.7.0) (SP),(SP)+1 (SP) , (PC.15.8) (SP),addr16 (PC) ACALL addr11 ;(PC)+2 (PC),(SP)+1 (SP), (PC.7.0) (SP),(SP)+1 (SP) , (PC.15.8) (SP),addr11 (PC.10.0) RET ;(SP) (PC.15.8),(SP)-1 (SP), (SP) (PC.7.0),(SP)-1 (SP) RETI ;(SP)
40、(PC.15.8),(SP)-1 (SP), (SP) (PC.7.0),(SP)-1 (SP),第一条指令是长调用指令(三字节)。执行时,先将PC加3,指向下条指令地址(即断口地址),然后将断口地址压入堆栈,最后指令中的16位子程序入口地址装入PC,程序转到执行子程序。 第二条指令是短调用指令(二字节),其保护断口地址过程同上,但PC只需加2。其转入子程序入口的过程类同“AJMP”指令。 第三条指令是子程序返回指令。执行时将堆栈内的断口地址弹出送入PC,使程序返回到原断口地址。 最后一条指令是中断返回指令,除具有“RET”指令的功能外,还将开放中断逻辑。,5.空操作指令(1条) NOP ;(
41、PC)+1 (PC) 这是一条单字节指令,除PC加1外,不影响其他寄存器和标志。“NOP”指令常用作产生一个机器周期的延迟。,3.3.5位操作指令组,1.位数据传送指令(2条) MOV C,bit ;(bit) (C) MOV bit,C ;(C) (bit) 前条指令的功能将直接位地址中的一位二进制数送入位累加器C中,不影响其他标志;后条指令将C的内容传送到指定位,在对断口操作时,先读入端口8位的全部内容,然后把C的内容传送到指定位,最后再把8位内容传送到端口的锁存器,所以也是“读-改-写”指令。,如:片内RAM (20H)=9FH=10011111B,执行指令 MOV C,07H ;(20
42、H).7 (C) 结果:(C)=1 又如:把P1.3状态传送到P1.6: MOV C,P1.3 MOV P1.6,C,2.位修正指令(6条) CLR C ;0 (C) CLR bit ;0 (bit) CPL C ; (C) CPL bit ; (bit) SETB C ;1 (C ) SETB bit ;1 (bit) 这类指令的功能分别是清除、取反、置位进位标志C或直接寻址位,执行结果不影响其他标志。当直接位地址为端口中某一位时,具有“读-改-写”功能。,3.位逻辑运算指令(4条) ANL C,bit ;(C) (bit) (C) ANL C,/ bit ;(C) (C) ORL C,bi
43、t ;(C) (bit) (C) ORL C,/ bit ;(C) (C) 这组指令的功能是把进位C的内容及直接位地址的内容逻辑与、或,操作结果再送回C中。斜杠“/”表示对该位取反后再参与运算,但不改变原来的数值。,例如,要求仅当(A.7)=1,(B.7)=1,(OV)=0同时有效,才将P1.0置1,否则为0。程序如下: MOV C,ACC.7 ANL C,B.7 ANL C,/OV MOV P1.0,C 结果:(P1.0)=(ACC.7)(B.7) ,但OV值不变。,4.判位转移指令(5条) JC rel ;(C)=1:(PC)+2+rel (PC) ;(C)=0:(PC)+2 (PC) J
44、NC rel ;(C)=0:(PC)+2+rel (PC) ;(C)=1:(PC)+2 (PC) JB bit ,rel ;(bit)=1:(PC)+3+rel (PC) ;(bit)=0:(PC)+3 (PC) JNB bit ,rel ;(bit)=0:(PC)+3+rel (PC) ;(bit)=1:(PC)+3 (PC) JBC bit ,rel ;(bit)=1:(PC)+3+rel (PC),0 ( bit) ;(bit)=0:(PC)+3 (PC),例3-3:比较片内RAM NUMB-1、NUMB-2中的两个无符号数的大小,大数存入单元M,小数存入单元N,若两数相等,则把片内RA
45、M的位7FH置1。程序如下: MOV A,NUMB-1 CJNE A,NUMB-2,BIG ;两数不等则转 SETB 7FH ;两数相等,置7FH RET BIG: JC LESS ;若C为“1”,则NUMB-1 MOV M,A MOV N,NUMB-2 RET LESS:MOV N,A MOV M,NUMB-2 RET,3.4程序设计,使用汇编语言编写程序过程大致上可分下述三步:,(1) 根据工作要求,确定计算方法,定出运算步骤和顺序,把运算过程画成框图;,(2) 确定数据、工作单元,分配存放单元;,(3) 按所采用的计算机指令系统,把确定的运算顺序,写成汇编语言程序。,3.4.1循环程序,
46、循环程序结构包括:,1.循环体,就是要求重复执行的程序段部分。可分为:循环工作部分和循环控制部分。循环控制部分每循环一次,检查结束条件,当满足条件时,就停止循环,往下继续执行其他程序。,2.循环 结束条件,在循环程序中,必须给出循环结束条件。常见的是计数循环,当循环了一定的次数后,就停止循环。在单片机中,一般用一个工作寄存器Rn作为计数器,给这个计数器赋初值作循环次数,每循环一次,令其减1,当计数器减为0时,就停止循环。,3.循环初态,用于循环过程的工作单元,在循环开始时应置初态,即分别赋一个初始值。循环初态一般分成两个部分,一个是循环工作初态,另一个是结束条件初态。例如工作寄存器设置计数初值
47、、累加器A清零、以及设置地址指针、长度等。它是循环程序中一个重要部分,不注意容易出错。,例3-4:8051系统P1口为数据读入口,为了读取稳定的值,要求连续256次取平均。 解:将R2R3作为连续256次累加16位工作寄存器,最后取平均值即除以256,相当于除以28。简便的方法是将R2R3 16位工作寄存器右移8位,读取R3值。更简单的方法是丢弃R3的读值,直接将R2中的数作为最终的平均值,其程序流程框图如图所示。 程序清单 AVR: MOV R2,#00H ;清16位中间寄存器 MOV R3,#00H MOV R4,#00H ;设累加次数为256D AVR1:MOV A,P1 ;输入读数 A
48、DD A,R3 ;加入中间寄存器低8位 JNC AVR2 ;无进位则暂存结果 INC R2 ;有进位则中间寄存器高8位增1 AVR2:MOV R3,A ;暂存低8位中间结果 DJNZ R4,AVR1 ;未完循环 RET,例3-5:发送字符串。设在片外RAM放有一个ASCII字符串,它的首地址在DPTR中,字符串以空字符“0”结尾。现要求用8031串行口把它发送出去。 解:在串行口已初始化的条件下,该功能可用框图实现。这是另一种常用循环结束条件,它是通过检查约定的结束标志(空字符0)来决定继续循环或中止循环的。采用结束标志的方法常用于循环次数为不定的情况。 程序清单: SOUT: MOVX A,
49、DPTR ;取发送的字符 JNZ SOUT1 ;判是否为结束标志0 RET ;是,返回 SOUT1:JNB TI,SOUT1 ;等待发送完前一帧字符 CLR TI ;完成,则清除发送中断标志 MOV SBUF,A ;将字符送入发送缓冲器继续发送 INC DPTR ;更新字符地址 SJMP SOUT ;继续重复,例3-6:设计51ms延时程序。 解:延时程序与MCS-51指令执行时间有很大的关系。在使用12MHz晶振时,一个机器周期为1s,执行一条“DJNZ”指令的时间为2s,用双重循环方法写出如下延时51ms的程序: 源程序 指令周期(M) 指令执行次数 DELAY: MOV R6,#64H
50、1 1 I1: MOV R7,#0FFH 1 100 1 I2: DJNZ R7,I2 2 100 255 DJNZ R6,I1 2 100 1 RET 2 1 延时时间计算:(设时钟f=12MHz) M=1us t=(11+1100+2100255+2100+21)M=51.3 ms,例3-7:将片内RAM 50H59H中的数据按从小到大的次序排列。 程序如下: QUE: CLR 00H ;清除交换标志位 MOV R3,#0AH ;十个数据循环次数 MOV R0,#50H ;数据存放区首址 MOV A,R0 ;取前数 L2: INC R0 MOV R2,A ;保存前数 SUBB A,R0 ;
51、前数减后数 MOV A,R2 ;恢复前数 JC L1 ;顺序则继续比较 SETB 00H ;逆序则建立标志位 XCH A,R0 ;前数与后数交换 DEC R0 XCH A,R0 INC R0 ;仍指向后数单元 L1: MOV A,R0 DJNZ R3,L2 ;依次重复比较 JB 00H,QUE ;交换后重新比较 RET,3.4.2查表程序,所谓查表,首先由操作要求建立一个表格,根据已知变量X,在表格中查找与变量相对应的值Y。 表格一般建立在ROM区,可用查表指令“MOVC”来访问。X的表示方法有两种,即规则变量和非规则变量。表格中数据存放的格式与X值的表示方法密切有关。,1.规则变量X 规则变
52、量X的值为0,1,2,n,对应表格中的Y值为Y0,Y1,Y3,Yn。Y值可以是一字节、二字节或三字节等,但Y0Yn必须具有相同的字节数。这样的表格具有规律,结构简单,便于编制查表程序。,例3-8:设计一个数据转换子程序,其功能将累加器A中BCD码数0009转换成对应的平方值(BCD码),结果仍在A中。 解:显然程序的入口和出口都在A中,表中所有的值都是单字节,并且表格长度仅为10个字节。程序如下: MOV DPTR,#SQR ;指向平方表首 MOVC A,A+DPTR ;查表得 (A)2 (A) RET SQR: DB 00H ;0的平方值 DB 01H ;1的平方值 DB 04H ;2的平方
53、值 DB 09H ;3的平方值 DB 16H ;4的平方值 DB 25H ;5的平方值 DB 36H ;6的平方值 DB 49H ;7的平方值 DB 64H ;8的平方值 DB 81H ;9的平方值,例3-9:某智能化仪器的键盘程序中,根据命令的键值(0,1,2,9),转换成相应的双字节16位命令操作入口地址,其键值与对应入口地址关系如下: 键值0 1 2 3 4 5 6 7 8 9 入口地址0123 0lD8 0200 02A8 034E 03DA 0468 04F6 0594 0610 解:在下面查表程序中,入口:键值在20H单元中,出口:地址在22H23H单元中。 MOV DPTR,#KEYTAB ;指向表首高8位 MOV A,20H ;取键值 RL A ;键值乘2作查表偏移量 MOV 20H,A ;暂存该偏移量 MOVC A,A+DPTR ;取高8位数据 MOV 22H,A ;暂存高8位数据 INC DPTR ;指向表首低8位 MOV A,20H ;取偏移量 MOVC A,A+DPTR ;取低8位数据 MOV 23H,A ;暂存低8位数据 RET KEYTAB:DB 01H ;“0”键入口
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 杜甫常见试题与对应答案
- 饮食习惯:5个可操作步骤
- 宁夏吴忠三中学2027届数学九年级第一学期期末综合测试模拟试题含解析
- 2027届浙江省杭州市西湖区杭州外国语学校数学八上期末复习检测试题含解析
- 2026年专业技术人员公需科目突发事件应急处理考模拟试题库(含答案)
- 2026年福建农业职业技术学院教师招聘考试模拟题及答案详解
- 2026年敦煌舞模拟题答案及答案详解
- 2026年pmp考试模拟题及答案详解
- 2026年中国微电机市场分析及投资战略研究预测可行性报告
- 2026年10月质量管理体系QMS审核员模拟题及答案详解
- 互联网护理服务培训
- 《电机与电气控制技术》电子教案
- 弱电设计规范强条
- 《铁路劳动安全》高职铁道类专业安全教育培训全套教学课件
- 物业月度工作总结及下月计划
- 诺贝尔生理学或医学奖史话(华中师范大学)知到智慧树章节答案
- 2024-2025学年湖南省长沙市长郡教育集团七年级(上)月考数学试卷(10月份)(含答案)
- 路基,桥梁,涵洞,隧道工程施工组织方案
- (高清版)DZT 0350-2020 矿产资源规划图示图例
- 2019版新人教版高中英语必修+选择性必修共7册词汇表汇总(带音标)
- 气管切开非机械通气病人气道护理课件
评论
0/150
提交评论