arm 汇编积累

C语言函数与汇编对应关系

一、MOV 系列指令

1、指令格式

MOV{条件}{S}  目的寄存器,源操作数

2、含义解析:

(1):mov  指令传送数据

案例:

MOV   R0,R1 ; R0 = R1;

MOV  PC,R14 ;PC = R14;

MOV   R0,R1,LSL#3 ;R0=R1<<3;

(2):movs
s(s标志)功能不变,影响CPSR标志位
movs r0, #0 默认结果为零但不影响CPSR的Z位,加上s以后会影响CPSR标志位

N[31]:负的条件标记                    T[5]:决定的是用的是ARM指令集还是Thumb指令集 
Z[30]:零的条件标记                    A[6]:异常终止的频闭位
C[29]:操作进位                           I [7]:中断的频闭位
V[28]:操作溢出                           F[8]:快速中断的频闭位

                                                   E[9]: 大小端序的设置

二、LDR 与  STR  系列命令

1、LDR 命令

// 格式:LDR{条件} 目的寄存器,<存储器地址>
LDR  R0,[R1]           // 将存储器地址为R1的字数据读入寄存器R0
LDR  R0,[R1,R2]        // 将存储器地址为R1+R2的字数据读入寄存器R0
LDR  R0,[R1,#8]        // 将存储器地址为R1+8的字数据读入寄存器R0
LDR  R0,[R1,R2]!       // 将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1
LDR  R0,[R1,#8]!       // 将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1
LDR  R0,[R1],R2        // 将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1
LDR  R0,[R1,R2,LSL#2]! // 将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1
LDR  R0,[R1],R2,LSL#2  // 将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1
 

LDR  R1, =0x00000001 ; 把内容 0x00000001 写入 R1 寄存器。

LDR  R1,0x00000002  ;  把内存地址 0x00000002 里的内容转到  R1  中。

MOV 与 LDR 的区别:

mov

1.用于寄存器和寄存器之间传递数据

2.把立即数(立即数表示数值的数字,前面加#)传递给寄存器


str/ldr

可以用于寄存器与内存之间的数据交换,STR是将寄存器中的数载入内存,LDR是将内存中的数载入到寄存器,LDR可以载入立即数。
 

2、STR 命令


// 格式:STR{条件} 源寄存器,<存储器地址>
STR R0,[R1],#8  // 将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1
STR R0,[R1,#8]  // 将R0中的字数据写入以R1+8为地址的存储器中
 

三、多内存操作指令(此部分为借鉴,多谢博主)
 

指令格式 : <opcode><cond> Rn{!} {register_list}

  Rn 中保存一个 内存地址值

  {!} 表示是否更新 Rn 中的地址值

  {register_list} 寄存器列表

1. 【 stm 】 多个寄存器中的值写入内存中

mov r0, #0x40000000
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333
ldr r4, =0x44444444
stm r0!, {r1,r2,r3,r4}   @ 把 此条指令改为 stm r0,{r1,r2,r3,r4} 不会更新r0中的地址值

 对于多个寄存器的操作指令【stm】说明:

(1)加 ! 表示更新 r0 中的地址值

(2)寄存器列表中是连续的寄存器可以用 - 连接 如 {r1,  r2,  r3,  r4,  r6} 可以表示为 {r1-r4, r6}

(3)编号晓得寄存器数据,保存到低地址中

(4)编号大的寄存器数据,保存到高地址中

 2. 操作多个寄存器 读内存数据

mov r0, #0x40000000
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333
stm r0, {r1-r3}  @把寄存器 r1-r3 中的值写入 r0 指向的内存地址中ldm r0!, {r5-r7} @读出r0指向的内存地址中的放在寄存器 r5-r7 中

四、栈操作指令 【入栈: stmfd,出栈:ldmfd 】

栈的 4 种特性 Full满栈     Empty空栈      Ascend增栈     Descend降栈

组合 4 种栈:

      stmfa   fa   满   增

   stmfd   fd    满   降   ARM 汇编默认使用

   stmea  ea   空   增

   stmed  ed    空   减

  指令格式:<opcode><cond> sp!  {register_list}     : sp 堆栈指针 r14

ldr sp, =0x40000100   @初始化栈指针
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333stmfd sp!, {r1-r3}    @把数据 入栈 到sp指向的地址, 增满栈类型, sp指针跟着更新
ldmfd sp!, {r4-r6}   @出栈, 把栈内数据弹出到 r4-r6寄存器中

案例:

ldr sp, =0x40000100  @初始化栈指针mov r0, #0x12mov r1, #0x11bl add_funmov r2, #0x22mov r3, #0x33b loopadd_fun:stmfd sp!, {r0-r3, lr} @ 入栈 r0-r3 ,lr指向跳转此处的吓一跳指令,也就是跳转到 , 第5行mov r0, #0x1mov r1, #0x2add r4, r0, r1ldm sp!, {r0-r3, pc} @ 出栈,把 lr 的地址弹到 pc指针中执行loop:b loop

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

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

相关文章

Kafka SASL_SSL双重认证

文章目录 1. 背景2. 环境3. 操作步骤3.1 生成SSL证书3.2 配置zookeeper认证3.3 配置kafka安全认证3.4 使用kafka客户端进行验证3.5 使用Java端代码进行认证 1. 背景 kafka提供了多种安全认证机制&#xff0c;主要分为SASL和SSL两大类。 SASL&#xff1a; 是一种身份验证机制&…

【机器学习与自然语言处理】预训练 Pre-Training 各种经典方法的概念汇总

【NLP概念合集&#xff1a;一】预训练 Pre-Training&#xff0c;微调 Fine-Tuning 及其方法的概念区别 前言请看此正文预训练 Pre-Training无监督学习 unsupervised learning概念&#xff1a;标签PCA 主成分分析&#xff08;Principal Component Analysis&#xff09;降维算法L…

本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目

本地部署TeamCity 本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目部署环境配置 TeamCity 服务器 URLTeamCity 上 GitLab 的相关配置GitLab 链接配置SSH 配置项目构建配置创建项目配置构建步骤构建触发器结语本地部署TeamCity打包发布GitLab管理的.NET Fra…

市场复盘总结 20240205

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率低 50% 最常用…

Leetcode刷题笔记题解(C++):257. 二叉树的所有路径

思路&#xff1a;深度优先搜索 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right…

[软件工具]文档页数统计工具软件pdf统计页数word统计页数ppt统计页数图文打印店快速报价工具

文档页数统计工具软件——打印方面好帮手 在信息化时代&#xff0c;文档已成为我们工作、学习、生活中不可或缺的一部分。无论是学术论文、商业报告&#xff0c;还是个人日记&#xff0c;都需要我们对其进行有效的管理。而在这个过程中&#xff0c;文档页数统计工具软件就显得…

掌握CSS网格函数fit-content()的妙用

CSS网格布局是一种强大的布局系统&#xff0c;它提供了灵活的网格化设计能力。其中&#xff0c;fit-content()函数是一项重要的功能&#xff0c;它可以帮助我们在网格容器中自动调整网格项的尺寸。本文将详细讲解fit-content()函数的使用方法及其常见应用场景&#xff0c;助你掌…

ETL是什么,有哪些ETL工具?就业前景如何?

ETL是什么 ETL&#xff08;Extract-Transform-Load&#xff09;&#xff0c;用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目标端的过程。ETL一词较常用在数据仓库&#xff0c;但其对象并不限于数据仓库。它可以自动化数据处理过程&#xff0c;减少…

2023_中国零售业人工智能行业应用 发展图谱

01 零售人工智能行业应用发展背景 02 零售人工智能行业应用发展图谱及行业应用案例 案例&#xff1a;京东云、蓝色光标、京东言犀智能服务、腾讯企点、 案例&#xff1a;淘天集团、极睿科技、百度电商数字人直播 案例&#xff1a;中国联通、云拿科技AI智能商店&#xff1b; 0…

【flutter】报错 cmdline-tools component is missing

在flutterSDK目录下&#xff0c;双击flutter_console.bat&#xff0c;调出命令行。 输入flutter doctor&#xff0c;如果第三个诊断为[x]&#xff0c;报cmdline-tools component is missing错&#xff08;我这已经修改好了&#xff0c;所以是勾了&#xff09;&#xff0c;那就可…

HTTP和HTTPS区别!

http 是我们几乎天天都要打交道的东西&#xff0c;相关知识点有点多&#xff0c;所以也有不少面试必问的点&#xff0c;这里做了一些整理&#xff0c;帮且大家树立完整的 http 知识体系&#xff0c;对面试官说 so easy HTTP 的特点和缺点 特点&#xff1a;无连接、无状态、灵…

运行vue3项目出现的问题

Mac 系统运行 vue 启动项目时报错: Permission denied 的解决方式 控制台运行 chmod 777 node_modules/.bin/vue-cli-service 如果 npm run dev 还报这个错 控制台运行 node node_modules/esbuild/install.js

day44_jdbc

今日内容 0 复习昨日 1 讲作业 2 数据库连接池(druid) 3 反射 4 改造DBUtil 5 完成CRUD练习 0 复习昨日 1 sql注入 2 预处理语句 3 事务操作 4 DBUtil 1 作业【重要】 利用ORM完成,以下的几个方法非常重要,将来写项目就是这些操作 写项目步骤 搭建环境 创建项目导入依赖工具类数…

Oracle笔记-为表空间新增磁盘(ORA-01691)

如下报错&#xff1a; 原因是Oracle表空间满了&#xff0c;最好是新增一个存储盘。 #查XXX命名空间目前占用了多大的空间 select FILE_NAME,BYTES/1024/1024 from dba_data_files where tablespace_name XXXX #这里的FILE_NAME能查到DBF的存储位置#将对应的datafile设置为30g…

ffmpeg命令生成器

FFmpeg 快速入门&#xff1a;命令行详解、工具、教程、电子书 – 码中人的博客FFmpeg 是一个强大的命令行工具&#xff0c;可以用来处理音频、视频、字幕等多媒体文件。本文介绍了 FFmpeg 的基本用法、一些常用的命令行参数&#xff0c;以及常用的可视化工具。https://blog.mzh…

Golang与Erlang有什么差异

Golang和Erlang是两种备受关注的编程语言&#xff0c;它们各自具有独特的特点和优势。下面我将简单的探讨一下Golang和Erlang之间的差异&#xff0c;并且分析它们在并发模型、运行环境、函数式编程和领域特性等多个方面的不同之处。 并发模型 Golang使用goroutines和channels…

Java设计模式大全:23种常见的设计模式详解(二)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

计算机是如何工作的

计算机工作 计算机发展史CPU基本工作流程编程语言程序&#xff08;Program&#xff09;编程语言的发展 操作系统进程/任务进程控制块CPU分配&#xff08;进程调度&#xff09;内存分配&#xff08;内存管理&#xff09;进程间通信 计算机发展史 四个发展阶段&#xff1a; 第一…

python创建udf函数步骤

一、目标 实现一个函数&#xff0c;传入两个datetime类型的参数&#xff0c;返回double类型的工作日天数 二、思路 如何计算差值&#xff1f; 如果开始时间和结束时间在同一天&#xff1a;实现同 datediff(end, start, ‘ss’) / 86400.0 如果开始时间和结束时间在不同天&am…

3. ⼤语⾔模型深度学习背景知识

1. LLM⼤语⾔模型⼀般训练过程 #mermaid-svg-8kci1fjEPiVolPue {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8kci1fjEPiVolPue .error-icon{fill:#552222;}#mermaid-svg-8kci1fjEPiVolPue .error-text{fill:#5522…