常用ARM汇编指令

2023-11-06

空指令--nop

nop

传输指令--MOV

MOV R1,#3           @用c表示  r1=3;
​
MOV R1,#0X17            @r1=0x17;
​
MOV R0,R1                 @ r0 =r1;
​
MVN R0,R1   @将RO取反给R1 相当于r1 = ~r0;

建议赋值时候直接给16进制方便调试

算术指令集 --加法ADD 减法SUB 乘法MUL

ADD R0,R1,R2  @R0 = R1+R2
​
SUB R0,R1,#3   @R0 =R1 - 3
​
MUL R1,R2,R3  @R1 =R2*R3
​
ADD R0,#1       @R0 = R0+1
​
@ADD不会进位
@ADDS 带进位的加法,进位时反映但CPSR的C位
@ADDC 带进位的加法、加运算时,加上CPSR的C位

移位指令--左移LSL,右移LSR

MOV  R0,R1,LSL#2  @R0 = R1<<2
​
MOV R2,R1,LSR#1 @R2 = R1>>1
​
ADD R2,R0,LSR#1 @R2 = R2+R0>>1
@lsl逻辑移位
@asl算数移位
@关于算数移位和逻辑移位的知识:@https://blog.csdn.net/cg2258911936/article/details/103574604
​
MOV R0,R1,LSL#2   @R0=R1<<2;
MOV R2,R1,LSR#1   @R2=R1>>1
ADD R2,R0 LSL#1   @R2 = R2+R0<<1
​
​
         
@CPSR访问指令

跳转指令--B,BL

B label   @跳转到label标签
B main    @跳转到标号为main的代码处
BL func   @保存下一条要执行的指令的位置到LR寄存器,跳转函数func
          @当跳转代码结束后,用MOV,PC,LR返回

CPSR访问指令MRS ,MSR

MRS R0 ,CPSR    @R0 = CPSR;
​
MSR CPSR,R0     @CPSR = R0;

位运算AND ORR BIC TST

AND R0,R1,#0XFF  @R0 = R1&0XFF
​
ORR R3,R0,#0X0F  @R3 = R0|0X0F
​
BIC R0,R0,#0X03  @清除R0中的0号位和1号位
​
TST R0,#0X20     @测试第5位是否为0,为0则Z标志置1

比较指令--CMP

CMP R0,R1   
@比较RO与R1的值
@注意:比较结果反映在CPSR中的N Z C位
@R0>R1 Z = 1
@R0<R1 C = 1
@R0=R1 Z = C = 1

条件指令执行实例

一系列指令都使用条件指令
if (a == 0)  x = 1;
CMP R1,#0
MOVEQ R0,#1
​
置标志位,再使用不同的条件码
if (a == 0) x = 0;
if (a > 0)  x = 1;
CMP R0,#0
MOVEQ R0,#0  @EQ是等于
MOVGT R1,#1  @GT是大于
​
使用条件比较指令
if (a == 4 || a == 10) x = 0;
CMP R0,#4
CMPNE R0,#10
MOVEQ R1,#0

状态码

int r0=1;
int r1=5;
int r2=3;
int max;
max=(r0>=r1)?r0:r1;
max=(max>=r2)?max:r2;

练习

@测试当前工作状态是否为ARM,是的话 R5 = 0XFF

MRS R0,CPSR
​
TST R0,#0X20
​
MOVEQ R5,#0XFF
​
@修改当前工作模式,切换到User模式
MRS R0,CPSR
​
BIC R0,#0X1F
​
ORR R0,#0X10
​
MSR CPSR,R0

Load/Store指令

注意:LOAD/STORE架构规定,存储器之间不能直接拷贝,需通过寄存器做中转

LDR R0,[R1]     @R0 = *R1  R1里面存放的是地址,把该地址存放的内容读入到R0中
                @LDRB(BYTE)读1字节  LDRH(HALF WORD)读2字节  LDR 读4字节
                
STR R0,[R1]     @*R1 =R0 将寄存器R0中值写入存储器地址为R1的空间中

堆栈寻址LDMFD/STMFD

堆栈寻址是一种数据结构;按照先进后出的方式存储数据R13(SP)
​
寄存器指示当前栈顶位置,ARM处理器支持4中堆栈操作方式(FD,FA,ED,EA,)
​
ATPCS标准规定使用FD栈
​
LDMFD SP!,{R0-R12}@入栈,地址走向-》由高到低
STMFD SP!,{R0-R12}@出栈,地址走向-》由低到高
​
例如:
STMFD SP!,{R0-R12,LR}   将寄存器R0~R12 LR中的值存入栈中
                                @常用于中断保护现场
LDMFD SP!,{R0-R12,PC}^  将栈中值逐个弹出到寄存器R0~R12 PC中(LR恢复pc@常用于中断恢复现场,^表示会恢复SPSR到CPSR

基址变址寻址

基址变址寻址:就是将基地址寄存器的内容与指令中给出的偏移量相加,得到一个有效的操作数的地址,通常用于访问连续的地址空间
三种索引方式:
    前索引             LDR         R0,  {R1, #4}   
    自动索引            LDR         R0, {R1, #4}! R1 = R1+4
    后索引             LDR         R0,  {R1},#4

软中断指令SWI

SWI 0X02 产生软中断,软中断号为2

GNU伪指令

.text   @将定义符开始的代码编译到代码段
.data   @将定义夫开始的代码编译到数据段
.end    @文件结束
​
.global 符号  @将符号声明为全局符号;
.byte   @单字节定义  .byte   0x12,'a',23
.long/.word @定义4字节数据    .word 0x12345678
​
​
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常用ARM汇编指令 的相关文章

  • ARM 汇编 SOS 中的 64 位除法

    我正在计算 16 个 64 位数字相加的平均值 我认为我已经正确完成了所有加法 但现在我需要弄清楚如何将 64 位数字除以 16 但我被困住了 任何帮助都会非常感谢你 到目前为止 这是我的代码 tableSize EQU 16 sum EQ
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • 如何修改内核DTB文件

    Summary 我目前正在为定制板编译 Linux 内核 内核 模块和 DTB 以及一些定制驱动程序 有时 我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容 现在 我可以解决此问题的唯一方法是修改 DTS
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • ARM 汇编分支到寄存器或内存内部的地址

    我想知道在 ARM 汇编中我可以使用哪条指令分支到存储在某个内存地址中的地址或标签 例如 我们可以使用B LABEL来跳转到LABEL 但现在目的地只能在运行时知道 并且它存储在某个已知的内存位置 是否有类似 B 地址 的东西 Thanks
  • ARM Linux 如何模拟 PTE 的脏位、访问位和文件位?

    As per pgtable 2 level h https git kernel org cgit linux kernel git torvalds linux git tree arch arm include asm pgtable
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • gdb 不会从外部架构读取核心文件

    我正在尝试在 Linux 桌面上读取 ARM 核心文件 但似乎无法找出我的核心文件 有什么方法可以指示 gdb 我的核心文件是什么类型吗 file daemon daemon ELF 32 bit LSB executable ARM ve
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • 架构armv7的重复符号

    尝试在我现有的应用程序中使用 Layar SDK 时出现以下错误 我该如何解决这个问题 Ld Users pnawale Library Developer Xcode DerivedData hub afxxzaqisdfliwbzxbi
  • 如何获取结构体中任意成员的位位置

    如何获取结构体中任意成员的位位置 在示例中 gt typedef struct BitExamStruct unsigned int v1 3 unsigned int v2 4 unsigned int v3 5 unsigned int
  • 交叉编译armv5,但它创建v7二进制文件

    我设法为arm926ej s创建了一个目标文件我在 qemu 上使用 Debian Arm arm linux gnueabi gcc 4 4 static O c mcpu arm926ej s hello c o hello root
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者

随机推荐

  • java中内部类的创建四种情况,三种方式,及内部数据访问权限

    尊重原创 文章原地址 http blog csdn net chunlei zhang article details 38391847 内部类和外部类的关系 及内部静态类的数据访问权限 声明方式 第一种 在外部类内部声明使用内部类 内部类
  • CSS中的BFC定义

    知识点 BFC 描述 BFC Block Formatting Content 块级格式化上下文 BlockFormatting Contexts BFC CSS2 1规范中提出的一个概念 定义的是页面中的一块渲染区域 同一个格式化上下文内
  • Passing Data Between Two Fragments hosted by same activity

    背景 等同于前文中的利用Fragment argument 1 将date信息从CrimeFragment传送到DatePickerFragment Step1 在DatePickerFragment中添加newInstance方法 pub
  • 防火墙—IPSec VPN(NAT 穿透-单侧 NAT)

    两个防火墙之间通过 IKE 建立 IPSec VPN 隧道 NAT 穿透 单侧 NAT 组网需求 某公司总部和分部之间要通过 Internet 进行通信 为保证信息安全 计划搭建 IPSec VPN 隧道对通信的数据进行加密 1 总部和分部
  • 2019年有效的rtsp流媒体测试地址整理汇总

    2019年10月11日试了下rtsp测试地址 有效的 如下 1 rtsp wowzaec2demo streamlock net vod mp4 BigBuckBunny 115k mov 可通过VLC播放器直接打开播放 操作步骤 打开VL
  • Docker基于正在运行的容器构建镜像

    构建镜像的三种方式 基于Dockerfile 基于正在运行的容器构建 基于本地模版创建 本文主要介绍基于正在运行的容器构建镜像 以alpine 3 15 为例 在alpine中安装ffmpeg 使用docker commit 命令基于已有容
  • 如何构建LAMP平台:Apache,MySQL,PHP

    如何构建LAMP平台 Apache MySQL PHP 一 Apache网站服务 1 Apache的起源 多系统兼容 2 重要特点 3 软件版本 4 编译安装呢http服务器 二 LAMP简介与概述 1 LAMP平台概述 2 构建LAMP平
  • Windows 常用命令-开启多核处理器

    如何进入命令行窗口 方法一 Win S 打开windows搜索框 输入cmd即可 即打开命令提示符 方法二 Win R 输入 cmd 即可 文章目录 常用命令 查看Windows电脑CPU核心数 线程数 开启多核处理器多核CPU 提高资源利
  • Google Maps API开发样例一则

    虽然还有一个多月的时间才过圣诞 但我还是早早的给大家送圣诞礼物了 那么圣诞礼物到底是什么呢 就是Google Maps API开发样例一则 不过这个礼物也不算是我送给大家的 而是谷歌地图中国的开发团队送给大家的 因为我也是从他们的Googl
  • 【转载】高速电路之信号完整性设计check list

    高速PCB设计有很多比较考究的点 包括常规的设计要求 信号完整性的要求 电源完整性的要求 EMC的要求 特殊设计要求等等 本文主要是针对高速电路信号总线做了一些比较常规的要求列举了一些检查要点 其实还可以进一步的细化 比如针对1 6mm板厚
  • Springboot集成websocket实时刷新数据大屏,利用quartz做定时处理(数据可视化大屏),亲测可用

    对于实时动态的数据大屏 我们以前一般都是通过ajax定时轮询去更新数据 实现数据的实时性 这样做对服务器是不友好的 长期频繁的请求会造成服务器压力 同样会造成过多不必要的请求 浪费流量和服务器资源 WebSocket工作流程 客户端 浏览器
  • 波士顿房价预测——线性回归模型

    1 案例背景介绍 数据介绍 该数据是UCI ML房价数据集的副本 以下特征是专家得出的影响房价的结果属性 所以可以直接使用 但很多时候需要我们自己去量化特征找出需要的属性 2 处理流程 基本数据处理 数据很规整 没有需要特别处理的 我们确定
  • VPN的搭建与使用--CentOS7.9(OpenVpn环境配置)

    一 VPN概述 OpenVpn VPN是Virtual Private Network 虚拟私人网络 的缩写 它是一种通过公用网络建立安全 加密通信的技术 VPN的主要功能是创建一个虚拟的专用网络 使得用户可以在这个网络中访问外部网络资源
  • 谁说dubbo接口只能Java调用,我用Python也能轻松稿定

    由于公司使用基于Java语言的Dubbo技术栈 而本人对Python技术栈更为熟悉 为了使不懂JAVA代码的同学也能进行Dubbo接口层的测试 总结一个通过python实现dubbo接口调用的实现方案 01 实现原理 根据Dubbo官方文档
  • AI产业链的划分,主要可分为基础层、技术层和应用层

    基础层 基础层又分为数据层和计算能力 数据层像自身能够不断产生数据的Alphago一样 他会自己不断的产生数据和进化它的模型 计算能力就像我之前提到的硬件的加速 神经网络芯片这一类的计算能力提供商 也有做像GPU云计算的开放给创业公司 技术
  • 第二章 Java入门之Java程序初体验

    第二章 Java程序初体验 2 1 Java背景介绍 2 1 1 Java名称的由来 在最初 Java语言是叫做oak 橡树 是因为刚开始公司门口有一颗橡树 所以就叫做橡树 然后发现oak已经被美国橡树公司注册了 就不能再继续使用了 所以需
  • 常用的共识机制

    1 PoW Proof of Work 工作量证明机制 基本原理 这是比特币采用的共识机制 也是最早的 理解起来 很简单 就是 按劳取酬 你付出多少劳动 工作 就会获得多少报酬 比特币等加密货币 在网络世界里 这里的劳动就是你为网络提供的计
  • 将使用idea编写的项目分享到GIT上

    1 注册账户 登录gitee 登录成功后新建一个仓库 点击创建 2 安装git Windows版 Git官网地址 https git scm com downloads下载 具体安装步骤如下 鼠标右击桌面 看到这个Git GUI Here
  • ajax 跨站返回值,跨域AJAX解决方案

    由于浏览器存在同源策略机制 同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性 同源策略的判定规则 如果两个页面拥有相同的协议 端口 和主机 那么这两个页面就属于同一个源 图示例 同源策略判定 png 特别的 由于同源策
  • 常用ARM汇编指令

    空指令 nop nop 传输指令 MOV MOV R1 3 用c表示 r1 3 MOV R1 0X17 r1 0x17 MOV R0 R1 r0 r1 MVN R0 R1 将RO取反给R1 相当于r1 r0 建议赋值时候直接给16进制方便调