




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MCS-51单片机的指令和汇编语言程序设计
——指令系统本章学习目标
MCS-51单片机的指令格式及寻址方式汇编语言的指令类型伪指令的使用难点在于控制转移指令和位操作指令的理解及各种指令的灵活应用3.1MCS-51单片机的指令系统指令格式MCS-51单片机指令格式采用了单地址指令格式。一条汇编语句是由标号、操作码、目的操作数、源操作数和注释等5部分组成的,其中方括号中的部分是可以选择的。指令的具体格式为:[标号]:操作码
[目的操作数],[源操作数];[注释]例如:
HY1:MOVR3,
#08H;执行数据传送操作
指令符号A:累加器,用于运算及存放数据。B:专用寄存器,用于MUL和DIV指令中,存放第二操作数、乘积高位字节。CY:进位标志位,或布尔处理器中的累加器。bit:内部RAM或专用寄存器中的直接寻址位。/bit:位地址单元内容取反。DPTR:16位数据指针,也可作为16位地址寄存器。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):相应地址单元中的内容。→:箭头左边的内容送入箭头右边的单元内。功能数据传送类:29条算术运算类:24条逻辑运算类:24条控制转移类:17条位操作类:17条指令分类
MCS-51单片机共有111条指令,可以实现51种基本操作。1.按指令功能分类2.按指令字节分类
单片机中的指令并不是固定的长度,对于不同的指令,指令的字节数不同。MCS-51单片机用机器语言表示的指令格式按字节划分,有一字节指令、两字节指令和三字节指令等三种。(1)一字节指令中的8位二进制代码既包含操作码的信息,也包含操作数的信息。例如指令: INC A MOV A,Rn XCH A,RnADD A,@RiDEC Rn
(2)二字节指令中的第一个字节表示操作码,第二个字节表示操作数,操作数既可能是立即数,也可能是地址。其指令格式如右所示:例如:ANL A,#90H ADD A,#06HDEC 30HMOV R2,#0F0H(3)三字节指令中,第一字节表示操作码,另两个字节是操作数,其指令格式如右所示:例如:ANL30H,#66H MOVDPTR,#1000H LJMP0300H CJNEA,20H,HL53.按指令执行时间分类MCS-51系列单片机按指令的机器周期数可以分为单周期指令57条,双周期指令52条和四周期指令2条等。(1)单周期指令的执行指令时间为一个机器周期。例如:
XCH A,@R1
ADD A,R1
CLR A
MOV R3,#0F0H (2)双周期指令的执行指令时间为2个机器周期。例如:
MOV Rn,30H
DJNZ R3,LOOP
JMP @a+dptr(3)四周期指令的执行指令时间为4个机器周期。例如:DIV ABMUL AB
立即寻址(ImmediateAddressing)
操作数就包含在指令代码中,在操作码之后,称为立即数,用“#”表示。
MCS-51
如:MOVP1,#80HMOVR7,#0F5HMOVDPTR,#1245H8086/8088MOVAL,80HMOVAL,0F5HMOVBX,1245H操作数存在程序存储器中寻址方式直接寻址(DirectAddressing)直接使用数所在单元的地址找到了操作数,所以称这种方法为直接寻址。操作数在SFR、内部RAM、位地址空间。如:MCS-51MOVA,00H
MOVC,60H
MOVA,0F0H8086/8088CPUMOVAL,[2000H]寄存器寻址(RegisterAddressing)对选定的工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR中的数进行操作。
例:MOVA,R0;将R0工作寄存器中的数据送到累加器A中去。提一个问题:我们知道,工作寄存器就是内存单元的一部分,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOVA,00H和MOVA,R0不就没什么区别了吗?MOVAL,BL
(8086CPU的寄存器寻址方式)答案:
的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个机器周期,而第二条则只需要1个机器周期,第一条指令变成最终的目标码要两个字节(E5H00H),而第二条则只要一个字节(E8H)就可以了。寄存器间接寻址(RegisterIndirectAddressing)把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。R0,R1----8位地址,片内低128字节或片外64KBDPTR----16位,片外64KB
MCS-51如: MOVA,@R0 MOVXA,@R0 MOVXA,@DPTR
8086/8088CPUMOVAL,[BX]MOVAX,[SI]操作数在片内RAM中操作数在片外RAM中操作数在片外RAM中
将PC中的当前内容与指令第二字节给出的数相加,结果作为跳转指令的转移地址(转移目的地址)。
PC中的当前内容称为基地址(本指令后的字节地址)指令第二字节给出的数据称为偏移量,1字节带符号数。常用于跳转指令。如:JC23H;若C=0,不跳转;C=1,跳转。
相对寻址(RelativeAddressing)程序存储区ALU1025H1000H401025H451001H
23…
…1024H471002H3023H1002H指令代码当前PC以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两者内容相加,结果作为操作数的地址。常用于查表操作。
MCS-51
MOVCA,@A+DPTR
;(A+DPTR)→A
MOVCA,@A+PC
;PC+1→PC,(A+PC)→A变址寻址(基址+变址)(Base-Register-plus-Index-Register-IndirectAddressing)
8086/8088CPUMOVAL,[BX+SI]MOVAX,[BP+DI]操作数在程序存储器中E0A程序存储区2040H9320E0H472041H……
…DPH20DPL00ALU如:MOVCA,@A+DPTR设DPTR=2000H,A=E0H20E0H47指令代码E0A程序存储区ALU如:MOVCA,@A+PC设A=E0H2121H452040H832121H452041H
……
…2120H47当前PC指令代码
对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。如:SETB3DH;将27H.5位置1 CLRC;Cy位清08086/8088CPU无此寻址方式位寻址(BitAddressing)操作数在片内RAM位地址区或SFR某些位中寻址方式涉及的存储器空间寻址方式寻址空间(操作数存放空间)立即寻址程序存储器直接寻址片内RAM低128字节、SFR寄存器寻址工作寄存器R0~R7,A,B,DPTR寄存器间接寻址片内RAM:@R0,@R1,SP片外RAM:@R0,@R1,@DPTR变址寻址程序存储器:@A+PC,@A+DPTR相对寻址程序存储器256字节范围内:PC+偏移量位寻址片内RAM的位寻址区(20H~2FH字节地址)某些可位寻址的SFR指令系统数据传送类指令(29条)(DataTransferInstruction)MCS-51助记符:MOV、MOVX、MOVCXCH、XCHD、SWAPPUSH、POP
源操作数寻址方式(5种):立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址目的操作数寻址方式(3种):直接寻址、寄存器寻址、寄存器间接寻址
除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。(1)以累加器为目的操作数的指令(4条) MOVA,Rn
;Rn→A MOVA,direct
;(direct)→A MOVA,@Ri
;(Ri)→A
MOVA,#data ;data→A
将源操作数指定内容送到A中。(2)以寄存器Rn为目的操作数的指令(3条)MOVRn,A
MOVRn,direct
MOVRn,#data
这组指令功能是把源操作数指定的内容送入当前工作寄存器,源操作数不变。1.内部数据传送指令MOV
(3)以寄存器间接地址为目的字节的传送指令(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(4)以直接地址为目的操作数的指令(5条) MOVdirect,A
MOVdirect,Rn
MOVdirect1,direct2 MOVdirect,@Ri MOVdirect,#data
这组指令功能是把源操作数指定的内容送入由直接地址指出的片内存储单元。例:
MOV20H,A MOV20H,R1 MOV20H,30H MOV20H,@R1 MOV0A0H,#34H MOVP2,#34H(5)16位数据传送指令(1条) MOVDPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。
例:MOVDPTR,#1234H执行完了之后DPH中的值为12H,DPL中的值为34H。如果我们分别向DPH,DPL送数,则结果也一样。如下面两条指令:MOVDPH,#35H MOVDPL,#12H。则就相当于执行了MOVDPTR,#3512H。(6)查表指令(2条)MOVCA,@A+DPTR ;A←((A)+(DPTR))MOVCA,@A+PC
;A←((A)+(PC))已知内存单元40H中有一个0~9范围内的数,用查表指令编出能查出该数立方值的程序。设立方表表头地址为0200H。程序及执行后的结果如下:
MOVA,40HMOVDPTR,#LABMOVCA,@A+DPTR……LAB:DB0,1,8,27,64……若(40H)为2,查表得8并存于A中
2.外部数据传送指令MOVX(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单元中。
MOVDPTR,#0100H MOVXA,@DPTR MOVDPTR,#0200H MOVX@DPTR,A3.堆栈操作指令(PUSH、POP)(2条)
PUSHdirect
;SP
SP+1,(SP)(direct)
POPdirect;(direct)(SP),SP
SP-1第一条为压入指令,就是将direct中的内容送入堆栈中,第二条为弹出指令,就是将堆栈中的内容送回到direct中。例: MOVSP,#5FH MOVA,#100 MOVB,#20
PUSHACC PUSHB
则执行第一条PUSHACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSHB时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,61H单元中的值变为20。4.数据交换指令(5条)
XCHA,Rn
;A←→Rn
XCHA,direct
;A←→(direct)
XCHA,@Ri
;A←→(Ri)
XCHDA,@Ri
;A.3~A.0←→(Ri).3~(Ri).0
SWAPA
;A.3~A.0←→A.7~A.4例:已知A中的内容为34H
MOVR6,#29H XCHA,R6 SWAPA XCHA,R6
XCHDA,@R0;R6=29H;A=29H,R6=34H;A=92H;A=34H,R6=92H;A=36H,(R0)=54H(设原来R0;指向的单元的内容为56H)(40H)=H50H=HA=H(41H)=H51H=HR0=H
课堂练习设:内部RAM中,(40H)=50H,(41H)=60H,(50H)=30H,(51H)=70H,执行下列片段后:MOVR0,40HMOVA,@R0INCR0MOV@R0,Ab.MOVR0,#40HMOVA,@R0INC@R0MOVA,@R0;R0=50H;A=30H;R0=51H;(51H)=30H;R0=40H;A=50H;(40)=51H;A=51H给出每条指令执行后的结果MOV23H,#30HMOV12H,#34HMOVR0,#23HMOVR7,12HMOVR1,#12HMOVA,@R0MOV34H,@R1MOV45H,34HMOVDPTR,#6712HMOV12H,DPHMOVR0,DPLMOVA,@R0;(23H)=30H;(12H)=34H;R0=23HXXXXXXXXXXXXXXXXXXDPHDPL45H34H23H12HR7R1R0XXXXXXXX3034XXXX23XXXXXXXX3034341223671234343034341223671234343067341212;R7=34H;R1=12H;A=30H;(34H)=34H;(45H)=34H;DPTR=6712H;(12H)=67H;R0=12H;A=67H内部RAM3.利用传送类指令并用多种方法将内部RAM中50H单元的内容与40H单元的内容互换。算术运算类指令(24条)ArithmeticOperations
主要对8位无符号数;也可用于带符号数运算。包括:加、减、乘、除、加1、减1运算指令。
影响PSW有关位。1.加法指令(13条)
ADDA,#data
;A+data→A
ADDA,direct
;A+(direct)→A
ADDA,Rn
;A+Rn→A
ADDA,@Ri
;A+(Ri)→A用途:将A中的值与源操作数所指内容相加,最终结果存在A中。(1)不带进位位的加法指令(4条)例1:ADDA,#47H ADDA,34H ADDA,R7 ADDA,@R0例2:MOVA,#0AEH;-82D ADDA,#81H;-127D则执行完本条指令后,A中的值为2FH;C=1,AC=0,OV=1,P=1。对无符号数:结果为12FH;带符号数运算:OV=1,有错。实验验证一下本例(2)带进位位的加法指令(4条)
ADDCA,Rn
;A+Rn+CY→A
ADDCA,direct
;A+(direct)+CY→A
ADDCA,@Ri
;A+(Ri)+CY→A
ADDCA,#data
;A+data+CY→A用途:将A中的值和其后面的值以及进位位C中的值相加,最终结果存在A,常用于多字节数运算中。说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0~255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到0~65535。例:
先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。然后再做10H+30H+CY,结果是41H,所以最终的结果是4107H。1067H+30A0H0001000001100111001100001010000001000001000001111067H30A0H4107H设:1067H存在R1R0中,30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。MOVA,R0ADDA,R2;R0+R2→A和CYMOVR4,AMOVA,R1ADDCA,R3;R1+R3+CY→A和CYMOVR5,A又例:
先做67H+20H=87H,没有超过0FFH,因此最终保存在A中的是87H,而PSW中的CY=0。然后再做10H+30H+CY,结果是40H,所以最终的结果是4087H。1067H+3020H0001000001100111001100000010000001000000100001111067H3020H4087H实验验证一下本例设:1067H存在R1R0中,3020H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。(3)加1指令(5条)INCA
;A+1→A,影响P标志INCRn
;Rn+1→RnINCdirect
;(direct)+1→(direct)INC@Ri
;(Rn)+1→(Rn)INCDPTR
;DPTR+1→DPTR功能很简单,就是将后面目标中的值加1。例:A=12H,R0=33H,(21H)=32H,
(34H)=22H,DPTR=1234H。连续执行下面的指令:
INCAINCR0INC21HINC@R0INCDPTR;A=13H;R0=34H;(21H)=33H;(34H)=23H;DPTR=1235H2.减法指令(8条)SUBBA,Rn
;A-Rn-CY→ASUBBA,direct;A-(direct)-CY→ASUBBA,@Ri
;A-(Ri)-CY→ASUBBA,#data ;A-data-CY→A将A中的值减去源操作数所指内容以及进位位C中的值,最终结果存在A中。如:SUBBA,R2设:A=C9H,R2=55H,CY=1,执行指令之后,A中的值为73H。(1)带借位的减法指令(4条)说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。对带符号数,要注意OV标志。OV=1,出错。(2)减1指令(4条)DECA
;A-1→A,影响P标志DECRn
;Rn-1→RnDECdirect
;(direct)-1→(direct)DEC@Ri
;(Rn)-1→(Rn)
与加1指令类似。DAA在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用来对BCD码加法运算结果进行自动修正。例:A=00010101BCD(代表十进制数15)
ADDA,#83.十进制调整指令(1条);A=1DH,按二进制规律加;A=23H,按十进制规律加DAA【例】编写程序完成68+89的BCD加法程序,并对调整过程进行分析。解:二进制加法和十进制调整过程为:4.乘法指令(1条)MULAB
;A×B→BA此指令的功能是将A和B中的两个8位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。在乘积大于FFH时,0V置1,否则OV为0;而CY总是0。例:A=4EH,B=5DH,执行指令MULAB后,乘积是1C56H,所以在B中放的是1CH,而A中放的则是56H。OV=1P=05.除法指令(1条)DIVAB
;A÷B的商→A,余数→B此指令的功能是将A中的8位无符号数除B中的8位无符号数(A/B)。除了以后,商放在A中,余数放在B中。CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么0V=1。如:A=11H,B=04H,执行指令DIVAB后,结果:A=04H,B=1。CY=0OV=0P=1总结:算数运算类指令对标志位的影响练习试编写1234H-0FA3H的程序段,将结果高8位存入51H,低8位存入50H单元。MOVA,#34HSUBBA,#0A3HMOV50H,AMOVA,#12HSUBBA,#0FHMOV51H,ACLRC逻辑运算指令(24条)LogicOperations主要用于对2个操作数按位进行逻辑操作,结果送到A或直接寻址单元。
主要操作与、或、异或、移位、取反、清零等。
对标志位的影响除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。1.逻辑“与”指令(6条)ANd
LogicInstruction
ANLA,Rn
;A∧Rn→AANLA,direct
;A∧(direct)→AANLA,@Ri
;A∧(Ri)→AANLA,#data
;A∧data→AANLdirect,A
;(direct)∧A→(direct)ANLdirect,#data
;(direct)∧data→(direct)影响P标志例:71H和56H相与:
01110001(71H) ∧)01010110(56H)01010000即50H后两条指令,若直接地址为I/O端口,则为“读-改写”操作。例:MOVA,#45HMOVR1,#25HMOV25H,#79HANLA,@R1ANL25H,#15HANL25H,A;A=45H;R1=25H;(25H)=79H;45H∧79H=41H→A;79H∧15H=11H→(25H);11H∧41H=01H→(25H)2.逻辑或指令(6条)OR
LogicInstructionORLA,Rn ;A∨Rn→AORLA,direct ;A∨(direct)→AORLA,@Ri ;A∨(Ri)→AORLA,#data ;A∨data→AORLdirect,A ;(direct)∨A→(direct)ORLdirect,#data;(direct)∨data→(direct)影响P标志例:71H和56H相或:
01110001(71H) ∨)01010110(56H)01110111即77H后两条指令,若直接地址为I/O端口,则为“读-改写”操作。
例:MOVA,#45HMOVR1,#25HMOV25H,#39HORLA,@R1ORL25H,#13HORL25H,A;A=45H;R1=25H;(25H)=39H;45H∨39H=7DH→A;39H∨13H=3BH→(25H);3BH∨7DH=7FH→(25H)例:71H和56H相异或:
01110001(71H)
⊕)01010110(56H)
3.逻辑异或指令(6条)eXclusive-oR
LogicInstructionXRLA,Rn ;A⊕Rn→AXRLA,direct ;A⊕(direct)→AXRLA,@Ri ;A⊕(Ri)→AXRLA,#data ;A⊕data→AXRLdirect,A ;(direct)⊕A→(direct)XRLdirect,#data;(direct)⊕data→(direct)影响P标志00100111即27H后两条指令,若直接地址为I/O端口,则为“读-改写”操作。例:MOVA,#45HMOVR1,#25HMOV25H,#39HXRLA,@R1XRL25H,#13HXRL25H,A;A=45H;R1=25H;(25H)=39H;45H⊕39H=7CH→A;39H⊕13H=2AH→(25H);2AH⊕7CH=56H→(25H)4.清0与取反指令(2条)(1)取反(ComPlementLogicOperation)CPLA;/A→A例:若A=5CH,执行CPLA
结果:A=A3H(2)清0CLRA
;0→A循环移位指令(4条)Rotate
LogicinstructionRLA
RRARLCARRCAA.7 A.0A.7 A.0A.7 A.0CYCYA.7 A.0后两条指令,影响P标志和CY。例:若A=5CH,CY=1,执行RLCA后,
对RLC、RRC指令,在CY=0时
RLC相当于乘以2 RRC相当于除以2结果:A=B9H,CY=0,P=1010111001101110010综合举例:ANLA,#0FH ;屏蔽A的高4位SWAPAANLP1,#0FH ;清P1口高4位ORLP1,A;P1口高4位输出A的低4位;把累加器A中的低4位状态,通过P1口的高4位输出,P1口的低4位状态不变。控制转移类指令(17条)
BranchingInstruction共有控制程序转移类指令(不包括位操作类的转移指令)。此类指令一般不影响PSW。包括以下类型:无条件转移和条件转移相对转移和绝对转移长转移和短转移调用与返回指令1.无条件转移类指令(4条)
短转移类指令:AJMPaddr11
长转移类指令:LJMPaddr16
相对转移指令:SJMPrel
间接转移指令:JMP@A+DPTR(1)上面的前三条指令,统统理解成:PC值改变,即跳转到一个标号处。
那么他们的区别何在呢?跳转的范围不同。
短转移类指令:AJMPaddr11
长转移类指令:LJMPaddr16
相对转移指令:SJMPrel转移范围:2KB64KB-128~+127指令构成不同。
AJMP、LJMP后跟的是绝对地址,而SJMP后跟的是相对地址。
指令长度不同原则上,所有用SJMP或AJMP的地方都可以用
LJMP来替代。间接转移指令:JMP@A+DPTR
这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。转移地址由A+DPTR形成,并直接送入PC。指令对A、DPTR和标志位均无影响。本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。(2)第四条指令与前三条指令相比有所不同例:MOVDPTR,#TAB;将TAB代表的地址送入DPTRJMP@A+DPTR;跳转TAB:AJMPROUT0;跳转ROUT0开始的程序段TAB+2:AJMPROUT1;跳转ROUT1开始的程序段TAB+4:
AJMPROUT2;跳转ROUT2开始的程序段TAB+6:
AJMPROUT3;跳转ROUT3开始的程序段
...ROUT0:
...ROUT1:
...ROUT2:
...ROUT3:执行该段程序后,程序将根据A中的内容转移到不同的程序段去执行----散转。A=0,转ROUT0A=2,转ROUT1A=4,转ROUT2A=6,转ROUT32.条件转移指令(8条)条件转移指令是指在满足一定条件时进行相对转移,否则程序继续执行本指令的下一条指令。(1)判A内容是否为0转移指令(2条)JZrel;如果A=0,则转移,否则顺序执行。
JNZ
rel;如果A≠0,就转移。转移到相对于当前PC值的8位移量的地址去。即:
新的PC值=当前PC+偏移量rel我们在编写汇编语言源程序时,可以直接写成:
JZ
标号 ;即转移到标号处。例:MOVA,R0
JZL1MOVR1,#00HAJMPL2L1:MOVR1,#0FFH
L2:SJMPL2END
在执行上面这段程序前:如果R0=0,结果R1=0FFH。而如果R0
0,则结果是R1=00H。把上面的那个例子中的JZ改成JNZ,看看程序执行的结果是什么?
如果R0=0,结果R1=00H。如果R0
0,结果是R1中的值为0FFH。(2)比较不等转移指令(4条)CJNEA,#data,rel
CJNEA,direct,relCJNERn,#data,relCJNE@Ri,#data,rel此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。同样地,使用时,我们可以将rel理解成标号,即:
CJNEA,#data,标号
CJNEA,direct,标号
CJNERn,#data,标号
CJNE@Ri,#data,标号利用这些指令,可以判断两数是否相等。但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能:如果两数不相等,则CPU还会用CY(进位位)来反映哪个数大,哪个数小。如果前面的数大,则CY=0,否则CY=1。因此在程序转移后再次利用CY就可判断出哪个数大,哪个数小了。例: MOVA,R0CJNEA,#10H,L1MOVR1,#0;如R0=10H,则不转移R1=00H;
AJMPL3L1:JCL2 ;如CY=1即R0<10H,则转移
MOVR1,#0AAH;否则CY=0即R0>10H,则转移
AJMPL3L2:MOVR1,#0FFHL3:SJMPL3因此最终结果是:本程序执行前,如果R0=10H,则R1=00H;如果R0>10H,则R1=0AAH;如果R0<10H,则R1=0FFH。(3)减1不为0转移指令(2条)DJNZRn,relDJNZdirect,relDJNZ指令的执行过程是这样的:它将第一个参数中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到第二个参数所指定的地方去。例:
DJNZ10H,LOOP...LOOP:...例:
MOV23H,#0AHCLRALOOP:ADDA,23HDJNZ23H,LOOPSJMP$上述程序段的执行过程是:将23H单元中的数连续相加,存至A中,每加一次,23H单元中的数值减1,直至减到0,共加(23H)次。3.子程序调用和返回
(1)调用指令(2条)
LCALLaddr16
;长调用指令(3字节)
ACALLaddr11
;短调用指令(2字节)上面两条指令都是在主程序中调用子程序,两者的区别:对短调用指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的2KB存储区之内。使用时可以用以下指令来调用子程序:
LCALL
标号;标号表示子程序首地址
ACALL
标号
指令的执行过程是:当前PC压栈,子程序首地址送PC,实现转移。(2)返回指令(2条)子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就可以了。RET
;子程序返回指令RETI
;中断子程序返回指令两者不能互换使用。RET指令的执行过程是:堆栈栈顶内容(2字节,调用时保存的当前PC值)弹出给PC,实现返回。RETI指令除了具有RET指令的功能实现程序返回外,还有对中断优先级状态触发器的清零。4.空操作指令(1条)
NOP空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。位操作指令
(17条)BooleanOperationsMCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等。在MCS-51中,有一部份RAM和一部份SFR是具有位寻址功能的。位操作区:内部RAM的20H~2FH这16个字节单元,即128个位单元(位地址空间位00~7FH)。可以进行位寻址的特殊功能寄存器:这些SFR的特点是其字节地址均可被8整除,如A累加器,B寄存器、PSW、IP(中断优先级控制寄存器)、IE(中断允许控制寄存器)、SCON(串行口控制寄存器)、TCON(定时器/计数器控制寄存器)、P0~P3(I/O端口锁存器)。位地址表达方式:
以PSW中第4位(
RS1)为例。直接(位)地址方式:如D4H;点操作符号方式:如PSW.4,D0H.4;位名称方式:如RS1;用户定义名方式:如用伪指令bit
SUB.REGbit
RS1定义后,可用SUB.REG代替RS1。*在进行位处理时,CY用作“位累加器”。1.位传送指令
(2条)
MOVC,bit ;bit→CMOVbit,C ;C→bit这组指令的功能是实现位累加器(CY)和其它位地址之间的数据传递。例:MOVC,P1.0 ;将P1.0的状态送给C。
MOVP1.0,C;将C中的状态送到P1.0
;引脚上去。2.位清0和置位(4条)(1)位清0指令
CLRC
;使CY=0CLRbit
;使指令的位地址等于0。例:CLRP1.0;即使P1.0变为0
(2)位置1指令
SETBC
;使CY=1SETBbit
;使指定的位地址等于
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度足浴店员工薪资保底发放与员工培训计划合同
- 皮革制品股权转让居间协议
- 农药化肥销售居间协议
- 个人购买室内门合同范例
- 公共场所卫生保洁合同范例
- 众筹开公司合同范例
- 农民出售青苗合同范例
- 专利代理所合同范例
- 做酒店合同范例
- 农业银行合同范例
- 童装专卖店营销策划方案
- 尼康D5200说明书简体中文
- 事业单位工作人员退休(职)登记表
- 前程无忧招聘测评题库及答案
- 2024解析:第十章 浮力综合应用-基础练(解析版)
- 【MOOC】社会调查与研究方法-北京大学 中国大学慕课MOOC答案
- 2024年下半年杭州市余杭区瓶窑镇招考易考易错模拟试题(共500题)试卷后附参考答案
- 自身免疫性脑炎护理常规
- 2025年慢性阻塞性肺疾病全球创议GOLD指南修订解读课件
- 幼儿园小班健康公开课《笑一笑》课件
- 认识晶体(完整版)课件
评论
0/150
提交评论