当前位置: 首页 > news >正文

汇编的使用总结

一、汇编的组成

1、汇编指令(指令集)

        数据处理指令:

                数据搬移指令

                数据移位指令

                位运算指令

                算术运算指令

                比较指令

        跳转指令

        内存读写指令

        状态寄存器传送指令

        异常产生指令等

2、伪指令

        不是汇编指令,但是可以起到指令的作用,伪指令也会占用一定内存空间

3、伪操作

        不占用指令内存,能够在程序编译过程中起到编译引导作用的内容

4、注释

二、汇编指令

2.1基本格式 

<opcode>{<cond>}{s}        <Rd>,<Rn>,<shifter_operand>

注释:

        opcode:指令的功能码,用来表示当前指令的作用

(可以写,也可以不写        

        cond:条件码

        s:表示进行运算时运算的结果会影响到CPSR条件位

  )

        Rd:目标寄存器

        Rn:第一操作寄存器

        shifter_operand:第二操作寄存器

 2.2数据搬移指令

1、mov{条件码}        目标寄存器 操作数

        将操作数搬移到目标寄存器

2、mvn{条件码}        目标寄存器 操作数

        将操作数按位取反后搬移到目标寄存器

注意:

        操作数可以是一个寄存器,也可以是一个立即数

立即数:能够经过编码之后保存到指令空间中直接当作指令一部分去执行的数据。

如果想要把一个非立即数搬移到目标寄存器,使用伪指令ldr,格式:ldr  目标寄存器,=数据

2.3数据移位指令

1、逻辑左移

        lsl{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据左移第二操作数位数,结果保存到目标寄存器

2、逻辑右移

        lsr{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据右移第二操作数位数,结果保存到目标寄存器

3、循环右移

        ror{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据循环右移第二操作数位数,结果保存到目标寄存器

2.4位运算指令 

1、与运算

        and{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据和第二操作数进行与运算,结果保存到目标寄存器

2、或运算

        orr{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据和第二操作数进行或运算,结果保存到目标寄存器

3、异或运算

        eor{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据和第二操作数进行异或运算,结果保存到目标寄存器

4、按位取反

        mvn{条件码}        目标寄存器,第一操作寄存器,第二操作数

5、按位清零

        bic{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据和第二操作数进行与运算,结果保存到目标寄存器

2.5算术运算

1、加法运算

         add{条件码}{s}        目标寄存器,第一操作寄存器,第二操作数

                目标寄存器=第一操作寄存器+第二操作数

2、考虑CPSR条件位的加法运算

         adc{条件码}{s}        目标寄存器,第一操作寄存器,第二操作数

                目标寄存器=第一操作寄存器+第二操作数+cpsr寄存器c位的值

3、减法运算

         sub{条件码}{s}        目标寄存器,第一操作寄存器,第二操作数

                目标寄存器=第一操作寄存器-第二操作数

4、考虑CPSR条件位的减法运算

         sbc{条件码}{s}        目标寄存器,第一操作寄存器,第二操作数

                目标寄存器=第一操作寄存器-第二操作数-cpsr寄存器c位的值

5、乘法运算

         mul{条件码}{s}        目标寄存器,第一操作寄存器,第二操作数

                目标寄存器=第一操作寄存器*第二操作数

 2.6比较指令

1、cmp        第一操作寄存器,第二操作数

        将第一操作寄存器和第二操作数进行比较

2、tst        目标寄存器,#(0x1<<N)

        用来判断目标寄存器的第N位是否为0

3、teq         目标寄存器,第二操作数

        判断目标寄存器的值是否和第二操作数相等

2.7跳转指令 

1、b        标签

        跳转到指定的标签下,跳转后LR寄存器不保存程序返回地址

2、bl        标签

        跳转到指定的标签下,跳转后LR寄存器保存程序返回地址

2.8内存读写指令 

①单寄存器内存读写指令

写:

        1、str        目标寄存器,[目标地址]

                将目标寄存器中四字节数据写入到目标地址对应的内存中  

        2、strh        目标寄存器,[目标地址]

                将目标寄存器中二字节数据写入到目标地址对应的内存中

        3、strb        目标寄存器,[目标地址]

                将目标寄存器中一字节数据写入到目标地址对应的内存中

读:

        1、ldr        目标寄存器,[目标地址]

                从目标寄存器中读取四字节数据到目标地址对应的内存中  

        2、ldrh        目标寄存器,[目标地址]

                将目标寄存器中读取二字节数据到目标地址对应的内存中

        3、ldrb        目标寄存器,[目标地址]

                将目标寄存器中读取一字节数据到目标地址对应的内存中


②批量寄存器内存读写指令

写:

        1、stm        基地址,{寄存器列表}

                将寄存器列表中所有寄存器的数据写入到基地址为首地址的内存中 

读:

        1、ldm        基地址,{寄存器列表}

                从基地址开始往下读取数据,保存到寄存器列表中的每一个寄存器中

批量寄存器地址增长方式

        Ⅰ、ia后缀        先向基地址读写数据,基地址再往大地址方向增长

        Ⅱ、ib后缀       基地址先往大地址方向增长,再向基地址读写数据

        Ⅲ、da后缀         先向基地址读写数据,基地址再往小地址方向增长

        Ⅳ、da后缀        基地址先往小地址方向增长,再向基地址读写数据         


③栈内存读写

        压栈:

                push        {寄存器列表}

        出栈:

                pop        {寄存器列表}

栈的分类:

        1、空栈和满栈

        2、增栈和减栈

        组合:空增栈(EA)        空减栈(ED)        满增栈(FA)        满减栈(FD)

2.9状态寄存器传送指令

1、读状态寄存器指令

        mrs        目标寄存器,CPSR

                读取CPSR寄存器数值,保存到目标寄存器

2、修改状态寄存器

        msr        CPSR,操作数

                修改CPSR寄存器的数值为操作数

2.10软中断产生指令 

1、swi        操作数

        操作数是一个立即数,就是产生软中断的中断号

异常模式和异常源

 

http://www.lryc.cn/news/528028.html

相关文章:

  • DeepSeek理解概率的能力
  • AI 浪潮席卷中国年,开启科技新春新纪元
  • AI时代的网络安全:传统技术的落寞与新机遇
  • 可以称之为“yyds”的物联网开源框架有哪几个?
  • 线程局部存储tls的原理和使用
  • RK3588平台开发系列讲解(ARM篇)ARM64底层中断处理
  • CAN总线
  • qwen2.5-vl:阿里开源超强多模态大模型(包含使用方法、微调方法介绍)
  • python实现dbscan
  • 学习数据结构(3)顺序表
  • 正在更新丨豆瓣电影详细数据的采集与可视化分析(scrapy+mysql+matplotlib+flask)
  • wx043基于springboot+vue+uniapp的智慧物流小程序
  • 每日一题 430. 扁平化多级双向链表
  • UE学习日志#14 GAS--ASC源码简要分析10 GC相关
  • 使用Python和Qt6创建GUI应用程序--关于Qt的一点介绍
  • C#@符号在string.Format方法中作用
  • Next.js 14 TS 中使用jwt 和 App Router 进行管理
  • 【贪心算法】洛谷P1090 合并果子 / [USACO06NOV] Fence Repair G
  • Windows11无法打开Windows安全中心主界面
  • 下载arm架构的deb包的方法
  • 【Day29 LeetCode】动态规划DP
  • 5分钟带你获取deepseek api并搭建简易问答应用
  • LeetCode题练习与总结:最短无序连续子数组--581
  • 探秘 TCP TLP:从背景到实现
  • linux学习之网络编程
  • scrol家族 offset家族 client家族学习
  • css-background-color(transparent)
  • 如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt
  • 【Samba】Ubuntu20.04 Windows 共享文件夹
  • gradle和maven的区别以及怎么选择使用它们