8051指令系统与系统编程(二)

一、指令格式

指令格式包含操作码操作数;

操作码: 指令执行什么操作

操作数: 指令操作的对象

二、指令中用到的符号

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

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值