《3 80c51单片机的指系统(2).ppt》由会员分享,可在线阅读,更多相关《3 80c51单片机的指系统(2).ppt(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章 80C51单片机的指令系统(2)3.3.2 算术运算类指令2.减法指令减法指令 减法类指令共8条,分为2组,包括带借位的减法指令4条和减1指令4条。(1)带借位减法指令)带借位减法指令 助记符为SUBB,4条指令分别为:指令机器码格式操作SUBB A,Rn1001 1rrr (A)-(Rn)-CY ASUBB A,direct 1001 0101 (A)-(direct)-CY A directSUBB A,Ri1001 011i(A)-(Ri)-CY A3.3.2 算术运算类指令SUBB A,#data 1001 0100 (A)-#data-CY A#data 该组指令的功能是从累
2、加器A中减去源操作数所指定内容及进位位CY,结果(差)存放于A中。80C51指令系统中 不带借位的减法。如果需要,可以在执行SUBB指令前,用“CLR C”指令将CY位清0。带进位减法主要用在多字节减法计算中,当低字节向高字节产生借位时,CY置1,此时在高字节运算时就要用带借位减法指令。没有3.3.2 算术运算类指令例:计算两个16位数的差。被减数为9876H,低字节存放在32H单元,高字节存放在33H单元;减数为6789H,低字节存放在30H单元,高字节存放在31H单元。将结果的低字节和高字节分别放在34H和35H单元中。89H67H76H98H30H31H32H33H34H35H差的低字节
3、差的高字节3.3.2 算术运算类指令第一步:低字节相减,最第一步:低字节相减,最高位有借位,高位有借位,CY置置1。第二步:高字节相减第二步:高字节相减。由由于于被被减减数数的的高高字字节节被被低低字字节节借借走走一一个个1,故故高高字字节节要要减减掉掉1,由由于于有有借借位位时时CY置置1,故相当于减去,故相当于减去CY.9876H1001 1000 0111 01100110 0111 1000 10016789H 1110 11010011 0001(CY)1 0011 0000 1110 1101 3 0 E D 故借位减法都是用在高字节相减时,而低字节相减时为不带借位减法,需要先将C
4、Y位清0。3.3.2 算术运算类指令MOV A,32H ;将被减数的低字节送到累加器中CLR C ;低字节为不带借位减法,CY清0SUBB A,30H MOV 34H,A ;将低字节的计算结果送入 34H中 MOV A,33H ;将被减数的高字节送到累加器中SUBB A,31H ;带借位减法MOV 35H,A ;将高字节的计算结果送入 34H中 具体的程序:具体的程序:3.3.2 算术运算类指令带借位减法指令影响到PSW中的位:CY位:最高位(第7位)有借位时置1,无借位时清0。AC位:第3位有借位时置1,无借位时清0。CYP-OVRS0RS1F0ACP位:由于A中的数值发生变化,故P也有可能
5、改变。1111011101111111AC=13.3.2 算术运算类指令OV位:?对于单片机的算术运算类指令来说,加法和减法是可以进行带符号数的操作,其它的指令只能进行无符号数的操作。例:(-68H)-76H=?-68 76111010000111011001001我是符号位!我是符号位!AC=0110负数减正数,结果是正数?因为负数减正数,结果是正数?因为第第6位向第七位的符号位借位,位向第七位的符号位借位,OV=1用于带符号数的减法和加法,如果第6位向第7位(符号位)借位或者第七位发生借位,则OV置1,表明出现错误结果。在进行完带借位减法后,如果没有发生新的借位,硬件会自动将原先的借位CY
6、位清0。3.3.2 算术运算类指令 总而言之,在进行有符号数的加减法运算中,凡是导致第七位(符号位)发生变化的,结果都会发生错误,所以用OV=1来表示这种错误。在做加减法运算时,没有办法区分到底是无符号的数还是有符号的数,所以在做无符号数的加减法运算中,OV位有时也会发生变化,这时我们可以忽视OV。需要注意的是78988656例:9878H-5686HCY=1OV=1运算没有发生新的借运算没有发生新的借位,位,CY=0CY=0;OV=0OV=03.3.2 算术运算类指令(2)减)减1指令指令 助记符DEC,4条指令分别为:指令 机器码格式操作DEC Rn 0001 1rrr (Rn)-1 Rn
7、DEC direct 0001 0101 (direct)-1 direct directDEC Ri 0001 011i (Ri)-1 (Rn)DEC A 0001 0100 (A)-1 A 这组指令的功能是将操作数单元中所指定的内容减1,将结果仍存放在原单元中。3.3.2 算术运算类指令加1指令和减1指令的操作都不会影响到PSW。例:假设A=00HDEC AA=FFH,PSW各位保持不变SUBB A,#01HA=FFH,CY=1例:假设A=FFHINC AA=00H,PSW各位保持不变ADD A,#01HA=00H,CY=1 另外需要注意的是,当对并行I/O口执行减1指令时,是先读锁存器中
8、的值,减1以后再送回锁存器中,而不是针对引脚的操作。3.3.2 算术运算类指令3.乘法指令乘法指令乘法指令的助记符为MUL,只有1条指令。指令 机器码格式 操作MUL AB 1010 0100 (A)(B)A07B815 这条指令的功能就是将累加器A和寄存器B中两个8位无符号数相乘,所得的16位积的低8位字节放在A中,高8位字节放在B中。乘法指令不影响CY位,所以 。CY总是清零3.3.2 算术运算类指令乘法指令影响到OV位:OV=1,表明乘积大于8位,A已经放不下了,要把高字节放在B中;OV=0,表明乘积小于或等于8位,A可以完全放下,这时候B为0。例:(A)=4EH,(B)=5DH 则MU
9、L AB4E5D561CA放不下,放不下,OV=1 B A3.3.2 算术运算类指令4.除法指令除法指令除法指令的助记符为DIV,只有1条指令。指令 机器码格式 操作DIV AB 1000 0100 (A)(B)商 A余数 B 这条指令的功能是进行A除以B的运算,A和B中的内容均为8位无符号整数。所得的商存于A中,余数存于B中。除法指令不影响CY位,所以 。CY总是清零 除数B为0时,A中的结果不确定,OV置1,表示除法不能进行。3.3.3 逻辑运算类指令 逻辑运算类指令包括:与、或、异或、清除、求反、移位等操作。这类指令的操作数都是8位,共有25条指令。按参与运算的操作数的个数可分为:单操作
10、数逻辑运算和双操作数逻辑运算两类。1.单操作数逻辑运算指令 这类指令的操作对象都是 ,包括:清0、取反、循环左移、带进位循环左移、循环右移、带进位循环右移和半字节互换指令,共有7条。累加器A3.3.3 逻辑运算类指令(1)累加器清0指令指令 机器码格式 操作CLR A 1110 0100 0 A对累加器A进行清0。此操作不影响标志位。(2)累加器取反指令指令 机器码格式 操作CPL A 1111 0100 (A)A对累加器A的内容逐位取反后再放入A中。此操作不影响标志位。3.3.3 逻辑运算类指令(3)循环右移指令指令 机器码格式 操作RR A 0000 0011将累加器的内容逐位循环右移一位
11、,并且a0的内容移到a7,此操作不影响标志位。a7a6a5a4a3a2 a1a0(4)循环左移指令指令 机器码格式 操作RL A 0010 0011将累加器的内容逐位循环左移一位,并且a7的内容移到a0,此操作不影响标志位。a7a6a5a4a3a2 a1a03.3.3 逻辑运算类指令(5)带进位循环右移指令指令 机器码格式 操作RRC A 0001 0011将累加器A的内容和进位位一起循环右移一位,并且a0移入进位位CY,CY的内容移到a7。a7a6a5a4a3a2 a1a0(6)带进位循环左移指令指令 机器码格式 操作RLC A 0011 0011将累加器A的内容和进位位一起循环左移一位,并
12、且a7移入进位位CY,CY的内容移到a0。通常用RLC指令进行累加器A乘2操作。CYa7a6a5a4a3a2 a1a0CY3.3.3 逻辑运算类指令(7)累加器半字节交换指令指令 机器码格式 操作SWAP A 1100 0100 此指令的功能是将累加器A的低半字节(a3a0)内容与高半字节(a7a4)内容互换,此操作不影响标志位。a7a6a5a4a3a2 a1a03.3.3 逻辑运算类指令2.双操作数逻辑运算指令 双操作数逻辑运算指令中包含有两个操作数,共分:ANL(逻辑“与”)、ORL(逻辑“或”)及XOR(逻辑“异或”)三类操作,18条指令。第一操作数:A direct 第二操作数:A R
13、n direct#data Ri3.3.3 逻辑运算类指令 两个操作数的ANL、ORL及XOR对于8位是逐位进行的;两个操作数的逻辑运算结果存在第一操作数中;若是对并行口的操作,即为“读改写”;操作不影响标志位。双操作数逻辑运算指令特点:(1)逻辑“与”运算指令 这组指令的助记符为ANL,共有6条指令:ANL A,Rn;(A)(A)(Rn)ANL A,direct;(A)(A)(direct)ANL A,Ri;(A)(A)(Ri)ANL A,#data ;(A)(A)#data ANL direct,A;(direct)(direct)(A)ANL direct,#data;(direct)(
14、direct)#data 逻辑“与”运算指令用做清除。3.3.3 逻辑运算类指令(2)逻辑“或”运算指令 这组指令的助记符为ORL,共有6条指令:ORL A,Rn ;(A)(A)(Rn)ORL A,direct;(A)(A)(direct)ORL A,Ri ;(A)(A)(Ri)ORL A,#data ;(A)(A)#dataORL direct,A ;(direct)(direct)(A)ORL direct,#data;(direct)(direct)#data逻辑“或”运算指令用做置位。3.3.3 逻辑运算类指令(3)逻辑“异或”运算指令 这组指令的助记符为XRL,共有6条指令:XRL
15、A,Rn ;(A)(A)(Rn)XRL A,direct ;(A)(A)(direct)XRL A,Ri;(A)(A)(Ri)XRL A,#data ;(A)(A)#data XRL direct,A;(direct)(direct)(A)XRL direct,#data (direct)(direct)#data 3.3.3 逻辑运算类指令3.3.4控制转移类指令 计算机“智商”的高低取决于其转移指令的多少。控制转移指令共有17条,可分为:n无条件转移n调用和返回n条件转移n循环转移n空操作指令3.3.4控制转移类指令1 无条件转移指令:这类指令共有4条:SJMP rel AJMP addr
16、11 LJMP addr16 JMP A+DPTR 这类指令的功能是程序无条件地转移到各自指定的目标地址去执行,不同的指令形成的目标地址不同。3.3.4控制转移类指令(1)短转移(SJMP)指令:其目标地址是由PC(程序计数器)和指令的第二字节带符号的相对地址相加而成的。指令可转向指令前128 B或指令后127 B。例如:设(PC)=0101H,转入地址为标号RELADR所指的单元0123H,因此rel=0123H(0101H+2)=20H 3.3.4控制转移类指令执行指令为 SJMP RELADR执行结果为(PC)+2+rel=0101H+2+20H=0123H所以,程序转向0123H单元执
17、行。(2)绝对转移(AJMP)指令:其提供11位地址,目标地址由指令第一字节的高三位a10a8和指令第二字节的a7a0所组成。因此,程序的目标地址必须包含AJMP指令后第一条指令的第一个字节在内的2 KB范围内。3.3.4控制转移类指令例如:设(PC)=0456H,标号JMPADR所指的单元0123H。执行指令为 AJMP JMPADR执行结果为(PC)=0123H所以,程序转向0123H单元执行。(3)长转移(LJMP)指令:其提供16位地址,目标地址由指令第二字节和第三字节组成。因此,程序转向的目标地址可以包含程序存储器的整个64 KB空间。3.3.4控制转移类指令例如:设(PC)=012
18、3H,标号JMPADR所指的单元3456H。执行指令为 LJMP JMPADR执行结果为(PC)=3456H所以,程序转向3456H单元执行。(4)间接转移(JMP)指令:其目标地址是将累加器A中的8位无符号数与数据指针DPTR的内容相加而得。相加运算不影响累加器A和数据指针DPTR的原内容。若相加的结果大于64 KB,则从程序存储器的零地址往下延续。3.3.4控制转移类指令设(A)=5,(DPTR)=4567H。执行指令为 JMP A+DPTR执 行 结 果 为(PC)=(A)+(DPTR)=4567H+5H=456CH所以,程序转向456CH单元执行。2.调用和返回指令这类指令共有4条:A
19、CALL addr11;LCALL addr16;RET;RETI3.3.4控制转移类指令(1)绝对调用(ACALL)指令:其无条件地调用首址为addr11处的子程序。执行时,把PC加2以获得下一条指令的地址,将这16位的地址压进堆栈(先PCL,后PCH),同时栈指针加2。然后将指令提供的11位 目 标 地 址,送 入 PC10PC0,而PC15PC11的值不变,程序转向子程序的首地址开始执行。目标地址由指令第一字节的高三位和指令第二字节的所组成。所以,所调用的子程序的首地址必须与ACALL后面指令的第一个字节在同一个2 KB区域内。本指令的操作不影响标志位。3.3.4控制转移类指令例如:设(
20、SP)=60H,(PC)=0123H,子程序SUBRTN的首地址为0456H。执行指令为 ACALL SUBRTN执行结果为 (PC)+2=0123H+2=0125H(PC)将(PC)压入堆栈:25H压入(SP)+1=61H,01H压入(SP)+1=62H,此时(SP)=62H。3.3.4控制转移类指令(2)长调用(LCALL)指令:其无条件地调用首址为addr16处的子程序。执行时,把PC加3以获得下一条指令的地址,将这16位的地址压进堆栈(先PCL,后PCH),同时栈指针加2。然后将指令第2和第3字节所提供的16位目标地址,送入PC15PC0,程序转向子程序的首地址开始执行。所调用的子程序
21、的首地址可以在64 KB范围内。本指令的操作不影响标志位。例如:3.3.4控制转移类指令设(SP)=60H,(PC)=0123H,子 程 序SUBRTN的首地址为0456H。执行指令为 LCALL SUBRTN执行结果为(PC)+3=0123H+3=0126H(PC)将(PC)压入堆栈:26H压入(SP)+1=61H,01H压入(SP)+1=62H,此时(SP)=62H。3.3.4控制转移类指令(3)子程序返回(RET)指令:其执行时表示结束子程序,返回调用指令ACALL或LCALL的下一条指令,继续往下执行。执行时将栈顶的断点的地址送入PC,并把栈指针减2。本指令的操作不影响标志位。例如:设
22、(SP)=62H,RAM中 的(62H)=01H,(61H)=26H。执行指令为 RET执行结果为(SP)=60H,PC=0126H。3.3.4控制转移类指令(4)中断返回(RETI)指令:它是执行从中断程序的返回,并清除内部相应的中断状态寄存器。因此,中断服务程序必须以RETI为结束指令。CPU执行RETI指令后至少再执行一条指令,才能响应新的中断请求。例如:设(SP)=62H,中断时断点是:0123H,RAM中的(62H)=01H,(61H)=23H。执行指令为 RETI执行结果为(SP)=60H,PC=0123H所以程序回到断点0123H处继续执行。3.3.4控制转移类指令 3 条件转移
23、指令这类指令共有6条:JZ rel JNZ rel CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE Ri,#data,rel3.3.4控制转移类指令 可以看出,这类指令都是以相对转移的方式转向目标地址的。偏移量rel的计算方法是 rel =目标地址-PC的当前值 偏移量rel是用补码形式表示的带符号的8位数,因此,程序转移的目标地址为指令前128 B或指令后127 B。这些指令执行后不影响任何操作数和标志位。3.3.4控制转移类指令 这6条指令可分为判零转移指令和比较转移指令两部分。(1)判零转移(JZ、JNZ)指令 指令分别
24、对累加器A的内容为全零或不为全零进行判别并转移,当满足各自条件时,程序转向指定的目标地址执行;当不满足各自条件时,程序继续往下执行。例如:设(A)=01H。3.3.4控制转移类指令执行指令为JZ LABEL1;因为(A)0,程序继续执行 DEC A ;(A)1=00HJZ LABEL2 ;因为(A)=00H,程序转向标号LABEL2指示的地址执行 若第一条指令的地址为100,LABEL1和LABEL2的地址分别为50、150,则第一条和第三条指令的偏移量分别为:第 一 条 指 令 (PC)+2=102,又 根 据102+rel1=50,所以rel1=50-102=-52,即-34H=-0011
25、0100B,它的补码形式为0CCH(11001100B)。3.3.4控制转移类指令第 三 条 指 令(PC)+2=103+2=105,LABEL2=150,所以 rel2=150-105=45=2DH。(2)比较转移指令 这组指令共有4条:CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE Ri,#data,rel其指令格式为:CJNE (目的字节),(源字节),rel3.3.4控制转移类指令其中源操作数与目的操作数的关系如表3-6所示表3-6CJNE指令中源操作数与目的操作数的关系 目的操作数 源操作数direct#dataAR
26、nRi3.3.4控制转移类指令 这组指令的功能是对指定的目的字节和源字节两操作数进行比较。若它们的值不等,程序转移到PC当前值(即PC+2)再加第三字节带符号的8位偏移量(rel)所指的目标地址;若目的字节的数大于源字节的数,清进位标志(CY);否则,置位进位标志(CY)若它们的值相等,程序继续执行。指令流程图如图3-10所示。程序转移的范围是从(PC)+3为起始的 -128+127的单元地址。3.3.4控制转移类指令 图310 CJNE指令流程图3.3.4控制转移类指令4 循环转移指令这类指令共有2条:DJNZ Rn,rel DJNZ direct,rel 这些指令的功能是,每执行一次本指令
27、,将指定的Rn或direct的内容减1,并判别其内容是否为0。若不为0,转向目标地址,继续执行循环程序;若为0,则结束循环程序段,程序往下执行。当direct所指示的变量为I/O口时,该变量应读自该口的输出锁存器,而不是引脚。3.3.4控制转移类指令5 空操作指令这类指令只有1条:NOP 本指令不作任何操作,仅将程序计数器PC加1,使程序继续往下执行。它为单周期指令,在时间上仅占用一个机器周期,常用于延时或时间上等待一个机器周期的时间以及程序留空。3.3.4控制转移类指令3.3.5布尔(位)操作类指令 80C51单片机内部有一个布尔(位)处理器,对位地址空间具有丰富的位操作指令。布尔(位)操作
28、类指令共有17条,包括布尔传送指令、布尔状态控制指令、布尔(位)逻辑操作指令及布尔(位)条件转移指令。3.3.5布尔(位)操作类指令 在指令中,CPU状态寄存器中的进位位CY作为布尔累加器。位地址可用以下方式表示:n直接用位地址0255或00FFH表示;n采用字节地址位数方式表示,两者之间用“.”隔开,如:20H.0、1FH.7等;n采用字节寄存器名加位数表示,两者之间用“.”隔开,如:P1.5、PSW.5等;n位寄存器的定义名称表示,如:F0。3.3.5布尔(位)操作类指令1 布尔传送指令这类指令共2条:MOV C,bit ;(C)(bit)MOV bit,C ;(bit)(C)本类指令的功
29、能是将源操作数(位地址或布尔累加器)送到目的操作数(布尔累加器或位地址)中去。操作不影响C之外的标志位。3.3.5布尔(位)操作类指令 例如:设(C)=1,执行指令为 MOV P1.3,C,执行结果为 P1.3口线输出“1”。例如:设P1口的内容为00111010B,执行指令如 MOV C,P1.3,执行结果为(C)=1。2 布尔状态控制指令 布尔状态控制指令共有6条。(1)位清除(CLR)指令 2 条:CLR C;(C)0 CLR bit ;(bit)0 指令的功能是将C或指定位(bit)清 0。操作不影响C之外的标志位。3.3.5布尔(位)操作类指令 例如:设P1口的内容为00111010
30、B,执行指令为 CLR P1.3,执行结果为 P1.3=0,即P0=00110010B。(2)置位1(SETB)指令 2 条:SETB C ;(C)1 SETB bit ;(bit)1 指令的功能是将C或指定位(bit)置1。操作不影响C之外的标志位。3.3.5布尔(位)操作类指令例如:设(C)=0,P1口的内容为00111010B。执行指令为SETB P1.0SETB C执行结果为(C)=1,P1.0=1,即P0=00111011B。(3)位取反(CPL)指令 2 条:CPL C ;(C)(/C)CPL bit ;(bit)(/bit)指令的功能是将C或指定位(bit)取反。操作不影响C之外
31、的标志位。例如:设(C)=0,P1口的内容为00111010B。执行指令为 CPL P1.0CPL C执行结果为(C)=1,P1.0=1,即P0=00111011B。3.3.5布尔(位)操作类指令3 布尔(位)逻辑操作指令 布尔(位)逻辑操作指令共有6条。(1)位逻辑“与”(ANL)操作指令2条:ANL C,bit;(C)(C)(bit)ANL C,/bit ;(C)(C)(/bit)指令的功能是将指定位(bit)的内容或指定位内容取反后(原内容不变)与C的内容进行逻辑与运算,结果仍存于C中。操作不影响C之外的标志位。3.3.5布尔(位)操作类指令例如:设(C)=1,P1口的内容为001110
32、10B,(ACC.7)=0。执行指令为ANL C,P1.0 ;(C)=0ANL C,ACC.7 ;(C)=0执行结果为(C)=1,P1.0=0,即P1=00111010B,(ACC.7)=0。3.3.5布尔(位)操作类指令(2)位逻辑“或”(ORL)操作指令2条:ORL C,bit ;(C)(C)(bit)ORL C,/bit ;(C)(C)(/bit)指令的功能是将指定位(bit)的内容或指定位内容取反后(原内容不变)与C的内容进行逻辑或运算,结果仍存于C中。操作不影响C之外的标志位。3.3.5布尔(位)操作类指令例如:设(C)=1,P1口的内容为00111010B,(ACC.7)=0。执行
33、指令为ORL C,P1.0 ;(C)=1ORL C,ACC.7 ;(C)=0执 行 结 果 为 (C)=1,P1.0=0,即P1=00111010B,(ACC.7)=0。3.3.5布尔(位)操作类指令4 布尔(位)条件转移指令 布尔(位)条件转移指令共有5条。(1)布尔累加器条件转移指令2条:JC relJNC rel 指令的功能是对C进行检测,当(C)=1或(C)=0时,程序转向PC当前值(即PC+2)与第二字节中带符号的相对地址(rel)之和的目标地址,否则程序往下顺序执行。因此转移的范围是128127 B。操作不影响标志位。3.3.5布尔(位)操作类指令 例1:设(C)=0。执行指令为J
34、C LABEL1 CPL C JC LABEL2 以后,进位位取反变为1,程序转向LABEL2单元执行。3.3.5布尔(位)操作类指令例2:设(C)=1。执行指令为JNC LABEL1 CLR C JNC LABEL2以后,进位位清为0,程序转向LABEL2单元执行。3.3.5布尔(位)操作类指令(2)判位变量转移指令2条:JB bit,relJNB bit,rel 指令的功能是检测指定位,当位变量分别为1或0时,程序转向PC当前值与第二字节中带符号的相对地址(rel)之和的目标地址,否则程序 往 下 顺 序 执 行。因 此 转 移 的 范 围 是-128127 B。操作不影响标志位。3.3.
35、5布尔(位)操作类指令例1:设累加器A中的内容为 0FEH(11111110B)。执行指令为JB ACC.0,LABEL1 JB ACC.1,LABEL2以后,程序转向LABEL2单元执行。例2:设累加器A中的内容为0FEH(11111110B)。执 行 指 令 为 JNB ACC.1,LABEL1 JNB ACC.0,LABEL2以后,程序转向LABEL2单元执行。3.3.5布尔(位)操作类指令(3)判位变量转移并清0指令1条:JBC bit,rel 指令的功能是检测指定位,当位变量为1时,则将该位清0,并且程序转向PC当前值与第二字节中带符号的相对地址(rel)之和的目标地址,否则程序往下顺序执行。因此转移的范围是128127 B。操作不影响标志位 例 如:设 累 加 器 A中 的 内 容 为07FH(0111111B)。执行指令为3.3.5布尔(位)操作类指令JBC ACC.7,LABEL1 JBC ACC.6,LABEL2以后,程序转向LABEL2单元执行,并将ACC.6位清为0,于是(A)=3FH(00111111B)。3.3.5布尔(位)操作类指令
限制150内