ARM 汇编指令集——汇编中三种符号(汇编指令、伪指令、伪操作)、汇编基本格式、数据操作指令、跳转指令、特殊功能寄存器操作指令、内存操作指令、混合编程

news2025/2/26 13:45:25

目录

一、汇编中三种符号(汇编指令、伪指令、伪操作)

二、汇编基本格式

三、数据操作指令

3.1 数据搬移指令mov/mvn

① 示例

② 立即数

3.2 移位操作指令lsl/lsr/asr/ror

示例

3.3 位运算操作指令and/orr/eor/bic

① 示例1

② 示例2

3.4 算数运算操作指令add/adc/sub/sbc/mul

① 实现两个64位数相加

② 实现两个64位数相减

③ 乘法指令

3.5 比较指令cmp

① 条件指令

② 示例

四、跳转指令

① 练习

五、特殊功能寄存器操作指令

六、内存操作指令

6.1 单寄存器操作指令

① 读写代码练习

② 特殊读写格式

③ 验证keil软件存储方式

6.2 多寄存器操作指令

① 练习

6.3 栈指针操作指令

① 满压栈、空增栈压入数据过程

② 练习代码1

③ 栈使用场合1

④ 栈使用场合2

七、混合编程

7.1 汇编调用C

汇编文件编写

C函数编写

7.2 C调用汇编

汇编启动文件编写:start.s文件

C语言main函数入口:main.c文件

汇编实现加法函数编写:add.s文件

7.3 内联汇编

八、总结


一、汇编中三种符号(汇编指令、伪指令、伪操作)

二、汇编基本格式

三、数据操作指令

3.1 数据搬移指令mov/mvn

① 示例

② 立即数

0xff000000 =====>判断的数
1111 1111 0000 0000 0000 0000 0000 0000   =====>判断的数
0000 0000 0000 0000 0000 0000 1111 1111  =====>找到0xff这个数 =====> 循环右移8位

0xf0000000 =====>判断的数
1111 0000 0000 0000 0000 0000 0000 0000   =====>判断的数
0000 0000 0000 0000 0000 0000 0000 1111  =====>找到0xf这个数 =====> 循环右移4位

0xf000000f =====>判断的数
1111 0000 0000 0000 0000 0000 0000 1111   =====>判断的数
0000 0000 0000 0000 0000 0000 1111 1111  =====>找到0xff这个数 =====> 循环右移4位

0x1FE00000=====>判断的数
0001 1111 1110 0000 0000 0000 0000 0000   =====>判断的数
0000 0000 0000 0000 0000 0000 1111 1111  =====>找到0xff这个数 =====> 循环右移11位

0x1F800000=====>判断的数
0001 1111 1000 0000 0000 0000 0000 0000   =====>判断的数
0000 0000 0000 0000 0000 0000 0111 1110  =====>找到0x7E这个数 =====> 循环右移10位

3.2 移位操作指令lsl/lsr/asr/ror

示例

    mov r0,#0xff
    
    @ 1.将r0寄存器中的值,逻辑左移4位,赋值给目标寄存器r1,值  
    lsl r1,r0,#0x4 @ r1 = r0 << 4 = 0xff0
    @ 0000 0000 0000 0000 0000 0000 1111 1111
    @ 0000 0000 0000 0000 0000 1111 1111 0000 
    
    @ 2.将r1寄存器中的值,逻辑右移4位,赋值给目标寄存器r2,值  r2 = r1 >> 4
    lsr r2,r1,#0x4  @ r2 = r1 >> 4 = 0xff
    @ 0000 0000 0000 0000 0000 1111 1111 0000 
    @ 0000 0000 0000 0000 0000 0000 1111 1111  
    
    @ 3.将r2寄存器中的值,循环右移4位,赋值给目标寄存器r3,值 
    ror r3,r2,#0x4 @ r3 = 0xf000000f
    @ 0000 0000 0000 0000 0000 0000 1111 1111 
    @ 1111 0000 0000 0000 0000 0000 0000 1111  
    
    ldr r4,=0x800000ff
    @ 4.将r4寄存器中的值,算数右移4位,赋值给目标寄存器r5,值
    asr r5,r4,#0x4  @ r5 = 0xf800000f
    @ 1000 0000 0000 0000 0000 0000 1111 1111 
    @ 1111 1000 0000 0000 0000 0000 0000 1111

3.3 位运算操作指令and/orr/eor/bic

① 示例1

② 示例2

3.4 算数运算操作指令add/adc/sub/sbc/mul

① 实现两个64位数相加

@第一个64位数:高32位用r0表示0x3   低32位用r1表示0xffffffff
@第二个64位数:高32位用r2表示0x4   低32位用r3表示0x1
@实现两个64位数相加:高32位相加r4,低32位相加r5    
    ldr r0,=0x3
    ldr r1,=0xffffffff
    ldr r2,=0x4
    ldr r3,=0x1
    adds r5,r1,r3 @ r5 = r1 + r3 = 0xffffffff + 0x1 = 0x0 ===> add 影响CPSR寄存器的C位
    adc r4,r0,r2 @ r4 = r0 + r2 = 0x3 + 0x4 + C  = 0x8 ===> adc    

② 实现两个64位数相减

    @第一个64位数:高32位用r0表示0x7   低32位用r1表示0x4
    @第二个64位数:高32位用r2表示0x4   低32位用r3表示0x5
    @实现两个64位数相减法:高32位相加r4,低32位相加r5
      
    ldr r0,=0x7
    ldr r1,=0x4
    ldr r2,=0x4
    ldr r3,=0x5
    subs r5,r1,r3 @ r5 = r1 - r3 = 0x4 - 0x5 = 0xffffffff ===> sub 影响CPSR寄存器的C位
    sbc r4,r0,r2  @ r4 = r0 - r2 = 0x7 - 0x4 - !C  = 0x2 ===> sbc 

③ 乘法指令

3.5 比较指令cmp

① 条件指令

② 示例

四、跳转指令

① 练习

五、特殊功能寄存器操作指令

六、内存操作指令

6.1 单寄存器操作指令

① 读写代码练习

② 特殊读写格式

    ldr r0,=0x40000800 @ 准备一块地址空间
    ldr r1,=0x11111111 @ r1 = 0x11111111
    ldr r2,=0x22222222 @ r1 = 0x22222222
    ldr r3,=0x33333333 @ r1 = 0x33333333
    
    @仿真时,思考1)寄存器写到哪一块地址空间中,2)观察r0寄存器中的值变化
    
    @将r1寄存器中的值,写到r0+4地址空间中,r0寄存器中的值没有发生变化
    @ [0x40000804] = 0x11111111 r0 = 0x40000800
        str r1,[r0,#4]
    
     
    @将r2寄存器中的值,写到r0地址空间中,r0寄存器中的值+4
    @ [0x40000800] = 0x22222222 r0 = 0x40000804    
        str r2,[r0],#4
    
    @将r3寄存器中的值,写到r0+4地址空间中,r0寄存器中的值+4
    @ [0x40000808] = 0x33333333 r0 = 0x40000808
        str r3,[r0,#4]!

③ 验证keil软件存储方式

6.2 多寄存器操作指令

① 练习

6.3 栈指针操作指令

① 满压栈、空增栈压入数据过程

② 练习代码1

③ 栈使用场合1

    ldr sp,=0x40000800 @ 准备一块地址空间
    mov r0,#0x1  @ r0 = 0x1
    mov r1,#0x2  @ r1 = 0x2
    bl add1_func  @ 跳转到add1_func函数
    add r0,r0,r1 @ r0 = r0 + r1 = 0x3
    b stop
    
add1_func:
    @ 压栈保存现场  r0 = 0x1 r1 = 0x2
    stmfd sp!,{r0-r1}
    mov r0,#0x3  @ r0 = 0x3
    mov r1,#0x4  @ r1 = 0x4
    add r0,r0,r1 @ r0 = r0 + r1 = 0x7
    @ 出栈保存现场  r0 = 0x1 r1 = 0x2
    ldmfd sp!,{r0-r1}
    mov pc,lr @ pc = lr

④ 栈使用场合2

_start:  @指定汇编中函数入口
    
    ldr sp,=0x40000800 @ 准备一块地址空间
    mov r0,#0x1  @ r0 = 0x1
    mov r1,#0x2  @ r1 = 0x2
    bl add1_func  @ 跳转到add1_func函数,保存函数返回地址到LR寄存器中
    add r0,r0,r1 @ r0 = r0 + r1 = 0x3
    b stop
    
add1_func:
    @ 压栈保存现场  r0 = 0x1 r1 = 0x2
    stmfd sp!,{r0-r1,lr}
    mov r0,#0x3  @ r0 = 0x3
    mov r1,#0x4  @ r1 = 0x4
    bl  add2_func @跳转到add2_func函数,保存函数返回地址到LR寄存器中
    add r0,r0,r1 @ r0 = r0 + r1 = 0x7
    @ 出栈保存现场  r0 = 0x1 r1 = 0x2
    ldmfd sp!,{r0-r1,pc}
    
add2_func:
    @ 压栈保存现场  r0 = 0x3 r1 = 0x4
    stmfd sp!,{r0-r1}
    mov r0,#0x5  @ r0 = 0x5
    mov r1,#0x6  @ r1 = 0x6
    add r0,r0,r1 @ r0 = r0 + r1 = 0xB    
    @ 出栈保存现场  r0 = 0x3 r1 = 0x4
    ldmfd sp!,{r0-r1}
    mov pc,lr

七、混合编程

7.1 汇编调用C

汇编文件编写

        ldr sp,=0x40000800 @ 初始化栈指针
        mov r0,#0x1
        mov r1,#0x2
        mov r2,#0x3
        mov r3,#0x4
        bl add_func      

C函数编写

int add_func(int a,int b,int c,int d)
{
      return (a+b+c+d);
}   

7.2 C调用汇编

汇编启动文件编写:start.s文件

        ldr sp,=0x40000800  @ 初始栈指针
        b main  @ 跳转到C函数入口

C语言main函数入口:main.c文件

int sum1 = 0;

int add1_func(int a,int b,int c,int d);

int main()
{
    sum1 = add1_func(1,2,3,4);
      while(1);
     return 0;
}

汇编实现加法函数编写:add.s文件

@ 实现r0-r3相加,并且通过r0返回
.text
.global add1_func
add1_func:
        add r0,r0,r1
        add r0,r0,r2
        add r0,r0,r3
        mov pc,lr
.end

7.3 内联汇编

八、总结

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

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

相关文章

第32节——useReducer——了解

一、概念 useReducer 是在 react V 16.8 推出的钩子函数&#xff0c;从用法层面来说是可以代替useState。众所周知&#xff0c;useState 常用在单个组件中进行状态管理&#xff0c;但是遇到状态全局管理的时候&#xff0c;useState 显然不能满足我们的需求&#xff0c;这个时候…

4G工业路由器高效数据传输助力光伏发电站管理

光伏发电站是能源产业中一种利用太阳能技术将光转化为电能的常见设施。随着物联网技术与环保能源的不断进步和应用的普及&#xff0c;光伏发电站的管理也变得更加便捷高效。 光伏发电站结合4G工业路由器实现远程监控管理&#xff0c;并用于采集发电站中的传感器数据和监控信息…

vue watch 侦听器 监视器

vue watch 侦听器 监视器 变量 变化的时候&#xff0c;自动调用处理函数 vue watch 侦听器 监视器

/node_modules/XXX/index.js:XXX XXX ??= X;SyntaxError: Unexpected token ‘??=‘

这问题 老实说有点奇葩 不影响运行 反倒运行提交了 不解决这个问题提交不了代码 这个错误是由于语法不兼容导致的。?? 是一个相对较新的 JavaScript 语法&#xff0c;也就是空值合并赋值操作符&#xff0c;它在 Node.js 版本低于 15 或者某些浏览器中不被支持。 那么 了解…

日常生活中的常用命令及操作

目录 一、Windows11 中查看网卡名称 及ip地址 二、查看硬件的详细信息 三、查看显卡声卡详细信息及厂商 四、C盘清理 第一步 输入wini 开启Windows设置主界面 第二步 存储中还有一个叫存储感知的功能 第三步 更改新内容的保存位置 第四步 怕误C盘内的东西可以 查看详细的…

【Java 基础篇】Java 线程通信详解

多线程编程在实际应用中非常常见&#xff0c;但随之而来的问题是线程之间的通信。线程通信是多线程编程中一个至关重要的概念&#xff0c;它涉及到线程之间的信息传递、同步和协作。本篇博客将详细解释Java中的线程通信&#xff0c;包括什么是线程通信、为什么需要线程通信、如…

UG\NX二次开发 求空间点坐标按照某方向移动某距离后的新坐标

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: 群友问“ufun中空间点的坐标(x,y,z),沿着空间任意工作坐标系z轴移动10mm后的新坐标如何计算?” 这个是有多种方法的,比如数学计算比如ufun的仿射变换…

css,环形

思路&#xff1a; 1.先利用conic-gradient属性画一个圆&#xff0c;然后再叠加 效果图 <template><div class"ring"><div class"content"><slot></slot></div></div> </template> <script> import …

JavaScript系列从入门到精通系列第三篇:JavaScript基本语法(一)

文章目录 一&#xff1a;JavaScript基本语法 1&#xff1a;JS注释 (一)&#xff1a;JS多行注释 (二)&#xff1a;JS单行注释 (三)&#xff1a;JS中大小写 (四)&#xff1a;分号问题 (五)&#xff1a;空格和换行 2&#xff1a;字面量和变量 (一)&#xff1a;字面量 (二…

demo1-csa(从初阶到大牛)

1.1文件管理命令练习 (1) 在/opt目录下创建一个临时目录tmp; # 创建临时目录tmp sudo mkdir /opt/tmp (2) 在临时目录下创建一个文件&#xff0c;文件名为a.txt; # 在临时目录下创建文件a.txt&#xff08;可以使用touch命令创建空文件&#xff09; sudo touch /opt/tmp/a.t…

MQ - 11 Kafka的架构设计与实现

文章目录 导图概述Kafka 系统架构协议和网络模块数据存储元数据存储消息数据生产者和消费者生产者消费者HTTP 协议支持和管控操作Kafka 从生产到消费的全过程总结导图 概述 在学习的过程中,我们会发现 Kafka 和 RocketMQ 的架构是非常像的,那为什么还要单独来分析 Kafka 呢?…

脑电相关临床试验及数据分析

临床试验设计 作为一个医疗器械公司的开发–>算法–>项目–>产品&#xff0c;还是想在这里记录一下工作。 直接开始吧 临床试验的设计&#xff0c;主要分为20个部分&#xff0c;分别是 封面 一、申办者信息 二、所有临床试验机构和研究者列表 三、临床试验的目的和…

计算机视觉与深度学习-全连接神经网络-详解梯度下降从BGD到ADAM - [北邮鲁鹏]

文章目录 参考文章及视频导言梯度下降的原理、过程一、什么是梯度下降&#xff1f;二、梯度下降的运行过程 批量梯度下降法(BGD)随机梯度下降法(SGD)小批量梯度下降法(MBGD)梯度算法的改进梯度下降算法存在的问题动量法(Momentum)目标改进思想为什么有效动量法还有什么效果&…

硬件学习 PAD9.5 day02 原理图绘制中的操作,PCB 封装的制作

1. 原理图中的连线操作 1.1 点击连线按钮 1.2 点击需要连线的地方连接即可 1.3 双击即可停止连线 2. 原理图的总线绘制 2.1 按下总线绘制按钮 2.2 画一条总线 总线名称 总线名字 [ 起始数字 &#xff1a; 结束数字 ] 2.3 分线连接总线 注意&#xff1a;原理图的连线…

【Java 基础篇】Java 多线程详解

多线程是 Java 编程中的一个重要概念&#xff0c;它允许程序同时执行多个任务&#xff0c;提高了程序的性能和响应能力。本篇博客将深入探讨 Java 多线程&#xff0c;从基础概念到实际应用&#xff0c;适用于 Java 初学者和希望深入了解多线程的开发人员。 什么是多线程&#…

【JS】—垃圾回收机制

一、指令材料 1.定义 JavaScript&#xff08;JS&#xff09;的垃圾回收机制是一种自动管理内存的过程&#xff0c;它有助于释放不再使用的内存&#xff0c;以避免内存泄漏和提高程序的性能。 JavaScript的垃圾回收机制是一种自动管理内存的方式&#xff0c;以确保不再被引用的…

【RocketMQ】路由中心NameServer

【RocketMQ】路由中心NameServer 参考资料&#xff1a; RocketMQ Nameserver 背后的设计理念 RocketMQ之NameServer详解 深入剖析RocketMQ源码-NameServer —— vivo互联网技术 《RocketMQ技术内幕》 文章目录 【RocketMQ】路由中心NameServerNameServer架构设计NameServer工作…

上海亚商投顾:沪指震荡调整 两市成交金额跌破6000亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日集体调整&#xff0c;创业板指续创3年多以来新低。ST板块继续走强&#xff0c;*ST柏龙、ST恒久等…

笔记2.2:网络应用基本原理

一. 网络应用的体系结构 &#xff08;1&#xff09;客户机/服务器结构&#xff08;Client-Server, C/S&#xff09; &#xff08;2&#xff09;点对点结构&#xff08;Peer-to-Peer&#xff0c;P2P&#xff09; &#xff08;3&#xff09;混合结构&#xff08;Hybrid&#x…

leetcode646. 最长数对链(java)

最长数对链 题目描述贪心解法二 动态规划 dp 题目描述 难度 - 中等 leetcode646. 最长数对链(java) 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅…