首页 > 编程语言 >8051指令系统与系统编程(二)

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

时间:2024-04-03 16:58:37浏览次数:28  
标签:8051 指令系统 字节 编程 累加器 direct Cy 指令 进位

一、指令格式

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

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

操作数: 指令操作的对象

二、指令中用到的符号

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

相关文章

  • 《Java 热点:探索高效编程的新境界》
    前言在当今的数字时代,Java作为一种广泛使用的编程语言,一直处于技术领域的前沿。它的强大功能和广泛应用使得它成为了众多开发者的首选。本文将深入探讨一些最新的Java热点话题,带您领略Java编程的魅力和高效性。一、Java的发展与优势Java具有以下显著优势:跨平台性......
  • 【无标题】Spark基础编程
    一、创建RDD    1.从内存中创建RDD      (1)parallelize()方法       (2)makeRDD()方法通过Linux本地文件创建RDD 二,使用map方式转换数据  使用sortBy方式转换数据  用collect方法查询数据flat方法转换数据 take方法 ......
  • 大数据实验统计-1、Hadoop安装及使用;2、HDFS编程实践;3、HBase编程实践;4、MapReduce编
    大数据实验统计1、Hadoop安装及使用;一.实验内容Hadoop安装使用:1)在PC机上以伪分布式模式安装Hadoop;2)访问Web界面查看Hadoop信息。二.实验目的1、熟悉Hadoop的安装流程。2、熟悉Hadoop访问Web界等基本操作。大数据实验一,Hadoop安装及使用-CSDN博客文章浏览阅读149次,点赞3......
  • 05 | 面向对象编程:怎样才能写出一个“好”的类?
    如果按照前几节课的惯例,今天应该是讲运行阶段的。但是,运行阶段跟前面的编码、预处理和编译阶段不同,它是动态的、实时的,内外部环境非常复杂,CPU、内存、磁盘、信号、网络套接字……各种资源交织在一起,可谓千变万化(正如在第1节课里所说,每一个阶段的差异都非常大)。解决这个阶段......
  • PyQt5 GUI编程(QMainWindow与QWidget模块结合使用)
    一.简介QWidget是所有用户界面对象的基类,而QMainWindow用于创建主应用程序窗口的类。它是QWidget的一个子类,提供了创建具有菜单栏、工具栏、状态栏等的主窗口所需的功能。上篇主要介绍了基本使用,创建窗口时都是继承单个模块,本章主要介绍下两个模块的结合使用。二.具体用法1.我......
  • 有锁编程 vs 无锁编程
    什么是无锁编程?简单来说就是有没有block住其他线程,没有,那就是无锁编程。https://preshing.com/20120612/an-introduction-to-lock-free-programming/区别......
  • 盘点AI编程效率神器合集,代码助手工具大模型、Agent智能体
    关注wx公众号:aigc247进社群加wx号:aigc365程序员是最擅长革自己命的职业,让我们借助AI的力量一起摸鱼一起卷!据说好用的AI代码助手工具、大模型、Agent智能体微软的compoliot:AI神器之微软的编码助手Copilot-CSDN博客阿里的: 通义灵码_智能编码助手_AI编程-阿里云智谱AI的C......
  • BF548/BF547/BF549系列DSP的开发教程二十一:NorFLASH编程-可烧写文件的生成
    作者的话BF54X系列DSP,是ADIBlackfin系列的4系列,在产品线做这个系列DSP的产品定义时,充分吸取了客户在BF53X上的痛点,把BF54X做成了外设最丰富的一类DSP,这个DSP曾经在车载视频,工控领域有不少的成功案例,OP作为2000年入坑的老鸟,自然也是用它做过很多项目。系列教程,说一说这个4......
  • pymc,一个灵活的的 Python 概率编程库!
    目录前言安装与配置概率模型贝叶斯推断概率分布蒙特卡罗采样贝叶斯网络实例分析PyMC库的应用场景 1.概率建模 2.时间序列分析 3.模式识别总结前言大家好,今天为大家分享一个超强的Python库-pymcGithub地址:https://github.com/pymc-devs/pymcPyth......
  • 关于AI编程代码生成工具汇总(持续整理中)
    1.BaiduComatehttps://comate.baidu.com/zh基于文心大模型,结合百度积累多年的编程现场大数据和外部优秀开源数据,为你生成更符合实际研发场景的优质代码。提升编码效率,释放“十倍”软件生产力。有免费版和付费版(提供高级功能)目前看只支持前端工具(目前Comate支持100+主流编程......