一、数据传送指令
数据传送指令主要负责把数据、地址或立即数传送到寄存器或存储单元中。这类指令共有29条,可分为以下3大类:基本数据传送指令,数据交换指令,栈操作指令。
执行数据传送指令时,除以累加器a为目的操作数的指令会对奇偶标志位p有影响外,其余指令执行时均不会影响任何标志位。
1.基本数据传送指令
根据数据取自何方和传到何方,mov指令有着许多不同的形式。
(1)以累加器a为目的操作数类指令
这组指令的作用是把源操作数指向的内容送到累加器a。有立即数、直接、寄存器和寄存器间接寻址方式:
mova,#data ;data→(a)
mova,direct ;(direct)→(a)
mova,ri ;(ri)→(a)
mova,@rj ;((rj))→(a)
(2)以寄存器ri为目的操作数的指令
这组指令的功能是把源操作数指定的内容送到所选定的工作寄存器ri中。有立即、直接和寄存器寻址方式:
(3)以直接地址为目的操作数的指令
这组指令的功能是把源操作数指定的内容送到由直接地址direct所选定的片内ram中。有立即、直接、寄存器和寄存器间接4种寻址方式:
(4)以间接地址为目的操作数的指令
这组指令的功能是把源操作数指定的内容送到以rj中的内容为地址的片内ram中。有立即、直接和寄存器3种寻址方式
(5)查表指令
这组指令的功能是对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式:
movca,@a+dptr ;((a)+(dptr))→(a)
movca,@a+pc ;((pc))+1→(pc),((a)+(pc))→(a)
(6)累加器a与片外数据存储器ram传送指令
这组指令的作用是累加器a与片外ram间的数据传送。使用寄存器寻址方式:
movx@dptr,a ;(a)→((dptr))
movxa,@dptr ;((dptr))→(a)
movxa,@rj ;((rj))→(a)
movx@rj,a ;(a)→((rj))
(7)16位数据传送指令
这条指令的功能是把16位常数送入数据指针寄存器。
movdptr,#data16 ;datah→(dph),datal→(dpl)
2.交换指令
mov指令主要完成从一处到另一处的拷贝,xch指令则可实现数据的双向传送。所有的操作都涉及到累加器a,可以把把累加器a中的内容与源操作数所指的数据相互交换。
xcha,direct ;(a)←→(direct)
xcha,ri ;(a)←→(ri)
xcha,@rj ;(a)←→((rj))
xchda,@rj ;(a3-0)←→((rj)3-0)
swapa ;(a3-0)←→(a7-4)
3.入栈/出栈指令
这类指令的作用是把直接寻址单元的内容传送到堆栈指针sp所指的单元中,以及把sp所指单元的内容送到直接寻址单元中。
⑴push指令
堆栈的入栈指令,该指令可以把某片内ram单元(低128字节)或某专用寄存器的内容入栈。
pushdirect ;(sp)+1→(sp),(direct)→(sp)
⑵pop指令
堆栈的出栈指令,该指令用于恢复某片内ram单元(低128字节)或某专用寄存器的内容。
popdirect ;(sp)→(direct),(sp)-1→(sp)
二、算术运算指令
在51系列单片机的指令系统中,提供了完备的加、减、乘、除算术运算指令及增量(加1)、减量(减1)运算,可处理不带符号或带符号的8/16二进制数。除加1和减1指令外,算术运算指令会影响进位、半进位和溢出位三个标志位。
1.不带进位的加法指令
这组指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器a的内容相加,运算结果存在a中。
adda,#data ;(a)+data→(a)
adda,direct ;(a)+(direct)→(a)
adda,ri ;(a)+(ri)→(a)
adda,@rj ;(a)+((rj))→(a)
本组指令的执行将影响标志位ac、cy、ov、p。当和的第3、7位有进位时,分别将ac,cy标志位置位;否则复位。对于无符号数,进位标志位cy=1,表示溢出;cy=0表示无溢出。带符号数运算的溢出取决于第6、7位,若这2位中有一位产生进位,而另一位不产生进位,则溢出标志位ov置位,否则被复位。
2.带进位加法指令
这组指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器a的内容以及进位位c相加,运算结果存在a中。
本组指令执行对标志位ac、cy、ov、p的影响与add指令相同。
3.增量指令
这组指令的的功能均为原寄存器的内容加1,结果送回原寄存器。这组指令共有直接、寄存器、寄存器间接寻址等寻址方式:
inca ;(a)+1→(a)
incdirect ;(direct)+1→(direct)
incri ;(rn)+1→(ri)
inc@rj ;((rj))+1→((rj))
incdptr ;(dptr)+1→(dptr)
增量指令不会对任何标志有影响。
4.带借位减法指令
这组指令包含立即数、直接地址、间接地址及工作寄存器与累加器a连同借位位c内容相减,结果送回累加器a中。
subba,#data ;(a)-data-(c)→(a)
subba,direct ;(a)-(direct)-(c)→(a)
subba,ri ;(a)-(ri)-(c)→(a)
subba,@rj ;(a)-((rj))-(c)→(a)
本指令执行将影响标志位ac、cy、ov、p。若第七位有借位,则将cy置位,否则cy复位。若第3位有错位,则置位辅助进位标志ac,否则ac复位。若第7和第6位中有一位需借位,而另一位不借位,则置位溢出标志ov。
当在进行单字节或多字节减法前,不知道进位标志位cy的值,则应在减法指令前先将cy复位清“0”。
5.减量指令
这组指令的作用是把所指的寄存器内容减1,结果送回原寄存器,这组指令共有直接、寄存器、寄存器间接寻址等寻址方式:
deca ;(a)-1→(a)
decdirect ;(direct)-1→(direct)
decri ;(ri)-1→(ri)
dec@rj ;((rj))-1→((rj))
运算结果不影响任何标志位。
6.乘法指令
这条指令的作用是把累加器a和寄存器b中的8位无符号数相乘,所得到的是16位乘积,这个结果低8位存在累加器a,而高8位存在寄存器b中。
mulab ;(a)×(b)→(b)和(a)
乘法指令需要4个机器周期。
如果乘积大于255(0ffh),即b的内容不为0时,则置位溢出标志位ov,否则ov复位。进位标志位cy总是复位为0。
7.除法指令
这条指令的作用是把累加器a的8位无符号整数除以寄存器b中的8位无符号整数,所得到的商存在累加器a,而余数存在寄存器b中。
divab;(a)÷(b)→(a)和(b)
除法指令需要4个机器周期。
本指令总是将cy和ov标志位复位。当除数(b中内容)为00h时,那么执行结果将为不定值,则置位溢出标志位ov。
8.十进制调整指令
在进行bcd码运算时,这条指令总是跟在add或addc指令之后,其功能是将执行加法运算后存于累加器a中的结果进行调整和修正。
daa
三、逻辑运算指令
在51系列单片机的指令系统中提供的逻辑运算指令主要包括anl(与),orl(或),xrl(异或)等指令。
1.逻辑与指令anl
这组指令的功能是在指出的变量之间以位为基础的逻辑与操作。操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等寻址方式:
anla,#data;(a)∧data→(a)
anla,direct ;(a)∧(direct)→(a)
anla,ri ;(a)∧(ri)→(a)
anla,@rj ;(a)∧((rj))→(a)
anldirect,#data ;(direct)∧data→(direct)
anldirect,a ;(direct)∧(a)→(a)
2.逻辑或指令orl
这组指令的功能是在所指出的变量之间执行以位为基础的逻辑或操作,结果存到目的变量中去。操作数有立即寻址、直接寻址、寄存器寻址和寄存器间接寻址方式:
3.逻辑异或指令xrl
这组指令的功能是在所指出的变量之间执行以位为基础的逻辑异或操作,结果存放到目的变量中去。操作数有立即寻址、直接寻址、寄存器寻址和寄存器间接寻址方式:
4.循环移位指令
这4条指令的作用是将累加器中的内容循环左或右移一位,后两条指令是连同进位位cy一起移位。
rla ;累加器a中的内容左移一位。
rra ;累加器a中的内容右移一位。
rlca ;累加器a中的内容连同进位位cy左移一位。
rrca ;累加器a中的内容连同进位位cy右移一位。
5.求反指令
这条指令将累加器中的内容按位取反。
cpla ;累加器中的内容按位取反。
6.清零指令
这条指令将累加器中的内容清0。
clra ;0→(a),累加器中的内容清0。
四、位操作类指令
mcs-51单片机内部有一个布尔处理机,对位地址空间具有丰富的位操作指令。
1.位传送指令
这2条指令的功能是把由源操作数指出的布尔变量送到目的操作数指定的位中去。其中一个操作数必须为进位标志,另一个可以是任何直接寻址位。
movc,bit ;bit→cy,某位数据送cy。
movbit,c ;cy→bit,cy数据送某位。
本组指令不影响其他寄存器和标志位。
2.位变量修改指令
这些指令对cy及可寻址位进行置位或复位操作
clrc ;0→cy,复位cy。
clrbit ;0→bit,复位某一位。
setbc ;1→cy,置位cy。
setbbit ;1→bit,置位某一位。
本组指令不影响其他标志。
3.位变量逻辑指令
位运算都是逻辑运算,有与、或、非三种指令
anlc,bit ;(cy)∧(bit)→cy
anlc,/bit;(cy)∧()→cy
orlc,bit ;(cy)∨(bit)→cy
orlc,/bit ;(cy)∧()→cy
cplc ;()→cy
cplbit ;()→bit
4.位变量条件转移指令
位变量条件转移指令是以位的状态作为实现程序转移的判断条件:
jcrel ;(cy)=1转移,(pc)+2+rel→pc,否则程序往下执行,(pc)+2→pc。
jncrel ;(cy)=0转移,(pc)+2+rel→pc,否则程序往下执行,(pc)+2→pc。
jbbit,rel ;位状态为1转移。
jnbbit,rel;位状态为0转移。
jbcbit,rel ;位状态为1转移,并使该位清“0”。
五、控制转移指令
一般情况下指令是顺序执行的逐条执行的,但实际上程序不可能全部顺序执行而经常需要改变程序的执行流程,常用的控制转移指令有:
1.无条件转移指令
这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kb,绝对转移指令访问的程序存储器空间为11位地址2kb空间。
ljmpaddr16 ;addr16→(pc)
ajmpaddr11 ;(pc)+2→(pc),addr11→(pc10-0)
sjmprel ;(pc)+2+rel→(pc)
jmp@a+dptr;(a)+(dptr)→(pc)
2.条件转移指令
条件转移指令是依某种特定条件转移的指令。条件满足时转移(相当于一条相对转移指令),条件不满足时则顺序执行下面的指令。目的地址在下一条指令的起始地址为中心的256个字节范围中(-128~+127)。当条件满足时,先把pc指向指向下一条指令的第一个字节地址,再把有符号的相对偏移量加到pc上,计算出转向地址。
jzrel ;a=0,(pc)+2+rel→(pc)
jnzrel ;a≠0,(pc)+2+rel→(pc)
3.比较不相等转移指令
这组指令的功能是比较前面两个操作数的大小。如果它们的值不相等则转移。在pc指向下一条指令的起始地址后,通过把指令最后一个字节的有符号的相对偏移量加到pc上,并计算出转向地址。操作数有寄存器寻址、直接寻址,寄存器间接寻址和立即寻址等方式。
cjnea,direct,rel ;a≠(direct),(pc)+3+rel→(pc)
cjnea,#data,rel ;a≠data,(pc)+3+rel→(pc)
cjneri,#data,rel ;a≠data,(pc)+3+rel→(pc)
cjne@rj,#data,rel ;a≠data,(pc)+3+rel→(pc)
4.减1不为0转移指令
这组指令把源操作数减1,结果回送到源操作数中去,如果结果不为0则转移,跳到标号rel处执行,等于0就执行下一条指令。源操作数有寄存器寻址和直接寻址方式。该指令通常用于实现循环计数。
djnzri,rel;(ri)-1→(ri),(ri)≠0,(pc)+2+rel→(pc)
djnzdirect,rel;(direct)-1→(direct),(direct)≠0,(pc)+2+rel→(pc)
5.子程序返回指令
编程时一般都把需要反复执行的一些程序编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。
lcalladdr16 ;长调用指令,可在64kb空间调用子程序。此时(pc)+3→(pc),(sp)+1→(sp),(pc7-0)→(sp),(sp)+1→(sp),(pc15-8)→(sp),addr16→(pc),即分别从堆栈中弹出调用子程序时压入的返回地址。
acalladdr11 ;绝对调用指令,可在2kb空间调用子程序,此时(pc)+2→(pc),(sp)+1→(sp),(pc7-0)→(sp),(sp)+1→(sp),(pc15-8)→(sp),addr11→(pc10-0)。
ret ;子程序返回指令。此时(sp)→(pc15-8),(sp)-1→(sp),(sp)→(pc7-0),(sp)-1→(sp)ret指令通常安排在子程序的末尾,使程序能从子程序返回到主程序。
reti ;中断返回指令,除具有ret功能外,还具有恢复中断逻辑的功能,需注意的是,reti指令不能用ret代替。
空操作也是cpu控制指令,它没有使程序转移的功能,一般用于软件延时。指令为:nop