版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章指令系统3.1汇编语言3.1.1指令和程序设计语言3.1.2指令格式3.2寻址方式3.2.17种寻址方式3.2.2寻址空间及符号注释3.389C51单片机的指令系统3.3.1数据传送指令3.3.2算术运算指令3.3.3逻辑操作指令3.3.4控制程序转移类指令3.3.5位操作(布尔处理)类指令3.1汇编语言3.1.1指令和程序设计语言
指令:CPU根据人的意图来执行某种操作的命令。
指令系统:一台计算机所能执行的全部指令的集合称为这个CPU的指令系统。
程序:完成某项特定任务的指令的集合。计算机按程序一条一条地依次执行指令,从而完成指定任务。要让计算机完成各项任务,就应设计各种程序。
程序设计语言:机器语言:用二进制编码表示的指令,是计算机能直接识别和执行的语言。机器语言程序(或指令程序、机器码程序、目标程序):用机器语言编写的程序。89C51单片机是8位机,其机器语言以8位二进制代码为单位(一个字节),89C51指令有单字节,双字节,三字节指令。如:做10+20的加法,在89C51中可用机器码指令编程:0111010000001010把10放到累加器中0010010000010100A加20,结果仍放入A中机器语言缺点:不易记忆,不易修改,不易查错汇编语言:为了克服上述缺点,可用有一定含义的符号,即机器助记符来表示,一般都采用某些有关的英文单词的缩写。
如:10+20可用汇编语言表示为:汇编语言程序机器语言程序MOVA,#0AH740AHADDA,#14H2414H特点:用助记符、符号和数字来表示指令,容易理解和记忆,它与机器语言一一对应。与计算机内部硬件结构密切相关。3.1.2指令格式89C51采用助记符表示的汇编语言如下:[标号:]操作码助记符[操作数1,操作数2,操作数3][注释]标号
标号是程序员根据需要给设定的符号地址,可有可无,标号由1~8个字符组成,第一个字符必须是英文字母,不能是数字或其它字符,不分大小写,标号后必须跟冒号。2.操作码助记符
规定了指令所能实现的功能,由2~5个英文字母表示,例如:JB,MOV,DJNZ,LCALL等。3.操作数
指出了参与操作的数据来源和操作结果存放的目的单元,操作数可以是直接的一个数(立即数),或者是一个数据所在的地址空间,即在执行指令时从指定的地址空间取出操作数。操作码后面可以带一个、两个、三个操作数,或者是不带操作数。4.注释
注释是对该指令的解释说明,可提高程序的可读性,是指令的非执行部分,可省略。注释前必须加分号。2.双字节指令(45条)用一个字节表示操作码,另一个字节表示操作数或操作数所在的地址。其指令格式为:操作码立即数或地址3.三字节指令(17条)一个字节操作码,两个字节操作数,格式如下:操作码立即数或地址立即数或地址3.2寻址方式寻址:CPU根据指令,按一定的方式寻找操作数所在的地址并取得操作数。
求10+20的结果,用高级语言,如C语言的语为:
x=10;y=20;z=x+y;编程者只要知道10放在一个叫x的单元,20放在一个叫y的单元,结果放在一个叫z的单元就足够的,至于他们具体的存放地址则根本不必关心,但在汇编语言设计时,要针对系统的硬件环境编程,编程者必须自始自终都必须非常清楚操作数的位置。89C51的寻址方式有七种。即:寄存器寻址、直接寻址、寄存器间接寻址、立即寻址、基址寄存器加变址寄存器变址寻址、相对寻址和位寻址。
若不特别声明,我们后面提到的寻址方式均指源操作数的寻址方式。1.寄存器寻址操作数被放在寄存器之中,执行指令时,从指定寄存器中取操作数。(寄存器指:寄存器组R0~R7中的某一个,或A,B,DPTR等。)例如:CLR A ;A←0INC DPTR ;(DPTR)←(DPTR+1)ADD R5,#20H ;(R5)←(R5+#20H)MOVA,B;(A)←(B)MOV30H,R0;(30H)←(R0)MOVA,R1;(A)←(R1)2.直接寻址
指令中直接给出操作数所在的地址,此时,指令中操作数部分是操作数所在地址。例如:MOVR1,1FH;(R1)←(1FH)MOV30H,4AH;(30H)←(4AH)
在本单片机中规定:访问特殊功能寄存器SFR只能采用直接寻址方式。例如:MOVA,SP;(A)←(SP)MOVA,81H;(A)←(SP)MOVP1,#5AH;(P1)←(#5AH)MOV90H,#5AH;(P1)←(#5AH)
MOVC,20H;位寻址,把位地址为20H中的值送入A中。3.立即寻址
指令操作码后面紧跟的是一字节或两个字节的操作数,用“#”表示,与直接地址相区别。如: MOVA,#30H其机器码是而 MOVA,30H的机器码是743030H的前面加一“#”作为前缀表示它是立即数,说明这条指令采用了立即寻址方式。E53089C51有一条指令要求操作码后面紧跟的是两个字节立即数,即MOVDPTR,#DATA16例如:MOVDPTR,#2000H因为这条指令包括两个字节立即数,所以它是三字节指令。机器码为:100100000010000000000000操作数立即数高8位立即数低8位4.寄存器间接寻址
寄存器中的内容是一个地址,由该地址单元寻址到所需的操作数。间接寻址的存储器空间包括内部数据RAM和外部数据RAM。
能用于寄存器间接寻址的寄存器有R0,R1,DPTR,SP。其中R0、R1必须是工作寄存器组中的寄存器。SP仅用于堆栈操作。注意:1)“间接”表示某寄存器中的“内容”只是一个“单元地址”,这个地址单元中存放的数据才是要找的“操作数”。2)符号“@”表示“在…”,其含义与读音皆同“at”。如指令: MOVA,@Rj (j=0或1) 它的操作功能是(A)
((Rj))即将工作寄存器R0或R1的内容所示的片内RAM地址单元中的数据送到累加器A中去。若j=1,指令是:
MOVA,@R1若(A)=20H,(R1)=37H,(37H)=40H则执行上述指令后,(A)=40H,(R1)=37H,(37H)=40H若用寄存器R1间接寻址的方式,将片内RAM40H单元的内容1AH送至累加器A:MOVR1,#40HMOVA,@R1片内RAM3EH3FH40H1AH41H42H40HR11AHA若仍用寄存器R1间接寻址的方式,R1的内容仍为40H,改用
MOVR1,#40HMOVXA,@R1指令,执行的间接寻址方式,则是将片外RAM40H单元的内容送至累加器A。3FH3EH1AH40H42H41HR140HR1A1AHA片外RAM在访问片内低128B和片外RAM低地址的256个单元时,用R0或R1作地址指针,在访问全部64K外部RAM时,使用DPTR作地址指针进行间接寻址。如
MOVR0,#31HMOVA,@R0;访问片内RAM
MOVR0,#31HMOVXA,@R0;访问片外低256BRAM
MOVDPTR,#1234HMOVXA,@DPTR;访问片外64KRAM变址寻址(基址寄存器+变址寄存器间接寻址)
这种寻址方式只用于访问程序存储器,访问范围为64K,只能读,不能写(只作为源地址,不作为目的地址)。它以PC或DPTR作为基本地址寄存器,以A作为变址寄存器,把它们内容的和作为程序存储器的地址,再寻址该地址单元,读取数据。MOVCA,@A+DPTRMOVCA,@A+PC例如指令
MOVCA,@A+DPTR
当在DPTR中置入地址0400H,在A中置入数码(假定为3)之后,当执行该指令时,从加得地址4003H单元读取相应的信息代码30H,并传送到累加器A。30HDPTR0400HA03H+0403HA30H相对寻址
以当前程序计数器PC的内容为基础,加上指令给出的一字节补码数(偏移量)形成新的PC值的寻址方式。例如“李同学20岁,张同学比李同学大3岁,问张同学多少岁?”相对寻址用于修改PC值,主要用于实现程序的分支转移。
SJMPrel
操作:跳转到的目的地址=当前16位PC值+rel
注意:1)“当前PC值”指程序中下一条指令所在的首地址,是一个16位数;2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128—+127(80H—7FH),例如指令
JCrel设rel=75H,CY=1,该指令表示当C中的内容等于1时,程序跳转。由于CY=1,此指令为双字节指令,所以程序转向(PC)+75H单元去执行。其执行过程如图。相对转移指令JCrel的源地址为1000H,转移的目标地址为1077H。B4HFFH1000H010000001001H011101011002H1077H……PC
PC
PC
7.位寻址
51单片机有很强位操作功能,片内RAM有16个单元(20H~2FH)和11个SFR的各位被赋予了位地址。采用位寻址方式的指令的操作数将是8位二进制数中的某一位,指令中给出的是位地址,即片内RAM某一单元中的一位。如:CLRCSETBP1.0
在89C51中,位地址常用下列两种方式表示:(1)直接使用位地址,对于20H~2FH的16个单元中的128位的位地址分布是00H~7FH。如20H单元的0~7位的位地址是00H~07H等。(2)对于特殊功能寄存器,可以直接用寄存器名字加位数表示,如PSW.3等。3.2.2寻址空间及符号注释1.寻址空间(见表3-2)
89C51单片机对不同的存储空间采用的寻址方式有:(1)程序存储器:一般采用变址寻址方式,如
MOVCA,@A+DPTR(2)特殊功能寄存器:只能采用直接寻址方式,如
MOVP1,A(3)外部数据存储器:采用寄存器间接寻址,如
MOVXA,@DPTR
(4)内部数据存储器:00H~7FH采用直接寻址、寄存器间接寻址,对其中的寄存器区还可采用寄存器寻址,对其中的20H~2FH还可采用位寻址。如:MOV20H,30HMOVC,20H(5)内部数据存储器80H~FFH:只能采用直接寻址。
MOVA,P1MOVA,90H直接寻址2.寻址方式中常用符号注释:
Rn:
表示当前工作寄存器R0~R7中的一个。
@Ri:
表示寄存器间接寻址,常常作间接寻址的地址指针。其中Ri代表R0和R1寄存器中的一个。
direct:
表示内部数据存贮器单元的地址及特殊功能寄存器SFR的地址,对SFR而言,既可使用它的物理地址,也可直接使用它的名字。#date:
表示8位立即数,即8位常数,取值范围为#00H~#0FFH#date16:表示16位立即数,即16位常数,取值范围为#0000H~#0FFFFH
addr16:表示16位地址
addr11:表示11位地址
rel:用补码形式表示的地址偏移量,取值范围为-128~+127。bit:表示内部RAM和SFR中的具有位寻址功能的位地址。SFR中的位地址可以直接出现在指令中,为了阅读方便,往往也可用SFR的名字和所在的数位表示。如:表示PSW中奇偶校验位,可写成D0H,也可写成PSW.0的形式出现在指令中。@:表示间接寻址寄存器或基址寄存器的前缀符号。$:表示当前指令的地址。(X):X中的内容
((X)):由X指出的内容/:位操作指令中,表示对该位先去反再参与操作,但不影响该位原值。3.389C51单片机的指令系统MCS-51指令系统可以分为5大类:数据传送类指令(28条)算术运算指令(24条)逻辑运算及移位指令(25条)控制类指令(17条)位操作指令或布尔操作(17条)3.3.1数据传送类指令
CPU在进行算术和逻辑运算时,总需要操作数。所以数据的传送是一种最基本、最主要的操作。
传送:把源地址单元的内容传送到目的地址单元中去,而源地址单元内容不变。或者源、目的单元内容互换。指令格式:MOV<目的操作数>,<源操作数>传送类指令功能:将源字节的内容传送到目的字节。
1.以累加器A为目的操作数的指令(4条)汇编指令格式机器码格式操作
MOVA,Rn
11101rrr
(Rn)A
MOVA,direct
11100101(direct)Adirect
MOVA,@Ri
1110011i
((Ri))A
MOVA,#data
01110100
dataA
data这几种操作不影响源字节和任何别的寄存器内容,只影响PSW的P标志位rrr为工作寄存器地址,rrr=000~111对应某组工作寄存器的R0~R7Ri为间接寻址寄存器,i=0或1,即R0或R1例:设(25H)=30H,(R7)=0AH,(R0)=20H,则执行如下指令后,累加器和各个寄存器的值会有怎样的变化?MOVA,#25H;MOVA,R7;MOVA,25H;MOVA,@R02.以寄存器Rn为目的操作数的指令(3条)汇编指令格式机器码格式操作
MOVRn,A
11111rrr
(A)Rn
MOVRn,direct
10101rrr(direct)Rndirect
MOVRn,#data
01111rrrdataRn#data例:设(A)=30H,(R5)=0AH,(70H)=20H,则执行如下指令后,累加器和各个寄存器的值会有怎样的变化?MOVR5,#25H;MOVR5,70H;MOVR5,A;
3.以直接地址为目的操作数的指令(5条)汇编指令格式机器码格式操作
MOVdirect,Rn
10001rrr
(Rn)direct
direct
MOVdirect,A
11110101(A)directdirectMOVdirect,direct
10000101
(源direct)
源data
目的direct
目的data
汇编指令格式机器码格式操作MOVdirect,@Ri
1000011i
((Ri))direct
directMOVdirect,#data
01110101
datadirect
direct
#data
例:设(A)=30H,(R5)=0AH,(70H)=20H,则执行如下指令后,累加器和各个寄存器的值会有怎样的变化?MOV30H,#25H;MOV30H,70H;MOV3FH,A;MOV20H,@R5MOV29H,R54.以间接地址为目的操作数的指令(3条)汇编指令格式机器码格式操作
MOV@Ri,A
1111011i
(A)(Ri)
MOV@Ri,direct
0101011i(direct)(Ri)directMOV@Ri,#data
0111011i
data(Ri)
#data例:如(50H)=32H,(A)=20H,(R0)=50H,(R1)=52H,则执行下列指令后,寄存器的内容有什么变化?MOV@R0,#0A0HMOV@R0,AMOV@R1,50HMOV指令在片内寄存器的操作功能如图所示:@RiACC#datadirectRn5.十六位数据传送指令(1条)汇编指令格式机器码格式操作MOVDPTR,#data10010000dataHDPH高位字节dataLDPL低位字节例如:MOVDPTR,#1234H执行结果为:(DPH)=12H(DPL)=34H6.查表指令(2条)汇编指令格式机器码格式操作MOVCA,@A+DPTR10010011(PC)+1PC
((A)+DPTR)AMOVCA,@A+PC10000011(PC)+1PC
((A)+PC)A上述两条指令的操作过程为:A寄存器基地址寄存器+变址寄存器间接寻址@PC+A(程序存储器0KB~64KB)基地址寄存器+变址寄存器间接寻址@DPTR+A(程序存储器0KB~64KB)CPU读取单字节指令“MOVCA,@A+PC”后,PC的内容先自动加1,将新的PC内容与累加器A中的8位无符号数相加形成地址,取出该地址单元中的内容送累加器A。CPU读取单字节指令“MOVCA,@A+DPTR”后,PC的内容先自动加1,将DPTR内容与累加器A中的8位无符号数相加形成地址,取出该地址单元中的内容送累加器A。例如:在程序存储器中,数据表格为02H04H06H08H0AH1010H1011H1012H1013H1014H执行程序1000H:MOVA,#0DH1002H:MOVCA,@A+PC1003H:MOVR0,A结果为:(A)=02H,(R0)=02H(PC)=1004H例如:在程序存储器中,数据表格为02H04H06H08H0AH7010H7011H7012H7013H7014H执行程序1000H:MOVA,#11H1002H:PUSHDPH;保护DPH1004H:PUSHDPL;保护DPL1006H:MOVDPTR,#7000H1009H:MOVCA,@A+DPTR100AH:POPDPL100CH:POPDPH结果为:(A)=04H(PC)=100EH(DPRT)=原值7.累加器A与片外RAM传送指令(4条)
在89C51系统中,CPU对片外RAM的访问只能用寄存器间接寻址方式,且仅有四条指令。汇编指令格式机器码格式操作MOVXA,@Ri1110001i((Ri))AMOVXA,@DPTR11100000((DPTR))AMOVX@Ri,A1111001i(A)(Ri)MOVX@DPTR,A11110000(A)(DPTR)说明:(1)当通过DPTR寄存器间接寻址方式读写外部RAM及扩展I/O端口时,先将16位外部RAM地址或I/O端口地址放在数据指针DPTR寄存器中,然后以DPTR作为间接寻址寄存器,通过累加器A进行读写,如:MOVDPTR,#3FFFH;将要读写的外部RAM单元地址送入DPTR中MOVXA,@DPTR;将DPTR指定的外部存储单元传送到A中,读MOVX@DPTR,A;将A中内容送到指定的外部存储单元,写说明:(2)当通过R0或R1寄存器间接寻址方式读写外部RAM及扩展I/O端口时,先将低8位外部RAM地址或I/O端口地址放在R0或R1中,然后以R0或R1作为间接寻址寄存器,通过累加器A进行读写,这时外部RAM低8位地址A7~A0通过P0口输出,寻址范围是前256个存储单元。
MOVR1,#0F1H;将要读写的外部RAM的低8位地址传送到R1中
MOVXA,@R1;将R1指定的外部存储单元的内容读入累加器A中。MOVX@R1,A;将A中的内容写入指定的外部存储单元说明:(3)由于外部RAM与内部RAM之间不能直接传送,因此当需要外部RAM传送到内部RAM时,可通过累加器A作为中介。例:将外部RAM的3FFFH单元内容传送到内部RAM2FH单元:MOVDPTR,#3FFFHMOVA,@DPTRMOV2FH,A说明:(4)外部RAM之间也不能直接传送例:把外部RAM的2000H单元内容传送到3000H单元中(两单元之间数据传送)MOVDPTR,#2000HMOVA,@DPTRMOVDPTR,#3000HMOV@DPTR,A8.堆栈操作指令(2条)
在89C51片内RAM的128B单元中,可设定一个区域作为堆栈(一般可设在30H~7F单元中),栈顶由堆栈指针SP指出。(1)PUSH(入栈)指令汇编指令格式机器码格式操作PUSHdirect11100000(SP)+1SPdirect(direct)SP(2)POP(出栈)指令汇编指令格式机器码格式操作
POPdirect11010000((SP))directdirect(SP)-1SP说明:(1)堆栈操作指令中只能使用直接寻址方式,不能使用寄存器寻址方式(2)direct为片内8位RAM单元(包括SFR)的直接地址。已知SP=60H,求执行下列程序指令后的结果.MOVDPTR,#1234H;PUSHDPH;PUSHDPL;MOVDPTR,#5678H;POPDPH;POPDPL;DPTR=1234H;SP=SP+1,SP=61H,(DPH)->(SP),(SP)=61H,(61H)=12HSP=SP+1,SP=62H,(DPL)->(SP)(SP)=62H,(62H)=34HDPTR=5678HDPH=(62H)=34H,SP-1->SP,SP=61HDPL=(61H)=12H,SP-1->SP,SP=60H9.交换指令(4条)(1)字节交换指令(3条)汇编指令格式机器码格式操作XCHA,Rn11001rrr(A)(Rn)XCHA,direct11000101(A)(direct)XCHA,@Ri1100011i(A)((Ri))
将第二操作数所指定的工作寄存器Rn内容、直接寻址或间接寻址单元内容与累加器A中的内容互换。例:设(A)=12H,(R0)=34H(12H)=0AH。XCHA,R0;A和R0字节内容互换,;(A)=34H,(R0)=12HXCHA,@R0;(A)=0AH,(12H)=34HXCHA,12H;(A)=34H,(12H)=0AH9.交换指令(4条)(2)半字节交换指令(1条)汇编指令格式机器码格式操作XCHDA,@Ri1101011i(A0~3)((Ri)0~3)
将累加器A的低4位与R0或R1所指出的片内RAM单元的低4位数据相互交换,各自的高4位不变。A半字节RAM半字节例:设(A)=1EH,(R0)=2FH(2FH)=37H。XCHDA,@R0;(A)=17H,(2FH)=3EH交换前:A000111102FH00110111交换后:A000101112FH00111110练习:1.指出下列指令寻址方式,30H在不同的指令中代表什么含义?(1)MOVA,#30H(2)MOV30H,@R1(3)MOVC,30H(4)MOV30H,R5(5)MOVXA,@DPTR(6)MOVCA,@A+PC2.指出执行下列程序段后各单元内容变为什么?累加器A中的内容变为什么?(1)MOVA,#2(2)MOVA,#0F5HMOVR1,#30HMOV30H,#9BHMOV@R1,AMOVR0,#30HMOV35H,R1XCHA,R13.写出能完成下列数据传送的指令(1)R1内容传送到R0(2)内部RAM25H单元中内容送内部35H单元中(3)内部RAM25H单元中内容送P1口(4)内部RAM40H单元中内容送外部RAM2005H单元。(5)外部RAM3000H单元中内容送外部RAM25H单元(6)外部RAM1000H单元中内容送P2口3.3.2算术运算指令1.加法类指令(4条)汇编指令格式机器码格式操作ADDA,Rn00101rrr(A)+(Rn)AADDA,direct00100101(A)+(direct)AdirectADDA,@Ri0010011i(A)+((Ri))AADDA,#data00100100(A)+dataA#data2.带进位加法类指令(4条)汇编指令格式机器码格式操作ADDCA,Rn00111rrr(A)+(Rn)+CyAADDCA,direct00110101(A)+(direct)+CyAdirectADDCA,@Ri0011011i(A)+((Ri))+CyAADDCA,#data00100100(A)+#data+CyA#data说明:(1)所有加法指令的目的操作数均是累加器A,源操作数支持寄存器、直接、寄存器间接、立即数等四种寻址方式,因此可以将内部RAM(00~FF)、特殊功能寄存器以及8位立即数与累加器A相加,结果存放在A中。(2)执行加法指令将影响进位标志Cy、溢出标志OV、辅助进位标志AC以及奇偶标志P。例1:设(A)=0C3H,(R0)=0AAHADDA,R0;(A)=6DH,Cy=1,OV=1,AC=0(A):11000011+(R0):10101010101101101无符号数运算时,要判断运算结果是否超出范围,可以看进位标志位Cy,Cy=1表示运算结果大于255,Cy=0,表示小于255。带符号数运算时,要判断运算结果是否超出范围,可以看OV,OV=1,表示溢出,OV=0表示无溢出。OV=C7+C6:C7表示最高位向高位的进位或借位,C6表示次高位向高位的进位或借位。+表示异或。异或:相同为0,相异为1例2:设(A)=A0H,(20H)=0F1H,将20H单元内容与累加器A相加,结果放在20H单元。并指出该指令对PSW各位的影响。ADDA,20HMOV20H,A
(A):10100000+(20H):11110001110010001PSW:Cy=1,AC=0,OV=0,P=1例3:试计算904FH+0E32H,把结果放入R0和R1中。MOVA,#4FHADDA,#32HMOVR0,AMOVA,#90HADDCA,#0EHMOVR1,A3.带借位减法指令(4条)汇编指令格式机器码格式操作SUBBA,Rn10011rrr(A)-(Rn)-CyASUBBA,direct10010101(A)-(direct)-CyAdirectSUBBA,@Ri1001011i(A)-((Ri))-CyASUBBA,#data10010100(A)-#data-CyA#data说明:(1)这组指令的功能是从累加器A中减去源操作数所指出的内容及进位位Cy的值,差值保留在累加器A中。(2)由于89C51系统没有不带借位的减法指令,如需要的话,可以在“SUBB”指令前用“CLRC”指令将Cy清0。(3)两数相减时,如果位7有借位,则Cy置1,否则清0。若位3有借位,则AC置1,否则清0。两个带符号数相减,若OV为1,则表示结果不正确。例1:设(A)=0C9H,(R2)=54H,Cy=1执行指令:SUBBA,R2;(A):11001001-(Cy):0000000111001000-(R2):0101010001110100结果:(A)=74H,Cy=0,AC=0,OV=1P=0例2:用减法指令求内部RAM两单元的差值,假设被减数放在RAM30H单元,减数放在31H单元,差放在40H单元。且(30H)=2FH,(31H)=(9FH)。MOVA,30HCLRCSUBBA,31HMOV40H,A结果:(40H)=90H,Cy=1,OV=1,AC=0,P=0例3:试计算904FH-0EA2H,把结果放入R0和R1中。并分析PSW各位的变化。CLRCMOVA,#4FHSUBBA,#0A2HMOVR0,AMOVA,#90HSUBBA,#0EHMOVR1,A4.乘法指令(1条)汇编指令格式机器码格式操作MULAB10100100
这条指令的功能是把累加器A和寄存器B中两个无符号数相乘,所得16位积的低字节存放在A中,高字节存放在B中,若乘积大于0FFH,则OV置1,否则清0,Cy总是被清0。B8~15A0~7例1:(A)=4EH,(B)=5DH执行指令MULAB;结果为(B)=1CH(A)=56HOV=15.除法指令(1条)汇编指令格式机器码格式操作DIVAB10000100(A)/(B)的商A
(A)/(B)的余数B
这条指令的功能是把累加器A和寄存器B中两个无符号数相除,整数商存于A中,余数存于B中,Cy和OV均被清0。若原(B)=00H,则结果无法确定,用OV=1表示,Cy仍为0。例1:(A)=BFH,(B)=32H执行指令DIVAB;结果为(B)=29H(A)=03HOV=0Cy=06.加1指令(5条)汇编指令格式机器码格式操作
INCA00000100(A)+1A
INCRn00001rrr(Rn)+1Rn
INCdirect00000101(direct)+1directdirect
INC@Ri0000011i((Ri))+1(Ri)
INCDPTR10100011(DPTR)+1DPTR
说明:
这组指令的功能是将操作数的单元内容加1,其操作不影响PSW,若原单元内容为FFH,加1后溢出为00H,也不会影响PSW标志位。区别INCA;不影响PSWADDA,#01H;影响PSW7.减1指令(4条)汇编指令格式机器码格式操作DECA00010100(A)-1ADECRn00011rrr(Rn)-1RnDECdirect00010101(direct)-1directdirectDEC@Ri0001011i((Ri))-1(Ri)说明:这组指令的功能是将操作数的单元内容减1,其操作不影响PSW,若原单元内容为00H,减1后为FFH,也不会影响PSW标志位。8.十进制调整指令(1条)汇编指令格式机器码格式操作DAA11010100调整累加器内容为BCD码这条指令跟在ADD或ADDC指令后,将相加后存放在累加器A中的结果进行十进制调整,完成十进制加法功能。先来看看BCD码加法运算存在的问题:情况1例:BCD码25存放在累加器A中,另一BCD码36存放在寄存器R2中,执行ADDA,R2指令时,CPU视为两个二进制数相加,运算结果如下:(25)00100101+(36)0011011001011011(结果为5BH,为十进制的91)
之所以结果不正确,因为在BCD中,用二进制表示十进制数时,仅用0~9,即二进制的0000~1001十个数码,因此,相加后,当低4位大于1001时,应该加06H,使低4位(即BCD码个位)向b4进位,获得正确结果。如:(A)01011011+6校正0000011001100001(结果为61,正确)当然,当高位存在这种情况时,也要根据运算结果加06H调整。如:39+72BCD码加法运算存在的问题:情况2低4位向高4位进位时,也需要校正例2:假设BCD码19存放在累加器A中,另一BCD码38存放在R2中,执行ADDA,R2(19)00011001+(38)0011100001010001(结果为51H,不正确)结果不正确是因为8+9=17,在二进制加法中为11H,同样需要加6调整。因此,当b3位向b4位进位,即辅助进位标志Ac有效时,需要加6调整。同样,高位也存在类似问题。综上,BCD码加法需要调整的情况如下:若(A0~3)
>9或AC=1,则(A0~3)
+6A0~3同时,若(A4~7)>9或CY=1,则(A4~7)+6A4~7
注意:DAA指令不能简单地把A中的16进制数变换成BCD码,也不能用于十进制减法的调整。
例:假设BCD码56存放在累加器A中,另一BCD码67存放在R3中,CY内容为1,执行下列指令
ADDCA,R3DAA3.3.3逻辑操作指令1.简单操作指令(2条)(1)累加器A清0指令汇编指令格式机器码格式操作
CLRA
111001000A
累加器A清0,只影响PSW的P位(2)累加器A取反指令汇编指令格式机器码格式操作
CPLA
11110100(A)A累加器A逐位取反,不影响标志位2.移位指令(4条)(1)累加器A循环左移指令汇编指令格式机器码格式操作
RLA
00100011a7a0如:(A)=23H,执行RLA后,(A)=46H该指令通常用来将累加器A的内容做乘2运算2.移位指令(2)累加器A循环右移指令汇编指令格式机器码格式操作
RRA
00000011a7a0
如:(A)=46H,执行RRA后,(A)=23H2.移位指令(3)累加器A连同进位位循环左移指令汇编指令格式机器码格式操作
RLCA
00110011a7a0
如:(A)=23H,CY=1,执行RLCA后,(A)=47H,CY=0CY2.移位指令(4)累加器A连同进位位循环右移指令汇编指令格式机器码格式操作
RRCA
00010011a7a0
如:(A)=23H,CY=1,执行RRCA后,(A)=91H,CY=1CY3.累加器半字节交换指令(1条)汇编指令格式机器码格式操作SWAPA11000100(A0~3)(A4~7)指令的功能是将A的高低两半字节交换
如:(A)=FAH,执行指令SWAPA指令后,(A)=AFH4.逻辑“与”指令(6条)汇编指令格式机器码格式操作ANLA,Rn01011rrr(A)(Rn)AANLA,direct01010101(A)(direct)AdirectANLA,@Ri0101011i(A)((Ri))AANLA,#data01010100(A)#dataA#data4.逻辑“与”指令汇编指令格式机器码格式操作ANLdirect,A
01010010(direct)(A)directdirectANLdirect,#data01010011(direct)#datadirectdirect#data5.逻辑“或”指令(6条)汇编指令格式机器码格式操作ORLA,Rn01001rrr(A)(Rn)AORLA,direct01000101(A)(direct)AdirectORLA,@Ri0100011i(A)((Ri))AORLA,#data01000100(A)#dataA#data5.逻辑“或”指令汇编指令格式机器码格式操作ORLdirect,A
01010010(direct)(A)directdirectORLdirect,#data01010011(direct)#datadirectdirect#data6.逻辑“异或”指令(6条)汇编指令格式机器码格式操作XRLA,Rn01101rrr(A)(Rn)A
XRLA,direct01100101(A)(direct)Adirect
XRLA,@Ri0110011i(A)((Ri))A
XRLA,#data01100100(A)#dataA#data6.逻辑“异或”指令汇编指令格式机器码格式操作XRLdirect,A
01100010(direct)(A)directdirectXRLdirect,#data01100011(direct)#datadirectdirect#data逻辑运算指令的常见用法逻辑与ANL用于清0或者保留某些位:例:ANLA,#0FH;则(A)=0AH(已知累加器A中已存有数:9AH)逻辑或ORL用于置1或者保留某些位:例:ORLA,#0FH;则(A)=9FH逻辑异或XRL用于取反或者保留某些位:例:XRLA,#0FH;则(A)=95H(A)
10011010#0FH
0000111195H
10010101例:使用逻辑运算指令实现下列逻辑操作,要求不得改变未涉及位的内容使ACC.0清0
清除累加器高4位清除ACC.3,ACC.4,ACC.5,ACC.6
使内部RAM20H单元最高位置1
思考:采用“异或”运算,怎样可使一带符号数的符号位改变,数据位不变,怎么可使该数必然变为0。3.3.4控制转移类指令1.无条件转移指令(4条)
无条件转移指令是指,当程序执行到该指令时,程序无条件转移到指令提供的地址处执行。无条件转移指令有短转移、长转移、相对转移和间接转移(散转指令)4条(1)短转移指令汇编指令格式机器码格式操作AJMPaddr11a10a9a80001(PC)(PC)+2 a7~a0(PC10~0)addr11
第一个操作表达式表示PC当前值为排在这条无条件转移指令的下一条指令的地址,第二个操作表达式表示PC值高5位不变,低11位按指令给出的11位地址变更。所以转移的目的地址与本指令下面一条指令在同一个2KB地址空间。a10a9a80001a7~a0PC1000H1001H1002HPC2KB(2)长转移指令汇编指令格式机器码格式操作LJMPaddr16
00000010
(PC)+3PC
a15~a8
addr16PC
a7~a0
指令提供16位目标地址,将指令的第二、第三字节地址码分别装入PC的高8位和低8位中,程序无条件转向指定的目标地址去执行。00000010a15~a8a7~a0PC1000H1001H1002HPC64KB1003H(3)相对转移(短转移)指令汇编指令格式机器码格式操作SJMPrel
10000000(PC)+2PCrel(PC)+relPC
指令的操作数是相对地址,是一个带符号的偏移字节数,其范围为-128~+127,负数表示反向转移,正数表示正向转移。执行时,PC的内容首先加2,再加相对地址rel,就得到了转移目标地址。编程时,用标号代替转移目的地址,转移指令的操作数交给汇编程序计算。
LJMPNEXT(AJMPNEXT/SJMPNEXT)
…
NEXT:在用汇编语言编程时,用字符$表示本条指令的地址,这样 当前PC值就等于$+2。∵($+2)+rel=目的地址∴ rel=目的地址-$-2
注:当指令机器码为三字节时,当前PC值就等于$+3,计算rel就要减3。
例如,写出指令SJMP$的机器码,并剖析执行该指令的结果。rel=$-$-2=-2=FEH,机器码为80FEH。在执行该指令后,程序将仍转回此该指令继续执行,于是将不断地执行这一指令,计算机不做其他工作,进入等待状态。(4)间接转移指令汇编指令格式机器码格式操作JMP@A+DPTR
01110011(A)+(DPTR)PC
指令的转移地址由数据指针DPTR的16位数和累加器A的8位无符号数相加而成,并直接送入PC,指令执行过程对DPTR、A和标志位均无影响。例如,已知累加器A的内容为0、2、4、6、8五个偶数中的一个,又标号TAB的真实地址为1800H,试剖析下列程序段的执行结果。
MOV DPTR,#TAB JMP @A+DPTR
1800 TAB: AJMP 100H AJMP 200H AJMP 300H AJMP 400H AJMP 500H…当(A)=0时,程序转到1800H处,执行AJMP 100HAJMP 100H指明转移地址的低11位为00100000000B;
而这时的PC值是1802H,以二进制写出的高5位为00011B,合在一起为
0001100100000000B,即1900H。程序最后转到1900H继续执行。同理,当(A)分别=2、4、6、8,程序最后转到1A00H、1B00H、1C00H、1D00H继续执行。2.空操作指令(1条)汇编指令格式机器码格式操作码
NOP
00000000(PC)+1PC
单字节指令,除PC加1外,不影响其它寄存器和标志位,该指令通常用来产生一个机器周期的延迟。3.条件转移指令(8条)(1)判零转移指令汇编指令格式机器码格式操作
JZrel
01100000
(PC)+2PC,当A
相对地址(rel)全为0时,则PC=PC+rel;当A不全为0时,程序顺序执行
JNZrel
01110000
(PC)+2PC,当A不
相对地址(rel)全为0时,则PC=PC+rel;当A全为0时,程序顺序执行指令的执行流程:PCPC+2(A)=0?(PC)+rel执行下条指令转向目标地址执行YN“JZrel”指令PCPC+2(A)=0?(PC)+rel执行下条指令转向目标地址执行YN“JNZrel”指令(2)比较转移指令格式:(三字节指令)
CJNE(目的字节),(源字节),rel
若“目的字节”>“源字节”,
(PC)+3+relPC,
且PSW中Cy位清0
若“目的字节”<“源字节”,
(PC)+3+relPC,
且PSW中Cy位置1
若“目的字节”=“源字节”,
(PC)+3PC,
即程序顺序执行,PSW中Cy位清0。这类指令的源操作数和目的操作数有四种寻址方式汇编指令格式
CJNEA,direct,relCJNEA,#data,relCJNERn,#data,relCJNE@Ri,#data,rel(3)循环转移指令汇编指令格式操作DJNZRn,rel
(PC)+2PC,(Rn)-1Rn
当(Rn)0时,则(PC)+relPC
当(Rn)=0时,则结束循环程序顺序执行DJNZdirect,rel
(PC)+3PC,(direct)-1direct
当(direct)0时,则(PC)+relPC
当(direct)=0时,则结束循环程序顺序执行
程序设计举例:将内部RAM中30H~3FH的数依次送到70H~7FH单元中。ORG0000HMOVR0,#30H;数据源首地址
MOVR1,#70H;数据存放目标首地址MOVR2,#10H;数据个数LOOP:MOVA,@R0MOV@R1,A;采用间接寻址方式传递数据INCR0INCR1;修改指针值DJNZR2,LOOP;循环次数减1,判断循环是否结束SJMP$END
例:设单片机的晶振频率为6MHz,编写一段延时程序约100ms的子程序。
Delay:MOVR7,#64H;设循环计数器初值(100次)LOOP:MOVR6,#0FAH;循环250(250×4=1ms)DJNZR6,$ ;循环控制
DJNZR7,LOOPRET
T=12/6MHz=2μst=2μs+100×(2μs+1ms+2×2μs)+4μs=100.606ms 小结:1、无条件转移指令共有几条?2、CJNE指令与DJNZ指令有何区别?
4.调用和返回指令子程序定义:具有完整功能的程序片段,供主程序调用。功能:供主程序在需要时调用。子程序可以在程序中反复多次使用,以简化源程序的书写。特点:子程序可以嵌套,有利于模块化程序设计。4.调用和返回指令(1)短调用指令汇编指令格式操作ACALLaddr11
(PC)(PC)+2
(SP)(SP)+1
((SP))(PC7~0)
(SP)(SP)+1
((SP))(PC15~8)
(PC10~0)addr11(PC15~11不变)将断点(下一条指令的地址)推入堆栈保存4.调用和返回指令(2)长调用指令汇编指令格式操作LCALLaddr16
(PC)(PC)+3
(SP)(SP)+1 ((SP))(PC7~0)
(SP)(SP)+1 ((SP))(PC15~8)
(PC15~0)addr16将断点(下一条指令的地址)推入堆栈保存4.调用和返回指令(3)返回指令汇编指令格式操作
RET
(PC15~8)((SP));弹出断点高8位
(SP)(SP)-1 (PC7~0)((SP));弹出断点低8位
(SP)(SP)-14.调用和返回指令(3)返回指令汇编指令格式操作
RETI
(PC15~8)((SP));弹出断点高8位
(SP)(SP)-1 (PC7~0)((SP));弹出断点低8位
(SP)(SP)-1LCALL34H56HMOV
••
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 挖机挖土方合同
- 2026年棚菜用工合同(1篇)
- MT-T 264-2025 煤的显微维氏硬度测定方法
- 教案-铁的重要化合物
- 2026年医药第三方物流质量审计与方案
- 2026年会议活动签到处与注册区搭建方案
- 华师大版471垂线(教学设计)
- 中毒的急救与处理流程
- 适合小学生的气象科普
- 耳聋专业科听力康复训练计划
- 2025年陕西有色金属控股集团有限责任公司招聘(18人)笔试参考题库附带答案详解
- 高速公路施工安全管理手册
- 现金清分差错管理办法
- 2024年晋城职业技术学院单招《数学》高分题库带答案详解AB卷
- 锡条使用管理办法
- 找空气教学课件
- 2025年邮政社招笔试考试历年真题及答案
- 肉品分割车间管理制度
- 数学三年级奥数教案
- 柔性人才引进协议书
- 计算机一级wps考试真题试题及答案
评论
0/150
提交评论