草庐IT

汇编指令合集

大拨鼠 2023-12-07 原文

文章目录

指令的分类

51系列单片机共111条指令,常见的分类方式有以下几种。

按寻址方式分为以下7种:

  • 立即寻址。

  • 直接寻址。

  • 寄存器寻址。

  • 寄存器间接寻址。

  • 相对寻址。

  • 变址寻址。

  • 位寻址。

按功能分为以下4种:

  • 数据传送指令。
  • 算术、逻辑运算指令。
  • 控制转移类指令。
  • 位操作指令(布尔指令)。

按字节分类:

  • 单字节指令。
  • 双字节指令。
  • 三字节指令。

指令中常用符号的说明

符号含义
Rn当前寄存器区的8个工作寄存器R0~R7(n=0-7)
Ri可作地址寄存器的2个工作寄存器R0和R1
direct内部数据存储单元的地址及特殊功能寄存器的地址
#data表示8位立即数
#data16表示16位立即数
add16表示16位地址
addrll表示11位地址
rel8位带符号的地址偏移量
bit表示位地址
@间接寻址寄存器或基址寄存器的前缀
( )表示括号中单元的内容
(( ))表示间接寻址的内容

指令系统

数据传送指令

MOV类指令及功能

功能:从源操作数到目的操作数的数据传送。

指令功能
MOV A,Rn将寄存器Rn中的内容送到累加器A
MOV A,direct直接地址中内容送累加器A
MOV A,@RiRi中的间址内容送累加器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,@RiRi间址内容送入直接地址中
MOV direct,#data立即数送入直接地址中
MOV @Ri,AA中内容送入Ri间址单元中
MOV @Ri,direct直接地址中内容送入Ri间址单元中
MOV @Ri,#data立即数送入Ri间址单元中
MOV DPTR,direct1616位立即数送入数据指针DPTR中,高8位送入DPH,第8位送入DPL中

MOVC类指令及功能

功能: 这两条指令属于查表指令,可以查找放在程序存储器中的数据表格的内容。

指令功能
MOVC A,@A+PCPC+1→PC,(A+PC)→A
MOVC A,@A+DPTR(A+DPTR)→A

MOVX类指令及其功能

功能:用来与外部数据存储器区传送数据。

指令功能
MOVX A,@DPTRDPTR间址单元内容送入累加器A
MOVX @DPTR,A累加器A中的内容诵读DPTR间址单元
MOVX A,@RiRi间址单元内容送A
MOVX @Ri,AA中内容送Ri间址单元

交换指令机器功能

指令功能
XCH A,Rn​Rn与A内容交换
XCH A,direct直接地址内容与A内容交换
XCH A,@RiRi间址内容与A内容交换
XCHD A,@RiRi间址内容低4位与A中低四位内容交换
SWAP AA中高4位与低4位内容交换

堆栈操作指令及其功能

指令功能
PUSH direct栈顶指针SP+1,然后将直接地址中的内容压入栈
POP direct将堆栈栈顶内容弹出堆栈,栈顶指针SP-1

算术运算指令

ADD类指令

不带进位的加法运算指令。

指令功能
ADD A,RnA与Rn中内容相加后再送到A
ADD A,directA与直接地址中内容相加后再送到A
ADD A,@RiA与Ri间址内容相加后再送到A
ADD A,#dataA与立即数相加后再送到A

ADDC类指令

带进位的加法运算指令。

指令功能
ADDC A,RnA与Rn中内容在进位状态相加后再送到A
ADDC A,directA与直接地址中内容在进位状态相加后再送到A
ADDC A,@RiA与Ri间址内容在进位状态相加后再送到A
ADD A,#dataA与立即数在进位状态相加后再送到A

SUBB类指令

指令功能
SUBB A,RnA减Rn内容和进位标志
SUBB A,directA减直接地址内容和进位标志
SUBB A,@RiA减Ri间址单元内容和进位标志
AUBB A,#dataA减立即数和进位标志

MUL和DIV指令

MUL(乘法)、DIV(除法)

指令功能
MUL ABA与B相乘,高八位存入B,第八位存入A
DIV ABA与B相除,商存入A,余数存入B

INC指令和DEC指令

INC(加1)

指令功能
INC AA+1
INC RnRn中内容加1
INC direct直接地址中内容加1
INC @RiRi间址中内容加1
INC DPTR数据指针加1

DEC(减1)

指令功能
DEC AA-1
DEC RnRn中内容减1
DEC direct直接地址中内容减1
DEC @RiRi间址单元中的内容减1

十进制加法调整指令

功能:将二进制码调整成BCD码

指令功能
DA A将A中二进制调整为BCD码

逻辑运算指令

ANL类指令

功能:将源操作数的内容和目的操作数的内容按位“与”,结果存入目的操作数指定单元。

指令功能
ANL A,RnA和Rn中内容相与后的结果存入A
ANL A,directA和直接地址中内容相与后的结果存入A
ANL A,@RiA和Ri间址内容相与后的结果存入A
ANL A,#dataA和立即数相与后的结果存入A
ANL direct,AA和直接地址中内容相与后的结果存入直接地址
ANL direct,#data直接地址内容和立即数相与后的结果存入直接地址

ORL类指令

功能:将源操作数内容和目的操作数内容按位“或”,结果存入目的操作数指定单元中。

指令功能
ORL A,RnA和Rn中内容相或后的结果存入A
ORL A,directA和直接地址中内容相或后的结果存入A
ORL A,@RiA和Ri间址内容相或后的结果存入A
ORL A,#dataA和立即数相或后的结果存入A
ORL direct,AA和直接地址中内容相或后的结果存入直接地址
OPL direct,#data直接地址内容和立即数相或后的结果存入直接地址

XRL类指令

功能:将两个操作数指定内容按位“异或”,结果存入目的操作数指定单元中。

指令功能
XRL A,RnA和Rn中内容按位异或后的结果存入A
XRL A,directA和直接地址中内容按位异或后的结果存入A
XRL A,@RiA和Ri间址内容按位异或后的结果存入A
XRL A,#dataA和立即数按位异或后的结果存入A
XRL direct,AA和直接地址中内容按位异或后的结果存入直接地址
XPL direct,#data直接地址内容和立即数按位异或后的结果存入直接地址

循环移位指令

功能:将累加器A中的内容循环位移或者和进位位一起移位。

指令功能
RL AA中内容循环左移,执行该指令一次左移一位
RR AA中内容循环右移,执行该指令一次右移一位
RLC AA与进位位CY内容一起循环左移一位
RRC AA与进位位CY内容一起循环右移一位

取反、清0指令

指令功能
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 relA=0则转向PC+2+rel→PC;A≠0则顺序执行
JNC relA≠0则转向PC+2+rel→PC;A=0则顺序执行
CJNE A,direct,relA≠(direct),则转向PC+3+rel→PC;当A>(direct),CY=0;当A<(direct),CY=1;当A=(direct),PC+3→PC顺序执行
CJNE A,#data,relA≠data,则转向PC+3+rel→PC;当A>data,CY=0;当A<data,CY=1;当A=data,PC+3→PC顺序执行
CJNE Rn,#data,relRn≠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,relRn-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,CC的状态送入位地址中

位修正指令

C指累加器C即进位标志CY

指令功能
CLP C累加器清0
CLP bit寻址位清0
CPL C取反
CPL bit寻址位取反
SETB CC置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 relC=1转向PC+2+ rel→PC;C=0顺序执行PC+2→PC
JNC relC=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

有关汇编指令合集的更多相关文章

  1. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  2. ruby-on-rails - Rabl 多模合集 - 2

    我正在使用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

  3. 【Linux】初识Linux --指令Ⅰ - 2

    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显示当前目

  4. iOS快捷指令:执行Python脚本(利用iSH Shell) - 2

    文章目录前言核心逻辑配置iSH安装Python创建Python脚本配置启动文件测试效果快捷指令前言iOS快捷指令所能做的操作极为有限。假如快捷指令能运行Python程序,那么可操作空间就瞬间变大了。iSH是一款免费的iOS软件,它模拟了一个类似Linux的命令行解释器。我们将在iSH中运行Python程序,然后在快捷指令中获取Python程序的输出。核心逻辑我们用一个“获取当前日期”的Python程序作为演示(其实快捷指令中本身存在“获取当前日期”的操作,因而此需求可以不用Python,这里仅仅为了演示方便),核心代码如下。>>>importtime>>>time.strftime('%Y-%

  5. ruby-on-rails - 设计 skip_confirmation!未能避免发送确认指令 - 2

    我的应用程序设置为如果用户使用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

  6. ruby-on-rails - Rails 路由中的 "mount"指令是什么意思? - 2

    我在Railsroutingsystem中找不到关键字“mount”的含义.我已经设置了Mercury在我的Rails应用程序中使用。它将这一行添加到我的routes.rb配置文件中:Appname::Application.routes.drawdomountMercury::Engine=>'/'mount关键字是什么意思? 最佳答案 Mount在Rails路由中相当于Unixmount。它实际上告诉应用程序该位置存在另一个应用程序(通常是Rack应用程序)。它主要用于Rails引擎。

  7. APP连接ESP8266——采用AT指令 - 2

    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

  8. 嵌入式:ARM内嵌汇编及C和ARM汇编相互调用 - 2

    内嵌汇编在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。但是内嵌汇编器并不支持诸如直接修改PC实现跳转的底层功能。内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。嵌入式汇编在形式上表现为独立定义的函数体。内嵌汇编指令的语法格式__asm(“指令[;指令]”);ARMC汇编器使用关键字“__asm"。如果有多条汇编指令需要嵌入,可以用“{}”将它们归为一条语句。如:__asm{指令[;指令]…[指令]}各指令用

  9. Ruby代码美化,将长指令拆分成多行 - 2

    我们如何编写下面的语句来提高可读性?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 最佳答案

  10. 【HAL库】STM32CubeMX开发----delay延时实验----NOP空指令 - 2

    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

随机推荐