文章目录
51系列单片机共111条指令,常见的分类方式有以下几种。
按寻址方式分为以下7种:
立即寻址。
直接寻址。
寄存器寻址。
寄存器间接寻址。
相对寻址。
变址寻址。
位寻址。
按功能分为以下4种:
按字节分类:
| 符号 | 含义 |
|---|---|
| Rn | 当前寄存器区的8个工作寄存器R0~R7(n=0-7) |
| Ri | 可作地址寄存器的2个工作寄存器R0和R1 |
| direct | 内部数据存储单元的地址及特殊功能寄存器的地址 |
| #data | 表示8位立即数 |
| #data16 | 表示16位立即数 |
| add16 | 表示16位地址 |
| addrll | 表示11位地址 |
| rel | 8位带符号的地址偏移量 |
| bit | 表示位地址 |
| @ | 间接寻址寄存器或基址寄存器的前缀 |
| ( ) | 表示括号中单元的内容 |
| (( )) | 表示间接寻址的内容 |
功能:从源操作数到目的操作数的数据传送。
| 指令 | 功能 |
|---|---|
| MOV A,Rn | 将寄存器Rn中的内容送到累加器A |
| MOV A,direct | 直接地址中内容送累加器A |
| MOV A,@Ri | Ri中的间址内容送累加器A |
| MOV A,#data | 将立即数送到累加器A |
| MOV Rn, | 累加器A中的内容送到寄存器Rn |
| MOV Rn,direct | 直接地址中的内容送Rn |
| MOV Rn,#data | 立即数送Rn |
| MOV direct,A | 累加器A的内容送入直接地址中 |
| MOV direct,Rn | 寄存器R内容送入直接地址中 |
| MOV direct,direct | 源操作数直接地址的内容送入目的操作数的直接地址中 |
| MOV direct,@Ri | Ri间址内容送入直接地址中 |
| MOV direct,#data | 立即数送入直接地址中 |
| MOV @Ri,A | A中内容送入Ri间址单元中 |
| MOV @Ri,direct | 直接地址中内容送入Ri间址单元中 |
| MOV @Ri,#data | 立即数送入Ri间址单元中 |
| MOV DPTR,direct16 | 16位立即数送入数据指针DPTR中,高8位送入DPH,第8位送入DPL中 |
功能: 这两条指令属于查表指令,可以查找放在程序存储器中的数据表格的内容。
| 指令 | 功能 |
|---|---|
| MOVC A,@A+PC | PC+1→PC,(A+PC)→A |
| MOVC A,@A+DPTR | (A+DPTR)→A |
功能:用来与外部数据存储器区传送数据。
| 指令 | 功能 |
|---|---|
| MOVX A,@DPTR | DPTR间址单元内容送入累加器A |
| MOVX @DPTR,A | 累加器A中的内容诵读DPTR间址单元 |
| MOVX A,@Ri | Ri间址单元内容送A |
| MOVX @Ri,A | A中内容送Ri间址单元 |
| 指令 | 功能 |
|---|---|
| XCH A,Rn | Rn与A内容交换 |
| XCH A,direct | 直接地址内容与A内容交换 |
| XCH A,@Ri | Ri间址内容与A内容交换 |
| XCHD A,@Ri | Ri间址内容低4位与A中低四位内容交换 |
| SWAP A | A中高4位与低4位内容交换 |
| 指令 | 功能 |
|---|---|
| PUSH direct | 栈顶指针SP+1,然后将直接地址中的内容压入栈 |
| POP direct | 将堆栈栈顶内容弹出堆栈,栈顶指针SP-1 |
不带进位的加法运算指令。
| 指令 | 功能 |
|---|---|
| ADD A,Rn | A与Rn中内容相加后再送到A |
| ADD A,direct | A与直接地址中内容相加后再送到A |
| ADD A,@Ri | A与Ri间址内容相加后再送到A |
| ADD A,#data | A与立即数相加后再送到A |
带进位的加法运算指令。
| 指令 | 功能 |
|---|---|
| ADDC A,Rn | A与Rn中内容在进位状态相加后再送到A |
| ADDC A,direct | A与直接地址中内容在进位状态相加后再送到A |
| ADDC A,@Ri | A与Ri间址内容在进位状态相加后再送到A |
| ADD A,#data | A与立即数在进位状态相加后再送到A |
| 指令 | 功能 |
|---|---|
| SUBB A,Rn | A减Rn内容和进位标志 |
| SUBB A,direct | A减直接地址内容和进位标志 |
| SUBB A,@Ri | A减Ri间址单元内容和进位标志 |
| AUBB A,#data | A减立即数和进位标志 |
MUL(乘法)、DIV(除法)
| 指令 | 功能 |
|---|---|
| MUL AB | A与B相乘,高八位存入B,第八位存入A |
| DIV AB | A与B相除,商存入A,余数存入B |
INC(加1)
| 指令 | 功能 |
|---|---|
| INC A | A+1 |
| INC Rn | Rn中内容加1 |
| INC direct | 直接地址中内容加1 |
| INC @Ri | Ri间址中内容加1 |
| INC DPTR | 数据指针加1 |
DEC(减1)
| 指令 | 功能 |
|---|---|
| DEC A | A-1 |
| DEC Rn | Rn中内容减1 |
| DEC direct | 直接地址中内容减1 |
| DEC @Ri | Ri间址单元中的内容减1 |
功能:将二进制码调整成BCD码
| 指令 | 功能 |
|---|---|
| DA A | 将A中二进制调整为BCD码 |
功能:将源操作数的内容和目的操作数的内容按位“与”,结果存入目的操作数指定单元。
| 指令 | 功能 |
|---|---|
| ANL A,Rn | A和Rn中内容相与后的结果存入A |
| ANL A,direct | A和直接地址中内容相与后的结果存入A |
| ANL A,@Ri | A和Ri间址内容相与后的结果存入A |
| ANL A,#data | A和立即数相与后的结果存入A |
| ANL direct,A | A和直接地址中内容相与后的结果存入直接地址 |
| ANL direct,#data | 直接地址内容和立即数相与后的结果存入直接地址 |
功能:将源操作数内容和目的操作数内容按位“或”,结果存入目的操作数指定单元中。
| 指令 | 功能 |
|---|---|
| ORL A,Rn | A和Rn中内容相或后的结果存入A |
| ORL A,direct | A和直接地址中内容相或后的结果存入A |
| ORL A,@Ri | A和Ri间址内容相或后的结果存入A |
| ORL A,#data | A和立即数相或后的结果存入A |
| ORL direct,A | A和直接地址中内容相或后的结果存入直接地址 |
| OPL direct,#data | 直接地址内容和立即数相或后的结果存入直接地址 |
功能:将两个操作数指定内容按位“异或”,结果存入目的操作数指定单元中。
| 指令 | 功能 |
|---|---|
| XRL A,Rn | A和Rn中内容按位异或后的结果存入A |
| XRL A,direct | A和直接地址中内容按位异或后的结果存入A |
| XRL A,@Ri | A和Ri间址内容按位异或后的结果存入A |
| XRL A,#data | A和立即数按位异或后的结果存入A |
| XRL direct,A | A和直接地址中内容按位异或后的结果存入直接地址 |
| XPL direct,#data | 直接地址内容和立即数按位异或后的结果存入直接地址 |
功能:将累加器A中的内容循环位移或者和进位位一起移位。
| 指令 | 功能 |
|---|---|
| RL A | A中内容循环左移,执行该指令一次左移一位 |
| RR A | A中内容循环右移,执行该指令一次右移一位 |
| RLC A | A与进位位CY内容一起循环左移一位 |
| RRC A | A与进位位CY内容一起循环右移一位 |
| 指令 | 功能 |
|---|---|
| CPL A | 累加器A内容按位取反 |
| CLR A | 累加器A清0 |
| 指令 | 功能 |
|---|---|
| LJMP add16 | 无条件跳转到add16地址,可在64KB范围内转移,称为长转移指令 |
| AJMP add11 | 无条件转向add11地址,在2KB范围内转移 |
| SJMP rel | 相对转移,rel是偏移量,8位有符号数,跳转范围-128~127 |
| JMP @A+DPTR | 散转指令,无条件转向A与DPTR内容相加后形成的新地址 |
功能:根据某种特定条件转移的指令,条件满足时转移,条件不满足时则按顺序执行下面的指令。
| 指令 | 功能 |
|---|---|
| JZ rel | A=0则转向PC+2+rel→PC;A≠0则顺序执行 |
| JNC rel | A≠0则转向PC+2+rel→PC;A=0则顺序执行 |
| CJNE A,direct,rel | A≠(direct),则转向PC+3+rel→PC;当A>(direct),CY=0;当A<(direct),CY=1;当A=(direct),PC+3→PC顺序执行 |
| CJNE A,#data,rel | A≠data,则转向PC+3+rel→PC;当A>data,CY=0;当A<data,CY=1;当A=data,PC+3→PC顺序执行 |
| CJNE Rn,#data,rel | Rn≠data,则转向PC+3+rel→PC;当Rn>data,CY=0;当Rn<data,CY=1;当Rn=data,PC+3→PC顺序执行 |
| CJNE @Ri,#data,rel | (Ri)≠data,则转向PC+3+rel→PC,当(Ri)>data,CY=0,当(Ri)<data,CY=1,当(Ri)=data,PC+3→PC顺序执行 |
| DJNZ Rn,rel | Rn-1→Rn,Rn≠0转向PC+2+rel→PC;Rn=0,PC+2→PC顺序执行 |
| DJNZ direct,rel | (direct)≠0转向PC+2+rel→PC;(direct)=0,PC+2→PC顺序执行 |
| 指令 | 功能 |
|---|---|
| LCALL addr16 | 调用入口地址为addr16的子程序,可调用64KB范围内的子程序 |
| ACALL addr11 | 调用入口地址为addr11的子程序,可调用2KB范围内的子程序 |
| RET | 放在子程序最后,是程序返回到主程序断点处 |
| RETI | 中断返回指令,该指令用于中断服务程序,使中断结束后返回主程序断点处 |
| NOP | 空操作,执行该指令CPU只进行取指令、译码,不进行其他操作 |
| 指令 | 功能 |
|---|---|
| MOV C,bit | 寻址位的状态送入C |
| MOV bit,C | C的状态送入位地址中 |
C指累加器C即进位标志CY
| 指令 | 功能 |
|---|---|
| CLP C | 累加器清0 |
| CLP bit | 寻址位清0 |
| CPL C | 取反 |
| CPL bit | 寻址位取反 |
| SETB C | C置1 |
| SETB bit | 寻址位置1 |
| 指令 | 功能 |
|---|---|
| ANL C,bit | 寻址位和C“与”,结果存到C |
| ANL C,/bit | 寻址位的“非”和C“与”,结果存到C |
| ORL C,bit | 寻址位和C“或”,结果存到C |
| ORL C,/bit | 寻址位的“非”和C“或”,结果存到C |
| 指令 | 功能 |
|---|---|
| JC rel | C=1转向PC+2+ rel→PC;C=0顺序执行PC+2→PC |
| JNC rel | C=0转向PC+2+rel→PC;C=1顺序执行PC+2→PC |
| JB bit,rel | (bit)=1转向PC+3+rel→PC;(bit)=0顺序执行PC+3→PC |
| JNB bit,rel | (bit)=0转向PC+3+rel→PC;(bit)=1顺序执行PC+3→PC |
| JBC bit,rel | (bit)=1转向PC+3+rel→PC,同时0→(bit);(bit)=0顺序执行PC+3→PC |
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
我正在使用RABL输出Sunspot/SOLR结果集,搜索结果对象由多种模型类型组成。目前在rablView中我有:objectfalsechild@search.results=>:resultsdoattribute:id,:resource,:upccodeattribute:display_description=>:descriptioncode:start_datedo|r|r.utc_start_date.to_iendcode:end_datedo|r|r.utc_end_date.to_iendendchild@search=>:statsdoattribute:to
Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法,Linux…感兴趣就关注我吧!你定不会失望。目录1.ls显示当前目录下的文件内内容2.pwd-显示用户当前所在的目录3.cd-改变工作目录。将当前工作目录改变到指定的目录下1.cd-回到上一次待的工作空间2.cd..返回上一层目录1.相对路径:cd../aurora2.绝对路径:cd/home/aurora/lesson1/aurora3.cd~进入用户家目录4.cd/进入root目录4.mkdir-新建目录5.rmdir/rm-删除1.rmdir删除空文件夹2.rm删除1.rm-f2.rm-i3.rm-r1.ls显示当前目
文章目录前言核心逻辑配置iSH安装Python创建Python脚本配置启动文件测试效果快捷指令前言iOS快捷指令所能做的操作极为有限。假如快捷指令能运行Python程序,那么可操作空间就瞬间变大了。iSH是一款免费的iOS软件,它模拟了一个类似Linux的命令行解释器。我们将在iSH中运行Python程序,然后在快捷指令中获取Python程序的输出。核心逻辑我们用一个“获取当前日期”的Python程序作为演示(其实快捷指令中本身存在“获取当前日期”的操作,因而此需求可以不用Python,这里仅仅为了演示方便),核心代码如下。>>>importtime>>>time.strftime('%Y-%
我的应用程序设置为如果用户使用Oauth或Openid登录,他们不必确认他们的电子邮件地址。但是,Devise仍在发送电子邮件确认。当我调用User.skip_confirmation时!我得到一个未定义的方法错误。我的模型:classUserfalsedefself.find_for_facebook_oauth(access_token,signed_in_resource=nil)data=access_token.extra.raw_infoifuser=User.where(:email=>data.email).firstuserelse#User.skip_confirm
我在Railsroutingsystem中找不到关键字“mount”的含义.我已经设置了Mercury在我的Rails应用程序中使用。它将这一行添加到我的routes.rb配置文件中:Appname::Application.routes.drawdomountMercury::Engine=>'/'mount关键字是什么意思? 最佳答案 Mount在Rails路由中相当于Unixmount。它实际上告诉应用程序该位置存在另一个应用程序(通常是Rack应用程序)。它主要用于Rails引擎。
1.主要实验设备及器材1.1一块ESP8266(如图1)图1 ESP8266模块1.2一个USB转TTL模块(如图2)图2 USB转TTL模块2.测试ESP8266模块 2.1连接设备 WIFI模块与USB转TTL模块进行连接,连接实物图如图3所示,硬件连线框图如图4所示。图3 连接实物图图4 硬件连接框图2.2打开串口调试助手 本次实验使用的软件是XCOMV2.3,默认波特率为115200,停止位为1,数据位为8,校验位为None(如图5)。图5 XCOMV2.32.3输入测试指令AT 测试AT启动,返回OK(如图6)图6 AT测试2.4复位指令AT
内嵌汇编在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。但是内嵌汇编器并不支持诸如直接修改PC实现跳转的底层功能。内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。嵌入式汇编在形式上表现为独立定义的函数体。内嵌汇编指令的语法格式__asm(“指令[;指令]”);ARMC汇编器使用关键字“__asm"。如果有多条汇编指令需要嵌入,可以用“{}”将它们归为一条语句。如:__asm{指令[;指令]…[指令]}各指令用
我们如何编写下面的语句来提高可读性?Promotion.joins(:category).where(["lft>=?andrgt{:shop_id=>shops_id}).count('id',:distinct=>true)以下不编译Promotion.joins(:category).where(["lft>=?andrgt{:shop_id=>shops_id}).count('id',:distinct=>true)syntaxerror,unexpected'.',expectingkEND.where(["lft>=?andrgt 最佳答案
STM32CubeMX下载和安装详细教程【HAL库】STM32CubeMX开发----STM32F103/F207/F407----目录前言HAL库有自带的ms级延时函数:HAL_Delay();缺点1:无法实现us级延时缺点2:此延时函数是由SysTick滴答定时器中断产生的,滴答定时器的中断优先级是所有中断中最低的,无法在其他中断中产生延时。一、STM32F407----delay延时实验本次实验以STM32F407VET6芯片为MCU,使用25MHz外部时钟源。系统时钟SYSCLK=168MHz,使用__NOP();空指令实现延时。User_delay.c#include"User_de