导图社区 指令系统
单片机汇编指令系统、都是累加器A中的值减去CY的值再减去各条语句中源操作数的值存入累加器A中(CY.AC.OV中的值与加法中刚好相反,借位来代替进位)
编辑于2023-01-02 22:22:53 河南指令系统
数据传送指令
概念:通过该指令将源字节的内容传送到目的字节,源字节中内容不变。
片内存储器常见类型(通过目的操作数类型划分):
累加器A:
MOV A,Rn;(寄存器寻址)
把寄存器Rn中数据传送到累加器A中(Rn)┄>A
MOV A,direct;(直接寻址)
将直接地址direct中内容传送到累加器A中(direct)┄>A
MOV A,@Ri;(间接寻址)
将Ri中内容作为地址,该地址指向的内容传送给累加器A((Ri))┄>A
MOV A,#data;(立即数寻址)
将数据data传送给累加器A#data┄>A
寄存器Rn(与累加器A几乎相同,只是缺少了间接寻址的那种传送方式,因为寄存器R0,R1不能通过间接寻址的方式将内容传送给Rn(n取0~7)):
MOV Rn,A;(寄存器寻址)
将累加器A中内容传送给寄存器Rn (A)┄>Rn
MOV Rn,direct;(直接寻址)
将直接地址xirect中内容传送给寄存器Rn (direct)┄>Rn
MOV Rn,#data;(立即数寻址)
将数据data传送给寄存器Rn #data┄>Rn
直接地址(与累加器A几乎相同,多了两个直接地址之间传送的形式):
MOV direct,A;(寄存器寻址)
将累加器A中内容传送到直接地址direct中 (A)┄>direct
MOV direct,Rn;(寄存器寻址)
将寄存器Rn中内容传送到直接地址direct中 (Rn)┄>direct
MOV direct(1),direct(2);(直接寻址)
将直接地址direct2中内容传送到直接地址direct1中 (direct2)┄>direct1
MOV direct,@Ri;(间接寻址)
将Ri中内容作为地址,该地址中内容传送到直接地址direct中 ((Ri))┄>direct
MOV direct,#data;(立即数寻址)
将数据data传送到直接地址direct中 #data┄>direct
间接地址:
MOV @Ri,A;(寄存器寻址)
将累加器A中内容传送到Ri中内容作为地址的单元中(A)┄>(Ri)
MOV @Ri,direct;(直接寻址)
将直接地址direct中内容传送到Ri中内容作为地址的单元中(A)┄>(Ri)
MOV @Ri,#data;(立即数寻址)
将数据data传送到Ri中内容作为地址的单元中#data┄>(Ri)
片外存储器
16位数据传送
MOV DPTR,#data16;(立即数寻址)
将16位数据的高8位传送给DPH,低八位传送给DPL
注意:80S51中有两个DPTR,需要凭借寄存器AUXR1中的DPS位来进行选择,DPS置1选择DPTR1,反之为DPTR0
累加器A与片外RAM(MOVX)
MOVX A,@Ri;
读取外部RAM或IO,将外部RAM或IO中内容给到累加器A,但是外部RAM中内容不改变 ((Ri))┄>A
注意:Ri只有8位,只能对低8位进行操作
MOVX A,@DPTR
读取外部RAM或IO,将外部RAM或IO中内容给到累加器A,但是外部RAM中内容不改变 ((DPTR))┄>A
MOVX @Ri,A;
写外部RAM或者IO,外部RAM中内容会发生改变 (A)┄>(Ri)
MOVX @DPTR,A;
写外部RAM或者IO,外部RAM中内容会发生改变 (A)┄>(DPTR)
读的时候RD=1,写的时候WR=1
查表指令(片内片外不定)
操作码助记符位MOVC
MOVC A,@A+DPTR
把累加器A中的内容和DPTR中的内容相加作为地址,该地址中的内容传送到累加器A中
MOVC A,@A+PC
PC为该语句的下一条语句的首地址,其他运算同上
栈操作指令
入栈指令(PUSH)
PUSH xirect;
栈顶(SP)先加一,然后将直接地址direct中内容传送到SP中
出栈指令(POP)
POP direct;
把栈顶的内容弹出到direct中,然后栈顶会减一
数据交换指令
字节交换
XCH A,Rn;
累加器A中内容和寄存器Rn中内容互换
XCH A,direct;
将累加器A中内容和直接地址direct中内容互换
XCH A,@Ri;
将累加器A中内容与Ri中内容作为地址指向的内容互换
半字节交换
XCHD A,@Ri;
助记符中的D表示低四位,即将低四位互换
算数运算指令
概念及特点
概念:算数运算指令包括加减乘除四种基本运算。对无符号二进制数进行算数运算
特点:算数运算会改变进位(CY),半进位(AC),溢出位(OV)发生改变
分类
加法类
特点:
助记符为ADD
一个加数来自累加器A,另一个加数来自寄存器寻址,直接寻址,寄存器间接寻址,立即数寻址
标志位的值
若位7有进位,则CY为1反之为0
若位3有进位,则AC为1反之为0
若位6有进位,而位7无进位,或位7有进位,位6无进位溢出位OV为1否则为0(OV为1表示两个加数相加的结果超出了累加器A的范围)
ADD A,Rn;
将寄存器Rn中内容和累加器A中内容相加存入A中
ADD A,direct;
将直接地址direct中内容与累加器A中内容相加放到累加器A中
ADD A,@Ri;
将Ri中内容作为地址指向空间中的内容与累加器A相加放到A中
ADD A,#data;
将数据data与累加器A中内容相加放到A中
带进位加法指令
操作码助记符ADDC
将源操作数中内容和进位标志位CY都加到累加器A中,其余操作同加法指令,CY的值见加法类特点中描述
带借位的减法指令
操作码助记符SUBB
指令类型
SUBB A,Rn;
SUBB A,direct;
SUBB A,@Ri;
SUBB A,#data;
都是累加器A中的值减去CY的值再减去各条语句中源操作数的值存入累加器A中(CY.AC.OV中的值与加法中刚好相反,借位来代替进位)
乘法指令
MUL AB;
累加器A中和寄存器B中两个8位的无符号数相乘,会得到一个16位结果,结果的低字节存入A中,高8位存入B中
若结果大于0FFH,则OV会置1,否则置0,CY一直是0
除法指令
DIV AB
A中内容与B中内容相除,整数存在A中,余数存在B中
如果B中内容为00H(也就是分母是0),结果无法确定,用OV=1来表示,CY仍然是0
加1指令
操作码助记符INC
特点及功能:将指定操作数指定单元内容加1,其操作结果不会影响进位标志位CY,如果原来为FFH,再加1后会溢出,溢出后结果为00H
指令
INC A;与ADD A,#01H;结果相同但后者会影响进位标志位
INC Rn;
INC direct;
INC @Ri;
INC DPTR;
减1指令
操作码助记符DEC
特点:会影响P标志位,但是其他标志位不受影响。若源操作数为00H,减1后结果为FFH
指令
DEC A;
DEC Rn;
DEC direct;
DEC @Ri;
十进制数据调整指令
功能:BCD码只能表示0~9,1010~1111为无效编码。
判断是否在无效编码区
如果运算结果大于9,则进入无效编码区
如果运算结果已经发生进位,则已跳过无效编码区。
调整方法
低四位大于9或者AC为1,则低四位加6
高四位大于9或者CY为1,则高四位加6
累加器高四位为9,低四位大于9,则分别加6
指令:DA A;
逻辑操作指令
CLR A;
将累加器A清零,会影响标志位P
CPL A;
对累加器A进行逐位取反操作,不影响标志位
RL A;
累加器A中数据进行左环移
RR A;
累加器A中数据进行右环移
RLC A;
连同进位标志位(CY)左环移
RRC A;
连同进位标志位(CY)右环移
SWAP A;
累加器A中的低四位和高四位进行交换
ANL
逻辑与的助记符
功能:将源操作数和目的操作数进行按位与,结果存入目的操作数(累加器A或者地址单元)中
指令
ANL A,Rn;
ANL A,direct;
ANL A,@Ri;
ANL A,#data;
ANL direct,A;
ANL direct,#data;
ORL
逻辑或助记符
功能:将源操作数和目的操作数进行按位或,结果存入目的操作数(累加器A或者地址单元)中
指令
ORL A,Rn;
ORL A,direct;
ORL A,@Ri;
ORL A,#data;
ORL direct,A;
ORL direct,#data;
XRL
逻辑异或助记符
功能:将源操作数和目的操作数进行按位异或,结果存入目的操作数(累加器A或者地址单元)中
指令
ORL A,Rn;
ORL A,direct;
ORL A,@Ri;
ORL A,#data;
ORL direct,A;
ORL direct,#data;
程序转移指令
就中断的调用与返回较为常用,调用与返回就相当于记录下调用前的地址,存储起来,然后调用执行结束后跳会调用前。
无条件转移指令
短转移指令(绝对转移指令)
指令占两个字节
指令:AJMP addr11;
操作过程:先进行PC+2(本条指令自身占两个字节),然后addr11┄>PC₁₀~₀,从目前操作跳转到a10~a0任意一个中
长转移指令
该指令占三个字节(第一个字节为操作码,后两个字节为目标地址)
指令:LJMP addr16;
操作过程:执行时PC会先增加3,该指令会将目标地址的2,3字节存入PC的高低8位中,然后程序会转向目标地址去执行。
相对转移指令
指令自身占两个字符
指令:SJMP rel;
执行过程:在执行时会先将PC加2,然后再加上rel,跳转到PC+2+rel地址上面执行程序
间接转移指令
指令:JMP @A+DPTR;
操作过程:将累加器A中的值和DPTR中的值相加作为目标地址,跳转到目标地址执行程序,A累加器值不同,跳转的位置就不同
空操作指令
指令:NOP;
功能:起到延时的作用,12MHZ的晶振,执行此语句为1微秒
条件转移指令
比较转移指令
指令自身占3个字节
指令:CJNE 目的操作数,源操作数,rel;
结果:如果目的操作数中小于源操作数,则进位标志位CY置1,否则清零。若两个操作数不相同,则会跳转到PC+3(该语句本身占用)+rel地址执行程序
判零转移指令
指令自身占2字节
指令
JZ rel;
JNZ rel;(相当于第一个中间加了not)
操作过程:两个语句都会先将PC+2,第一个指令是A中全是0的时候,PC跳转到PC+2+rel,反之程序不跳转顺序执行。第二个与第一个相反。
调用和返回指令
短调用指令
绝对调用指令,规则与绝对转移指令相同
指令:ACALL addr11;
操作过程:将PC+2(指令自身占2字节)┄>进行压堆栈操作,栈顶增加一次,压入PC低8位,再增加一次,压入PC高8位,然后将addr11的0~10位给PC的0~10位进行跳转操作。
长调用指令
指令:LCALL addr16;
操作过程:先进行PC+3(该语句占3字节),然后压堆栈同上,最后将目的地址给PC
返回指令
RET;
出堆栈,先将堆栈中高8位弹出给PC高8位,SP减1,然后将低8位弹出,然后SP再减1。
RETI
中断返回指令
操作过程:同上,但是进入中断时中断优先级被置1,返回时需要再对其进行清除。
位操作指令
位传送
MOV C,bit;
MOV bit,C;
位清0
CLR C;
CLR bit;
位置1
SETB C;
SETB bit;
位取反
CPL C;
CPL bit;
位逻辑与操作
ANL C,bit;
位逻辑或操作
ORL C,bit;
位转移
判断布尔累加器C转移指令
JC rel;
JNC rel;(相当于not)
操作过程:PC会先+2,然后第一条,如果C是1就跳转到PC+rel,反之顺序执行。第二条与第一条相反
判断位变量转移指令
JB bit,rel;
JNB bit,rel;
操作过程:第一条指令,PC先+3,然后如果bit是1,就跳转,反之顺序执行。第二条指令与第一条相反
判断位变量并清零转移
JBC bit,rel;
操作过程:先会执行PC加3,然后若bit是1,则跳转到PC+rel,并且将bit赋值为0,若bit是0,就顺序执行。