一、指令格式
指令格式包含操作码和操作数;
操作码: 指令执行什么操作
操作数: 指令操作的对象
二、指令中用到的符号
R0:当前寄存器区的8个工作寄存器 R0~R7
Ri:当前寄存器区中作为间接寻址寄存器的2个寄存器R0、R1
direct : 直接地址,即8位内部数据存储器单元或特殊功能寄存器的地址
#data : 指令中的8位立即数
#data16: 指令中的16位立即数
rel:偏移量,8位的带符号补码数
DPTR: 数据指针,可用作16位数据存储器单元地址的寄存器
bit : 内部RAM或特殊功能寄存器中的直接寻址位
C或Cy: 进位标志位或位处理机中的累加器
addr11: 11位目的地址
addr16: 16位目的地址
@ : 直接寻址寄存器前缀,如@Ri,@A+DPTR
(x): 表示x地址单元或寄存器中的内容
((x)): 表示以x单元或寄存器中的内容作为地址间接寻址单元的内容
-> : 箭头右边的内容被箭头左边的内容所取代
三、指令系统
按所占字节分
单字节指令(49条)
单字节指令: 操作码和操作数同在一个字节中
双字节指令(45条)
双字节指令: 一个字节为操作码,另一个字节是操作数
三字节指令(17条)
三字节指令: 操作码占一个字节,操作数占二个字节
按执行时间来分
1个 机器周期
1个 机器周期(12个时钟振荡周期)的指令 64 条
2个 机器周期
2个 机器周期指令 45 条
4个 机器周期
4个 机器周期-----乘、除指令
按功能来分(111条)
数据传送类(28条)
· 数据传送类使用最频繁
· 通用格式:
MOV <目的操作数>,<源操作数>
本类指令不影响标志位:Cy、Ac和OV,但不包括奇偶标志位P
以累加器为目的操作数的指令
以Rn为目的操作数的指令
以直接地址direct为目的操作数的指令
以寄存器间接地址为目的操作数的指令
16位数传送指令
堆栈操作指令
1.进栈指令
PUSH direct
解释: 首先将栈指针SP加1,然后把direct中的内容送到SP指示的内部RAM单元中。
举例:
当(SP)=60H, (A)=30H,(B)=70H时
例: PUSH Acc;(SP)+1 = 61H ->SP,(A)->61H
PUSH B ; (SP)+1 = 62H ->SP,(B) ->62H
结果:(61H) = 30H,(62H)= 70H,(SP)= 62H
2.出栈指令
POP direct
解释: 将SP指示的栈顶单元的内容送入direct字节中,SP减1.
累加器A与外部数据存储器RAM/10传送指令
· 见到MOVX就是与片外进行交换
· eg:
MOVX A,@DPTR
MOVX A,@Ri
MOVX @DPTR,A
MOVX @Ri,A
查表指令
· 共两条,仅有的两条读程序存储器中表格的指令
·① MOVC A,@A+PC
解释:PC程序指针
以PC作为基址寄存器,A的内容(无符号数)和PC的当前值(下一条指令的起始地址)相加后得到一个新的16位地址,把该地址的内容送到A
② MOVC A,@A+DPTR
字节交换指令
①XCH A,Rn
②XCH A,direct
③XCH A,@Ri
半字节交换指令
算术运算类(24条)
加法指令
· 8位加法指令的一个加数总是来自累加器A,而另一个加数可由寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址等不同的寻址方式得到。加的结果总是放在累加器A中。
· 使用本指令时,要注意累加器A中的运算结果对各个标志位的影响
(1)如果 位7 有进位,则进位标志Cy置1,否则Cy清0。
(2)如果 位3 有进位,辅助位进位标志Ac置1,否则Ac(Ac位PSW寄存器中的一位)清0.
(3)如果 位6 有进位,而 位7 没有进位,或者 位7 有进位,而 位6 没有进位, 则 溢出标志位OV 置1,否则 OV 清0
· 溢出标志位OV的状态,只有带符号数加法运算时才有意义。当两个带符号数相加时,OV=1,表示加法运算超出了累加器A所能表示的带符号数的有效范围(-128~127),即产生了溢出,表示运算结果是错误的,否则运算是正确的,即无溢出产生
· 具体指令:
ADD A,Rn
ADD A,direct
ADD A,@Ri
ADD A,#data
XCHD A,@Ri
带进位加法指令
· 特点是进位标志位Cy参加运算,三数相加。
·如果 位7有进位,则进位标志Cy置“1”,否则Cy清“0”
如果 位3有进位,则辅助位进位标志Ac“1”,否则Ac清“0”
如果 位6有进位而位7没有进位,或者位7有进位而位6没有进位,则溢出标志OV置“1”, 否则标志OV清“0“
· 具体指令:
ADDC A,Rn
ADDC A,direct
ADDC A,@Ri
ADDC A,#data
增 1 指令
· 把指令中所有指出的变量增1,且不影响PSW中的标志位
· 指令”INC DPTR“,16位数增1指令:
首先对低8位指针DPL执行加1,当溢出时,就对DPH的内容进行加1,不允许标志Cy。
· 具体指令:
INC A
INC Rn
INC direct
INC @Ri
INC DPTR
十进制调整指令
· 用于对BCD码加法运算结果的内容修正。
· 是对压缩的BCD码(一个字节存放2位BCD码)的加法结果进行十进制调整
· 两个BCD码按二进制相加之后,必须经本指令的调整才能得到正确的压缩BCD码的和数
· 十进制的调整问题
对BCD码加法运算,只能借助于二进制加法指令,但二进制数加法原则上并不适于十进制数的加法运算,有时会产生错误结果
· 具体指令:
DA A
带借位的减法指令
· 从A的内容减去指定变量和进位标志位Cy的值,结果存在A中
· 如果 位7需借位 则Cy置1,否则Cy清0;
如果 位3需借位 则Ac置1,否则Ac清0;
如果 位6借位而位7不借位,或者 位7借位而位6不借位,则溢出 标志位OV置”1“,否则OV清”0“
· 具体指令:
SUBB A,Rn
SUBB A,direct
SUBB A,@Ri
SUBB A,#data
减1指令
· 功能是指定的变量减1。
· 若原来为00H,减1后下溢为FFH,不影响标志位(P标志除外)
· 具体指令:
DEC A
DEC Rn
DEC direct
DEC @Ri
乘法指令
· 积的低字节在累加器A中,高字节在B中。如果积大于255,则OV置1,否则OV清0。Cy标志总是清0.
· 具体指令:
MUL AB
解释:A*B->BA
除法指令
· 商(为整数)存放在A中,余数存放在B中,且Cy和溢出标志位OV清”0“。
· 如果B的内容为0(即除数为0),则存放结果A、B中的内容不定,并溢出标志位OV置1.
· 具体指令:
DIV AB
解释: A/B -> A(商),余数->B
逻辑操作类(25条)
累加器A清”0“指令
· 累加器A清0。不影响Cy,Ac,OV等标志位
·具体指令:
CLR A
累加器A求反指令
· 将累加器A的内容按位逻辑取反,不影响标志位
CPL A
左环移指令
· 功能是A向左循环移位,位7循环移入位0,不影响标志位
· 具体指令:
RL A
带进位左环移指令
· 将累加器A的内容和进位标志位Cy一起向左环移一位
· 具体指令:
RLC A
右环移指令
· 具体指令:
RR A
带进位右环移指令
· 具体指令:
RRC A
累加器半字节交换指令
· 是将累加器A的高半字节(Acc.7 ~ Acc.4)和低半字节(Acc.3 ~ Acc.0)互换
· 具体指令:
SWAP A
例如(A) = 95H,执行指令后就变为 59H
逻辑与指令
· 是在指定的变量之间以位为基础进行”逻辑与“操作,结果存放到目的变量所在的寄存器或存储器中
· 具体指令:
ANL A,Rn
解释: (A)与(Rn)->A,n=0,7
ANL A,direct
ANL A,#data
ANL A,@Ri
ANL direct,A
ANL direct,#data
逻辑异或指令
·具体指令:
XRL A,Rn
XRL A,direct
XRL A,@Ri
XRL A,#data
XRL direct,A
XRL direct,#data
控制转移类(17条)
长转移指令
· 指令执行时,把转移的目的地址,即指令的第二和第三字节分别装入PC的高位和地位字节中,无条件地转向addr16指定的目的地址:64KB程序存储器地址空间的任何位置
· 具体指令
LJMP addr16
相对转移指令
· 无条件转移,rel为相对偏移量,是一单字节的带符号8位二进制补码数
· 因此程序转移是双向的。 rel如为正,向地址增大的方向转移;rel如为负,向地址减小的方向转移
· 具体指令:
SJMP rel
绝对转移指令
· 指令 提供11位地址A10~A0(即addr11),其中A10~A8则位于第1字节的高3位,A7~A0在第二字节。操作码只占第一节字节的低5位。
· 指令构造转移目的地址:执行本指令,PC加2,然后把指令中的11位无符号整数地址addr11(A10~A0)送入PC.10~PC.0,PC.15~PC.11保持不变,形成新的16位转移目的地址
· 具体指令:
AJMP addr11
间接跳转指令
· 单字节转移指令,目的地址由A中8位无符号数与DPTR的16位无符号数内容之和来确定。以DPTR内容位基址,A的内容作为变址。给A赋予不同值,即可实现多分支路转移
· 具体指令:
JMP @A+DPTR
条件转移指令
· 执行指令时,如条件满足,则转移;不满足,则顺序执行下一指令。
· 转移目的地址在以下一条指令首地址为中心的256B方位内(-128~+127)
· 具体指令:
JZ rel
解释: 如果累加器内容为0,则执行转移
JNZ rel
解释: 如果累加器内容非0,则执行转移
比较不相等转移指令
· 具体指令:
CJNE A,direct,rel
CJNE A,#data,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
减1不为0转移指令
· 具体指令:
DJNZ Rn,rel
DJNZ direct,rel
调用子程序指令
①长调用指令
· 可调用64KB范围内程序存储器中的任何一个子程序。执行时,先把PC加3获得下一条指令的地址(断电地址),并压入堆栈(先低位字节,后高位字节),堆栈指针加2
· 接着把指令的第二和第三字节(A15~A8, A7~A0)分别装入PC的高位和低位字节中,然后从PC指定的地址开始执行程序。执行后不影响任何的标志位
· 具体指令:
LCALL addr16
②绝对调用指令
· 与AJMP指令类似,为兼容MCS-48的CALL指令而设,不影响标志位。
· 具体指令:
ACALL addr11
子程序的返回指令
·执行本指令时:
(SP)->PCH,然后(SP)-1->SP
(SP)->PCL,然后(SP)-1->SP
· 功能:从堆栈中推出PC的高8位和低8位字节,把栈指针减2,从PC值处开始继续执行程序。不影响任何标志位
· 具体指令:
RET
中断返回指令
· 与RET指令相似,不同处:该指令清除了中断响应应时被置1的内部中断优先级寄存器的中断优先级状态,其他相同
· 具体指令:
RETI
空操作指令
· 不进行任何操作,耗一个机器周期时间,执行(PC)+1->PC操作
· 具体指令:
NOP
位操作类(17条)
数据位传送指令
· 把源操作数指定的位变量送到目的操作数指定处。一个操作数必须为进位标志,另一个可以是任何直接寻址位。不影响其他寄存器或标志位
· 具体指令:
MOV C,bit
MOV bit,C
位变量修改指令
· 具体指令:
CLR C
解释: Cy位清0
CLR bit
解释: bit位清0
CPL C
解释: Cy位求反
CPL bit
解释: bit位求反
SETB C
解释: Cy位置1
SETB bit
解释: bit为置1
位变量逻辑与指令
· 具体指令:
ANL C,bit
解释: bit与Cy->Cy
ANL C,/bit
解释: /bit 与 Cy ->Cy
为变量逻辑或指令
· 具体指令:
ORL C,bit
ORL C,/bit
条件转移类指令
· 具体指令:
JC rel
解释: 如进位标志位Cy=1,则转移
JNC rel
解释: 如进标志位Cy=0,则转移
JB bit,rel
解释: 如直接寻址位=1,则转移
JNB bit,rel
解释: 如直接寻址位=0,则转移
JBC bit,rel
解释: 如直接寻址为=1,转移,并把寻址位清0
标签:8051,指令系统,字节,编程,累加器,direct,Cy,指令,进位 From: https://blog.csdn.net/LIN178066/article/details/137347943