51手记之指令篇
三、逻辑运算与循环类指令
共有24条指令。逻辑运算指令主要包括逻辑"与"、"或"、"异或"、求反和清零;循环指令则都是对A的大循环操作,包括有左、右方向以及带与不带进位位的不同循环方式。
1.与操作
ANLA,Rn
ANLA,dir
ANLA,@Ri
ANLA,#data
执行该指令后相与的记过保存在A中
ANLdir,A
ANLdir,#data
2.或操作
ORLA,Rn
ORLA,dir
ORLA,@Ri
ORLA,#data
执行该指令后相与的记过保存在A中
ORLdir,A
ORLdir,#data

例A=16H,指令RR A执行后,A=0BH。
综合例:把R2R3中的16位补码数(高位在R2中)右移一位,并不改变符号。
MOVA,R2
MOVC,ACC.7;把符号位存入进位位C
RRCA
MOVR2,A
MOVA,R3
RRCA
MOVR3 , A
SJMP$
四、子程序调用与转移类指令
共有14条指令。子程序调用类有绝对调用和长调用两种;转移类分为无条件转移和条件转移两组。无条件转移包括绝对转移、长转移、短转移和间接转移;条件转移包括结果为零、结果为非零、减一后结果为非零以及两数不相等的转移条件,它们全部采用相对转移的方式。
绝对于程序调用和绝对转移指令的机器码形式比较特殊,操作码不是在前面而是在中间,并且调用和转移的范围都只在2K地址范围内,这在使用时应予以注意。
1.绝对调用
ACALL addrll;addrll一PC0-10,PC11-16不变
说明:
①调用范围:本指令在2K地址范围内的子程序调用。本指令实现的操作将不改变原PC的高5位(PC1l-15),仅把11位地址addrll送入PC的低11位(PC0-10),以此确定子程序的入口地址。由于整个64K程序存储器空间被分成32个基本2K地址范围(见表2.1),编程时,必须保证紧接AC从L指令后面的那一条指令的第一字节与被调用于程序的入口地址在同一2K范围内,否则将不能使用ACALL指令实现这种调用。
②机器码形式:本指令为二字节指令。设子程序入口地址addrll的各位是a10a9a8a7a6a5a4a3a2a1a。,则ACALL指令的二进制机器码为a10a9a810001a7a6a5a4a3a2a1a0,其中10001为ACALL指令的操作码。
例:子程序调用指令ACALL在程序存储器中的首地址为0100H,子程序入口地址为0250H。试确定能否使用ACALL指令实现调用?如果能使用,确定该指令的机器码。
解:因为ACALL指令的首地址在0100H,而ACALL是2字节指令,所以下一条指令的首地址在0102H。由表2.1可见,0102H和0250H在同一2K地址范围内,故可用ACALL调用。调用入口地址为0250H的ACALL指令的机器码形式为:0101000101010000B=5150H
2.长调用
LCALL addrl6;addrl6一PCo-l5
说明:本指令为64K程序存储器空间中的全范围子程序调用指令,子程序入口地址可在64K地址空间中的任一处。本指令为3字节指令。
3.无条件转移指令
(1)绝对转移
AJMP addrll;addrll一PC0-10
说明:①转移范围:本指令为2K地址范围内的转移指令。对转移目的地址的要求与ACALL指令中对于程序入口地址的要求相同。
②机器码形式:本指令为2字节指令。设addrll的各位是a10a9a8a7a6a5a4a3a2a1a0,则指令AJMP addrll的二进制机器码为al0a9a800001a7a6a5a4a3a2ala0。

例:绝对转移指令AJMP在程序存储器中的首地址为2500H,要求转移到2250H地址处执行程序,试确定能否使用AJMP指令实现转移?如能实现,其指令的机器码形式是什么?
解:因为AJMP指令的首址为2500H,其下一条指令的首址为2502H,由表2.1可见,2502H与转移目的地址2250H在同一2K地址范围内,故可用AJMP指令实现程序的转移。指令的机器码:0100000l01010000B=4150H
(2)长转移
LJMP addrl6;addrl6一PC0-15
说明:本指令为64K程序存储器空间的全范围转移指令。转移地址可为16位地址值中的任一值。本指令为3字节指令。
(3)短转移
SJMP rel;PC十2十rel-PC
说明:本指令为一页地址范围内的相对转移指令。因为rel为l字节补码(偏移量),且SJMP rel指令为2字节指令,所以转移范围为一126D到十129D。
(4)间接转移
JMP@A十DPTR;A十DPTR-PC
例1:A=02H,DPTR=2000H,指令JMP@A十DPTR执行后,PC=2002H。也就是说,程序转移到2002H地址单元去执行。
例2:现有一段程序:
MOVDPTR,#TABLE
JMP@A十DPTR
TABLE:AJMPRoUT0
AJMPRoUTl
AJMPRoUT2
: :
AJMP ROUTn
根据JMP@A十DPTR指令的操作可知,当A=00H时,程序转入到地址ROUT0处执行;当A=02H时,转到ROUTl处执行……。可见这是一段多路转移程序,进入的路数由A确定。因为AJMP指令是2字节指令,所以要求A必定为偶数。
4.条件转移指令
(1)累加器为零(非零)转移
JZ rel;A=0则转移(PC十2十rel一PC),A≠0程序顺序执行
JNZ rel;A≠0则转移(PC+2+rel-PC),A=0程序顺序执行
(2)减一非零转移
DJNZ Rn,rel;Rn一1-Rn,Rn≠0,则转移(PC十2十re- PC),Rn=0,程序顺序执行
DJNZ dir,rel;(dir)一l-dir,(dir)≠0则转移(PC十3十rel-PC),(dir)=0,程序顺序执行
说明:UNZ Rn,rel是2字节指令,而DJNZ dir,rel是3字节指令,所以在满足转移的条件后,前者是PC十2十rel一PC,而后者是PC十3十rel一PC。
例:试说明下列一段程序运行后A中的结果。
MOV 23H,#0AH
CLRA
LOOP:ADDA,23H
DJNZ23H,LOOP
SJMP$
根据程序可知,运算结果A=10+9+8+7+6+5+4+3+2+1=55D=37H
(2)两数不等转移
CJNEA,dir,rel
CJNEA,#data,rel
CJNERn,#data,rel
CJNE@Ri,#data,rel
说明:1CJNE指令都是3字节指令。
2若第一操作数大于或等于第二操作数,则影响标志C=0(如指令CJNE A,dir,rel中A>=(dir)等);若第一操作数小于第二操作数,则C=l(如指令CJNE A,dir,rel中A<(d5r)等)。利用对C的判断,可使这几条指令实现两操作数相等与否的判断,还可完成两数大小的比较。
例1:R7=56H,指令CJNE R7,#34H,$十08H执行后,程序转移到放本条CJNE指令的首地址($)加08H后的地址单元去执行。
例2:安排程序,要求读Pl端口上的信息,若不为55H则程序停着等待,只有到P1端口为55H时,程序往下顺序执行。
程序为:MOVA,#55H
CJNEA,P1,$
5.相对偏移量rel的求法
在短转移和条件转移中,用偏移量rel和转移指令所处的地址值来计算转移的目的地址。rel是1字节补码值,如rel是正数的补码,程序往前转移;如rel是负数的补码,程序往回转移。下面介绍计算rel大小的方法。
设本条转移指令的首地址为ad--源地址,字节数为Bn-2字节或3字节,要转移到的地址为ad--目的地址,这三者之间的关系为:
ad=as十Bn十rel补
于是reI=(Ad-As一8n)补
这就是在已知源地址,目的地址和指令的长度时,计算rel大小的公式。
由于程序中的时、分、秒数是已经作过十进制调正后的BCD数,因此#60H,#60H,#24H虽以十六进制数出现,但却表示BCD数。
在于程序调用与转移指令中,由于绝对转移和绝对调用指令AJMP和ACALL指令字节少,转移范围大,因而是常用的指令。但使用时应注意其机器码形式及允许使用的条件。相对转移类指令因本身长度有2字节和3字节之分,这会影响到偏移量大小的计算,因而也要十分注意。此外,条件转移指令中,由于没有结果为正和结果为负等转移条件的指令,因而这些转移的要求,只能由CJNE指令加上对进位位的判断来实现。
五、位操作类指令
共有17条指令。其共同特点是对进位位C和直接位地址Nt的操作。其中包括清零、置1、求反、逻辑与、逻辑或、传送以及判断转移。MCS-51单片机中这些丰富的位操作指令表现出其具有优异的布尔处理能力
1.清位
CLRC;C=0
CLRbit ;bit=0
2.置位
SETBC;C=1
SETBbit ;bit=1
3.位求反
CPLC;C取反
CPLbit ;bit取反
4.位与
ANLC,bit;C = bit and C
5.位或
ORLC,bit;C = C or bit
6.位传送
MOVC,bit;C = bit
MOVbit,C;bit = C
评论