ARM汇编指令

数据和指令类型

ARM采用的是32位架构
ARM约定:
Byte:8 bits
Halfword:16 bits (2 byte)
Word:32 bits (4 byte)
Doubleword:64-bits(8byte) (Cortex-A处理器)
大部分ARM core 提供:
ARM 指令集(32-bit)
Thumb 指令集(16-bit )
Cortex-A 处理器
16 位和 32 Thumb-2 指令集
16 位和 32 ThumbEE 指令集
Jazelle cores 支持 Java bytecode
ARM有7个基本工作模式
User:非特权模式,大部分任务执行在这种模式
FIO:当一个高优先级 (fast) 中断产生时将会进入这种模式
IRQ:当一个低优先级(normal) 中断产生时将会进入这种模式
Supervisor:当复位或软中断指令执行时将会进入这种模式
Abort:当存取异常时将会进入这种模式
Undef:当执行未定义指令时会进入这种模式
System:使用和User模式相同寄存器集的特权模式
Cortex-A特有模式:
Monitor:是为了安全而扩展出的用于执行安全监控代码的模式;也是一种特权模式
异常处理
当异常产生时 , ARM core:
        拷贝 CPSR SPSR_<mode>
        设置适当的 CPSR 位: 偏移向量表
        改变处理器状态进入 ARM
        改变处理器模式进入相应的异常模式
        设置中断禁止位禁止相应中断 (如果需要)
        保存返回地址到 LR_<mode>
        设置 PC 为相应的异常向量
返回时, 异常处理需要:
        从 SPSR_<mode>恢复CPSR
        从LR_<mode>恢复PC
        Note:这些操作只能在 ARM 态执行
偏移向量表
0x1C               FIQ
0x18                IRQ
0x14                Reserved
0x10                Data Abort
0x0C                Prefetch Abort
0x08                Software Interrupt
0x04                Undefined Instruction
0x00                Reset
指令流水线
为增加处理器指令流的速度,ARM7 系列使用3级流水线
允许多个操作同时处理,而非顺序执行
PC指向正被取指的指令,而非正在执行的指令
对齐
存储器访问必须始终适当地保持地址对齐
        非对齐地址将产生不可预测的/未定义的结果
用‘Data Abort’ 异常来检测无效的非对齐数据存取
        需要额外的扩展逻辑,或者MMU来实现
        谨防指令读取时出现非对齐
非对齐数据存取能够完成, 但不是用 LDR
        使用 LDRB, STRB 传递字节,或使用LDM 加移位/屏蔽
ARM汇编中的文件格式
基于ARM的工程源代码由以文件形式组织。
ARM源程序文件(可简称为源文件)可以由任意一种文本编辑器来编写程序代码,它一般为文本格式。在ARM程序设计中,常用的源文件可简单分为以下几种:
源程序文件文件名说明
汇编程序文件*.S *.s
用ARM汇编语言编写的ARM程序
或Thumb程序( 汇编代码可直接操作CPU内部的REG)
C程序文件*.C *.c用C语言编写的程序代码
头文件*.H *.h
为了简化源程序,把程序中常用到的常量命名、宏定义、
数据结构定义等等单独放在一个文件中,一般称为头文件
ARM汇编语言程序格式
       
        ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。
        段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要的数据。
        一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。
        在汇编文件中,我们需要先定义一个段,在段中添加我们实现的汇编程序语句。
ARM汇编语言中常用的伪操作
伪操作语法格式作用
CODE16CODE16告诉汇编编译器后面的指令序列为16位的Thumb指令
CODE32
CODE32
告诉汇编编译器后面的指令序列为 32 位的ARM 指令
AREA
AREA sectionname {,attr} {,attr}
定义一个代码段或者数据段
ENTRYENTRY指定程序的入口点
ENDEND告诉编译器已经到了源程序结尾
EXPORTEXPORT symbol {[WEAK]}声明一个符号可以被其他文件引用
SPACE {label} SPACE expr
分配一块连续内存单元,并用 0 初始化
DCD{label} DCD expr {expr}分配一段字内存单元
ARM汇编语言语句格式如下所示:
        {symbol<instruction | directive | pseudo-instruction> {;comment
其中:
        instruction                             为指令。
        directive                                为伪操作。
        pseudo-instruction              为伪指令。
        symbol                                  为标号。
        comment                              为语句的注释。
ARM汇编语言的伪指令
伪指令语法格式作用
ADR
ADR{cond} register, expr
将基于 PC 或基于寄存器的地址值读取到
寄存器中。小范围的地址读取。
ADRL
ADRL{cond} register, expr
将基于 PC 或基于寄存器的地址值读取到
寄存器中。中等范围的地址读取。
LDR
LDR {cond} register,  =[ expr | label-expr]
将一个 32 位的立即数或者一个地址值读取到
寄存器中。大范围的地址读取。
NOPNOP在汇编时将被替换成ARM中的空操作。
指令分类及指令格式
ARM 指令集可以分为六大类
        1.分别为数据处理指令 ( 完成 CPU 内部的计算)
        2. Load/Store指令 ( 完成 CPU 与内存 IO 外设之间的数据传输)
        3. 跳转指令 ( 完成程序的跳转)
        4. 程序状态寄存器处理指令 ( 完成 CPSR 的管理 )
        5. 协处理器指令 ( 完成 CPU 扩展功能的实现 )
        6. 异常产生指令 ( 用户程序异常触发 )
指令格式中符号说明
        〈opcode〉{cond}{S} Rd〉,〈Rn{,〈operand2〉}
opcode         操作码;指令助记符,如 LDR STR 等。
cond             可选的条件码;执行条件,如EQ、NE 等。
S                  可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。
Rd                目标寄存器。
Rn                存放第1操作数的寄存器。
Operan         d2 第 2 个操作数
数据处理指令
算术指令:
ADD        ADC        SUB        SBC        RSB        RSC
位运算指令:
AND        ORR        EOR        BIC
比较指令:
CMP        CMN        TST        TEQ
数据搬移:
MOV        MVN
上述指令只能对寄存器操作,不能针对存储器。
语法:
        <操作>{<cond>}{S} Rd, Rn, Operand2
        只有比较指令影响标志位 -不指定Rd
        数据搬移(MOV指令)不指定Rn
第二个操作数通过桶型移位器送到ALU中。
条件码
下表为所有可能的条件码:
注意:AL为默认状态,不需要单独指出
Suffix
描述
测试的标志位
EQ
等于(Equal)
Z=1
NE不等于(Not Equal)Z=0
CS/HS
无符号的大于或等于
C=1
CC/LO
无符号的小于
C=0
MI
负数(Minus)
N=1
PL
正数或零
N=0
VS
溢出(Overflow)
V=1
VC
没溢出
V=0
HI
无符号的大于
C=Z=0
LS
无符号的小于或大于
C=0 | Z=1
GE
大于等于
N=V
LT
小于(Less Than)
N!=V
GT
大于(Greater Than)
Z=0 & N=V
LE
小于等于
Z=1 | N=!V
AL
总是执行(Always)
立即数
没有任何一条 ARM 指令可包括一个 32 bit 的立即数
         所有的ARM指令都是32 bits固定长度
数据处理指令格式中,第二个操作数有 12
4 bit 移位值 (0-15) 乘于 2 ,得到一个范围在 0-30 ,步长为 2 的移位值
记住一条准则:“最后 8 位一定要移动偶数位”
下列命令中,汇编器把立即数转换为移位操作:
        MOV r0, #4096                            ;uses 0x40 ror 26
        ADD  r1, r2, #0xFF0000               ;uses 0xFF ror 16
也可使用 MVN来进行位反转:
        MOV r0, #0xFFFFFFFF               ;assembles to MVN r0 , # 0
立即数不能使用上述方法产生,否则将导致错误。
装载32 bit常数
为允许装载大常数,汇编器提供了一条伪指令:
        LDR rd, =const
它可能汇编成下列指令:
        MOV or MVN
        LDR 指令,从数据池(Literal pools)读取常数。
For example
        LDR r0, =0xFF => MOV r0,#0xFF
        LDR r0, =0x55555555 => LDR r0,[PC,#Imm12]
        …
        …
        DCD 0x55555555
建议把常数装载到寄存器中时一律使用该伪指令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/614380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化改进YOLOv5算法之Deformable Attention,效果秒杀CBAM和CA等

目录 1 Deformable Attention模块原理 2 YOLOv5中加入Deformable Attention模块 2.1 common.py文件配置 2.2 yolo.py配置

由于找不到msvcp140.dll无法继续执行代码原因及解决教程分享

在计算机打开软件过程&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“由于找不到msvcp140.dll无法继续执行代码”。这个错误通常发生在使用Microsoft Visual C 2015或更高版本编译的程序运行时。那么&#xff0c;什么是msvcp140.dll文件&#xff1f;为什么会…

59.螺旋矩阵II

class Solution { public:vector<vector<int>> generateMatrix(int n) {//二维数组初始化 // int dis[4][4]{{-1,0},{1,0},{0,-1},{0,1}};int dis[4][4]{{0,1},{1,0},{0,-1},{-1,0}};//右下左上 0,1,2,3//cout<< dis[0][0]<<" "<<dis…

定制耐酸碱移液吸头PFA移液枪头可重复使用

移液枪是移液器的一种&#xff0c;常用于实验室少量或微量液体的移取&#xff0c;规格不同&#xff0c;不同规格的移液枪配套使用不同大小的枪头&#xff0c;不同生产厂家生产的形状也略有不同&#xff0c;但工作原理及操作方法基本一致。移液枪属精密仪器&#xff0c;使用及存…

C++函数(3)

纯粹素数 题目描述&#xff1a;纯粹素数是这样定义的&#xff1a;一个素数&#xff0c;去掉最高位&#xff0c;剩下的数仍为素数&#xff0c;再去掉剩下的数的最高位&#xff0c;余下的数还是素数。这样下去一直到最后剩下的个位数也还是素数。求出所有小于3000的四位的纯粹素…

电脑可以连接网络但浏览器无法访问部分或全部网页

啾咪&#xff01;离大谱了&#xff0c;电脑一段时间没有用&#xff0c;最近打开却发现可以连接网络但是无法访问部分网页&#xff08;如CSDN&#xff09;&#xff0c;显示如下&#xff1a; 有三种解决方法&#xff1a; &#xff08;1&#xff09;清除DNS缓存 步骤&#xff1a;…

离散数学3

补变元 解释&#xff1a;它是以反^作为一组一组的&#xff0c;因此&#xff0c;对于P反^Q来说&#xff0c;P是一组&#xff0c;Q是一组&#xff0c;又有以下&#xff1a;对缺少变元的项要补齐&#xff0c;P缺少Q&#xff0c;Q缺少P。因此&#xff0c;补齐。 用分配律展开 解释&…

useEffect监听多个变量

useEffect监听了多个变量怎么办&#xff1f; 前言 如何监听多个变量&#xff1f;在React开发中经常会遇到的问题。随着应用复杂性的增加&#xff0c;组件中可能涉及多个状态的变化&#xff0c;根据这种变化可以做相应的业务&#xff0c;这时候监听就变得很有必要了。 常见的…

C#,入门教程(15)——类(class)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(14)——字符串与其他数据类型的转换https://blog.csdn.net/beijinghorn/article/details/124004562 物以类聚&#xff0c;凡物必类。 类的使用&#xff0c;须遵循几个简单的原则&#xff1a; &#xff08;1&#xff09;能类则类&a…

系统学习Python——警告信息的控制模块warnings:测试警告

分类目录&#xff1a;《系统学习Python》总目录 要测试由代码引发的警告&#xff0c;我们可以采用catch_warnings上下文管理器。有了它&#xff0c;就可以临时改变警告过滤器以方便测试。例如&#xff0c;以下代码可捕获所有的警告以便查看&#xff1a; import warningsdef fx…

使用 Ant Design Pro 的图表(展示cpu、内存、硬盘)

文章目录 使用 Ant Design Pro 的图表&#xff08;展示cpu、内存、硬盘&#xff09;一、Ant Design Charts 图表二、快速上手三、ant design chart 图表类型StatisticCard 指标卡结合 Ant Design Charts 图表库丰富数值内容&#xff0c;满足大多数数值展示的场景什么是水波图&a…

鸿蒙原生应用再添新丁!万达 入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;万达 入局鸿蒙 来自 HarmonyOS 微博1月11日消息&#xff0c;#万达酒店及度假村启动鸿蒙原生应用及元服务开发# 作为具有中国特色的国牌服务酒店标杆之一&#xff0c;万达酒店及度假村Wanda 将带来全新的服务和交互方式&#xff0c;一步获取“…

网络之路28:二层链路聚合

正文共&#xff1a;1666 字 14 图&#xff0c;预估阅读时间&#xff1a;2 分钟 目录 网络之路第一章&#xff1a;Windows系统中的网络 0、序言 1、Windows系统中的网络1.1、桌面中的网卡1.2、命令行中的网卡1.3、路由表1.4、家用路由器 网络之路第二章&#xff1a;认识企业设备…

计算机的中断

将用户态转换为内核态 系统调用&#xff1a;应用程序向OS发出服务请求异常&#xff1a;不良的应用程序的非法指令中断&#xff1a;来源于外部设备&#xff0c;即不同的硬件设备的计时器和网络中断&#xff0c;其对应用程序是透明的 应用调用外设 应用——>OS——>外设…

微信小程序如何使用天地图的逆地理编码api

本文只介绍如何使用天地图api&#xff0c;如若要显示天地图&#xff0c;使用 web-view 天地图逆地理编码api 1、使用wx.request 发送请求 getLocation() {wx.getLocation({type: gcj02,success: (res) > {// 调用天地图逆地理编码apithis.initTianDiMap(res.longitude, re…

代理IP的计费方式有哪些?

代理IP是网络爬虫、数据分析、电商运营等网络活动的必备工具&#xff0c;可以从优质的代理IP提供商中购买&#xff0c;那么代理 IP 服务的付费模式主要有哪些呢&#xff1f; 1、按量计费 按量计费是一种按照实际使用量来收费的方式。一般来说&#xff0c;这种计费方式的单价会…

华为OD机试真题-字符串拼接-2023年OD统一考试(C卷)

题目描述: 给定M(0<M<=30)个字符(a-z),从中取出任意字符(每个字符只能用一次)拼接成长度为N(0<N<=5)的字符串,要求相同的字符不能相邻,计算出给定的字符列表能拼接出多少种满足条件的字符串,输入非法或者无法拼接出满足条件的字符串则返回0。 输入描述: …

【AI】ObjectCenteredSensing

1. 物体检测 .1. 流体 D. V. Q. Rodrigues, D. Rodriguez and C. Li, “Liquid Aerosol Detection Based on Sub-THz Portable Doppler Radars,” 2020 IEEE Asia-Pacific Microwave Conference (APMC), 2020, pp. 504-506, doi: 10.1109/APMC47863.2020.9331483. [pdf] Bala …

Backtrader 文档学习-Strategy with Signals

Backtrader 文档学习-Strategy with Signals backtrader可以不通过重写策略的方式触发交易&#xff0c;尽管重写策略是首选通用的方式。 下面介绍通过使用信号也是可以实现交易触发的。 1.定义signal import backtrader as btdata bt.feeds.OneOfTheFeeds(datanamemydatana…