MCS-51单片机指令系统(3)

2023-03-24 23:00   229   0  

指令按寻址方式分有 7种寻址方式,直接寻址(direct)、立即寻址(#20H) 、寄存器寻址(Rn)、寄存器间接寻址(@Ri)、相对寻址(rel)、寄存器变址寻址(@A+PC)、位寻址 ( ACC.1)




指令按功能上分有5种 ,传送类指令 、算术运算类指令、逻辑运算及移位类指令、控制转移类指令、位操作类指令。其指令三大属性:功能属性、空间属性(指令站用的字节数)、时间属性(指令执行的机器周期数)。




一、数据传送指令(28):


使用最频繁的一类指令,通用格式:


MOV ,


属“复制”性质,而不是“搬家”。数据传送类指令不影响标志位:Cy、Ac和OV,影响奇偶标志位P。




1.内部RAM数据传送指令(16条)


(1)以累加器为目的操作数的指令(4条)


MOV A,Rn ; (Rn)→A,n=0~7


MOV A,@Ri ; ((Ri))→A,i=0,1


MOV A,direct ;(direct)→A


MOV A,#data ; #data→A


(2) 以Rn为目的操作数的指令(3条)


MOV Rn,A ; (A)→Rn,n=0~7


MOV Rn,direct ;(direct)→Rn,n=0~7


MOV Rn,#dat ; #data→Rn,n=0~7


功能:是把源操作数的内容送入当前一组工作寄存器区的R0~R7中的某一个寄存器。


(3)以直接地址direct为目的操作数的指令(5条)


MOV direct,A ; (A)→direct


MOV direct,Rn;(Rn)→direct, n=0~7


MOV direct1,direct2;


MOV direct,@Ri ; ((Ri))→direct


MOV direct,#data; #data→direct


功能:把源操作数送入直接地址指出的存储单元。direct指的是内部RAM或SFR的地址。


(4)以寄存器间接地址为目的操作数的指令(3条)


MOV @Ri,A ;(A)→((Ri)),i=0,1


MOV @Ri,direct ; (direct)→((Ri))


MOV @Ri,#data ; #data→((Ri))


(5)16位数传送指令 (1条)


MOV DPTR,#data16 ; #data16→DPTR


唯一的16位数据的传送指令 ,立即数的高8位送入DPH,立即数的低8位送入DPL。




2.堆栈操作指令(2条)


MCS-51内部RAM中可以设定一个后进先出(LIFO-Last In First Out)的区域称作堆栈。堆栈指针SP指出堆栈的栈顶位置。进栈指令


PUSH direct


先将栈指针SP加1,然后把direct中的内容送到栈指针SP指示的内部RAM单元中。


出栈指令


POP direct


SP指示的栈顶(内部RAM单元)内容送入direct字节单元中,栈指针SP减1。




3.累加器A与外部数据存储器传送指令(4)


MOVX A,@DPTR ;((DPTR))→A,读外部RAM/IO


MOVX A,@Ri ;((Ri))→A,读外部RAM/IO


MOVX @DPTR,A;(A)→((DPTR)),写外部RAM/IO


MOVX @Ri,A ;(A)→((Ri)),写外部RAM/IO


功能:读外部RAM存储器或I/O中的一个字节,或把A中一个字节的数据写到外部RAM存储器或I/O中。


注意:RD*或WR*信号有效。


采用DPTR间接寻址,高8位地址(DPH)由P2口输出,低8位地址(DPL)由P0口输出。


采用Ri(i=0,1)间接寻址,可寻址片外RAM的256个单元。Ri内容由P0口输出。


MOV后 “X”表示单片机访问的是片外RAM存储器或I/O。




4.程序ROM数据传送指令查表指令(2条)


用于读程序存储器中的数据表格的指令,均采用基址寄存器加变址寄存器间接寻址方式。


(1)MOVC A,@A+PC


以PC作基址寄存器,A的内容作为无符号整数和PC中的内容(下一条指令的起始地址)相加后得到一个16位的地址,该地址指出的程序存储单元的内容送到累加器A。


注意:PSEN*信号有效。


优点:不改变特殊功能寄存器及PC的状态,根据A的内容就可以取出表格中的常数。


缺点:表格只能存放在该条查表指令后面的256个单元之内,表格的大小受到限制,且表格只能被一段程序所利用。


(2)MOVC A,@A+DPTR


以DPTR作为基址寄存器,A的内容作为无符号数和DPTR的内容相加得到一个16位的地址,把由该地址指出的程序存储器单元的内容送到累加器A. 本指令的执行结果只和指针DPTR及累加器A的内容有关,与该指令存放的地址及常数表格存放的地址无关,因此表格的大小和位置可以在64K程序存储器中任意安排,一个表格可为各个程序块公用。


两条指令是在MOV的后面加C,“C”是CODE的第一个字母,即代码的意思。




5.数据交换指令(4条)


(1)整字节数据交换指令(3条)


XCH A,Rn


XCH A,direct


XCH A,@Ri


(2)半字节交换指令:累加器的低4位与内部RAM低4位交换。


XCHD A,@Ri




二、算术操作类指令(24条)


单字节的加、减、乘、除法指令,都是针对8位二进制无符号数。执行的结果对Cy、Ac、OV 三种标志位有影响。但增1和减1指令不影响上述标志。


1.加法指令(4条)


ADD A,Rn ;(A)+(Rn)→A,n=0~7


ADD A,direct ;(A)+(direct)→A


ADD A,@Ri ;(A)+((Ri))→A,i=0,1


ADD A,#data ; (A)+#data→A


一个加数总是来自累加器A,而另一个加数可由不同的寻址方式得到。结果总是放在A中。使用加法指令时,要注意累加器A中的运算结果对各个标志位的影响:


(1)如果位7有进位,则置“1”进位标志Cy,否则清“0”Cy


(2)如果位3有进位,置“1”辅助进位标志Ac,否则清“0”Ac(Ac为PSW寄存器中的一位)


(3)如果位6有进位,而位7没有进位,或者位7有进位,而位6没有,则溢出标志位OV置“1”,否则清“0”OV。溢出标志位OV的状态,只有在带符号数加法运算时才有意义。当两个带符号数相加时,OV=1,表示加法运算超出了累加器A所能表示的带符号数的有效范围。




2.带进位加法指令(4条)


标志位Cy参加运算,因此是三个数相加。


ADDC A,Rn ;(A)+(Rn)+C→A,n=0~7


ADDC A,direct ;(A)+(direct)+C→A


ADDC A,@Ri ;(A)+(Ri)+C→A,i=0,1


ADDC A,#data ;(A)+#data+C→A




3.增1指令 (5条)


INC A


INC Rn ;n=0~7


INC direct


INC @Ri ;i=0,1


INC DPTR


不影响PSW中的任何标志。第5条指令INC DPTR,是16位数增1指令。指令首先对低8位指针DPL的内容执行加1的操作,当产生溢出时,就对DPH的内容进行加1操作,并不影响标志Cy的状态。




4.十进制调整指令(1条)


用于对BCD码十进制数加法运算结果的内容修正。


指令格式: DA A


两个BCD码按二进制相加之后,必须经本指令的调整 才能得到正确的压缩BCD码的和数。二进制数的加法运算原则并不能适用于十进制数的加法运算,有时会产生错误结果。




出错原因和调整方法:


BCD码只用了了其中的10个,6个没用到的编码。(1010,1011,1100,1101,1110,1111)为无效码 。凡结果进入或者跳过无效码编码区时,其结果就是错误的。调整的方法是把结果加6调整,即所谓十进制调整修正。


修正方法应是:


(a)累加器低4位大于9或辅助进位位Ac=1,则进行低4位加6修正。


(b)累加器高4位大于9或进位位Cy=1,则进行高4位加6修正。


(c)累加器高4位为9,低4位大于9,则高4位和低4位分别加6修正。


具体是通过执行指令:DA A 来自动实现的 。




5.带借位的减法指令(4条)


SUBB A,Rn ; (A)-(Rn)- Cy→A,n=0~7


SUBB A,direct ; (A)-(direct)- Cy→A


SUBB A,@Ri;(A)-((Ri))- Cy→A, i=0,1


SUBB A,#data ;(A)-#data - Cy→A


从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存在累加器A中。


如果位7需借位则置“1” Cy,否则清“0”Cy;


如果位3需借位则置“1”Ac,否则清“0”Ac;


如果位6需借位而位7不需要借位,或者位7需借位,位6不需借位,则置“1”溢出标志位OV,否则清“0”OV。




6.减1指令(4条)


DEC A ;(A)-1→A


DEC Rn ;(Rn)-1→Rn,n=0~7


DEC direct ;(direct)-1→direct


DEC @Ri ;((Ri))-1→(Ri),i=0,1


减1指令不影响标志位。




7.乘法指令(1条)


MUL AB ;A×B→BA


如果积大于255,则置“1”溢出标志位OV




8.除法指令 (1条)


DIV AB ;A/B→A(商),余数→B


如果B的内容为“0”(即除数为“0”),则存放结果的A、B中的内容不定,并置“1”溢出标志位OV。




三、 逻辑运算指令(25条)


1. 简单逻辑操作指令(2条)


(1) CLR A


功能是累加器A清“0”。不影响Cy、Ac、OV等标志。


(2) CPL A


功能:累加器A的内容按位逻辑取反,不影响标志。


2.左环移指令


RL A


功能是累加器A的8位向左循环移位,位7循环移入位0,不影响标志。


3.带进位左环移指令


RLC A


功能是将累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy移入Acc.0,不影响其它标志。


4.右环移指令


RR A


功能是累加器A的内容向右环移一位,Acc.0移入Acc.7,不影响其它标志。


5.带进位环移指令


RRC A


功能:累加器A的内容和进位标志Cy一起向右环移一位,Acc.0进入Cy,Cy移入Acc.7。


6.累加器半字节交换指令


SWAP A


将累加器A的高半字节(Acc.7~Acc.4)和低半字节(Acc.3~Acc.0)互换。


7.逻辑与指令


ANL A,Rn ; (A)∧(Rn)→A,n=0~7


ANL A,direct ; (A)∧(direct)→A


ANL A,#data ; (A)∧#data→A


ANL A,@Ri ; (A)∧((Ri))→A,i=0~1


ANL direct,A ; (direct)∧(A)→direct


ANL direct,#data ; (direct)∧#data→direct


8.逻辑或指令


ORL A,Rn ;(A)∨(Rn)→A ,n=0~7


ORL A,direct ;(A)∨(direct)→A


ORL A,#data ;(A)∨ data→A


ORL A,@Ri ; (A)∨((Ri))→A,i=0,1


ORL direct,A ;(direct)∨(A)→direct


ORL direct,#data ;(direct)∨#data→direct


9.逻辑异或指令


XRL A,Rn ;(A) ⊕(Rn)→A


XRL A,direct ;(A) ⊕(direct)→A


XRL A,@Ri ;(A)⊕((Ri))→A ,i=0,1


XRL A,#data ;(A)⊕#data→A


XRL direct,A ;(direct)⊕(A)→direct


XRL direct,#data;(direct)⊕ #data →direct




四、 控制转移类指令(17条)


1.无条件转移指令


AJMP addrll


2K字节范围内的无条件跳转指令, 64K程序存储器空间分为32个区,每区2K字节,转移的目标地址必须与AJMP下一条指令的地址的高5位地址码A15-A11相同。执行指令时,先PC加2,然后把addrll送入PC.10~PC.0,PC.15~PC.11保持不变,程序转移到目标地址。


本指令是为能与MCS-48的JMP指令兼容而设的。


2.相对转移指令


SJMP rel


实现的程序转移是双向的。在编写程序时,直接写上要转向的目标地址标号就可以。


3.长跳转指令


LJMP addr16


指令执行时把指令的第二和第三字节分别装入PC的高位和低位字节中,无条件地转向addr16指出的目标地址。目标地址可以在64K程序存储器地址空间的任何位置。


4.间接跳转指令


JMP @A+DPTR


由A中8位无符号数与DPTR的16位数内容之和来确定。以DPTR内容作为基址,A的内容作变址。给A赋予不同的值,即可实现程序的多分支转移。


5.条件转移指令


规定的条件满足,则进行转移,条件不满足则顺序执行下一条指令。当条件满足时,把PC装入下一条指令的第一个字节地址,再把带符号的相对偏移量rel加到PC上,计算出目标地址。


JZ rel ;如果累加器为“0”,则转移


JNZ rel ;如果累加器非“0”,则转移


6.比较不相等转移指令


CJNE A,direct,rel


CJNE A,#data,rel


CJNE Rn,#data,rel


CJNE @Ri,#data,rel


比较前面两个操作数的大小,如果它们的值不相等则转移。如果第一操作数(无符号整数)小于第二操作数(无符号整数),则置进位标志位Cy,否则清“0”Cy。


7.减1不为0转移指令


这是一组把减1与条件转移两种功能结合在一起的指令。共两条指令:


DJNZ Rn,rel ;n=0~7


DJNZ direct,rel


将源操作数(Rn或direct)减1,结果回送到Rn寄存器或direct中去。如果结果不为0则转移。允许程序员把寄存器Rn或内部RAM的direct单元用作程序循环计数器。主要用于控制程序循环。以减1后是否为“0”作为转移条件,即可实现按次数控制循环。


8.调用子程序指令


(1)短调用指令


ACALL addrll


与AJMP指令相类似,是为了与MCS-48中的CALL指令兼容而设的。


(2)长调用指令


LCALL addr16


9.子程序的返回指令


RET


执行本指令时:


(SP)→PCH,然后(SP)-1→SP


(SP)→PCL,然后(SP)-1→SP


功能:从堆栈中退出PC的高8位和低8位字节,把栈指针减2,从PC值开始继续执行程序。


10.中断返回指令


RETI


功能:与RET指令相似,两指令不同之处,是本指令清除了中断响应时,被置“1”的MCS-51内部中断优先级寄存器的优先级状态。


11.空操作指令


NOP


五、 位操作指令


1.数据位传送指令


MOV C,bit


MOV bit,C


2.位变量修改指令


CLR C ;清“0”Cy


CLR bit ;清“0”bit位


CPL C ;Cy求反


CPL bit ;bit位求反


SETB C ;置“1” Cy


SETB bit ;置“1” bit位


这组指令将操作数指出的位清“0”、求反、置“1”, 不影响其它标志。


3.位变量逻辑与指令


ANL C,bit ;bit∧Cy→Cy


ANL C,/bit; ;/bit ∧Cy→Cy


4.位变量逻辑或指令


ORL C,bit


ORL C,/bit


5.条件转移类指令


JC rel ;如果进位位Cy=1,则转移


JNC rel ;如果进位位Cy=0,则转移


JB bit,rel ;如果直接寻址位=1,则转移


JNB bit,rel ;如果直接寻址位=0,则转移


JBC bit,rel ;如果直接寻址位=1, 则转移,并清0直接寻址位


读者可根据指令助记符,迅速查到对应的指令代码(手工汇编)。也可根据指令代码迅速查到对应的指令助记符(手工反汇编)。


应熟练地掌握指令表的使用!!!


因为这是使用MCS-51汇编语言进行程序设计的基础。




登录icspec成功后,会自动跳转查看全文
博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。