基于ARM深入分析C程序

0 基于韦东山b站视频教程

视频链接:

C语言的本质(基于ARM深入分析C程序)_哔哩哔哩_bilibili

【直播公开课】韦东山老师嵌入式C语言加强,全天8小时直播,吐血整理可以分集观看!_哔哩哔哩_bilibili

1 ARM通用寄存器及其用途

  • R0-R12:这些是通用寄存器,用于存储临时数据和执行算术逻辑操作。在函数调用时,R0-R3通常用作参数寄存器,而R4-R12用于局部变量和临时存储。

  • R13/SP:栈指针寄存器(Stack Pointer Register),用于指向当前栈顶的地址。栈是用于存储程序执行过程中的临时数据,如函数参数、局部变量和返回地址。

  • R14/LR:链接寄存器(Link Register),用于存储子程序调用后的返回地址。当一个函数被调用时,处理器可以将下一条指令的地址存入LR,以便在函数执行完毕后返回到调用点。

  • R15/PC:程序计数器(Program Counter),指向下一条将要执行的指令的地址。PC寄存器是控制流管理的关键部分,决定了程序的执行顺序。

2 ARM基础汇编指令

2.1 数据传输指令

MOV:将一个立即数或寄存器的值复制到另一个寄存器。

MOV R1, #10  ; 将立即数10赋值到寄存器R1
MOV R2, R1   ; 将寄存器R1的值复制到寄存器R2

LDR:从内存中加载数据到寄存器。

LDR R1, [R2]  ; 将寄存器R2指向的内存地址中的值加载到寄存器R1
LDR R0, [R1, #4]     ; 将R1寄存器值加上4作为地址,从内存中读取一个字(32位)到R0寄存器

STR:将寄存器中的数据存储到内存中。

STR R1, [R2]  ; 将寄存器R1的值存储到寄存器R2指向的内存地址
STR R2, [R3, #8]     ; 将R2寄存器的值写入到R3寄存器值加8所指向的内存地址

2.2 算术指令

ADD:将两个寄存器或一个寄存器和一个立即数的值相加,结果存储在目标寄存器中。

ADD R3, R1, R2  ; 将寄存器R1和R2的值相加,结果存储在寄存器R3
ADD R7, R8, #100     ; R7 <- R8 + 100

SUB:从第一个寄存器中减去第二个寄存器的值。

SUB R3, R1, R2  ; 将寄存器R1的值减去R2,结果存储在寄存器R3

MUL:两个寄存器值相乘。

MUL R3, R1, R2  ; 将寄存器R1和R2的值相乘,结果存储在寄存器R3

DIV:第一个寄存器除以第二个寄存器的值。

MOV R4, #2
MOV R5, #4
SDIV R6, R4, R5  ; 将寄存器R4的值除以R5,结果存储在寄存器R6

2.3 逻辑指令

AND:对两个寄存器进行按位与操作。

AND R3, R1, R2  ; 将寄存器R1和R2的值进行按位与操作,结果存储在寄存器R3

ORR:对两个寄存器进行按位或操作。

ORR R3, R1, R2  ; 将寄存器R1和R2的值进行按位或操作,结果存储在寄存器R3

EOR:对两个寄存器进行按位异或操作。

EOR R3, R1, R2  ; 将寄存器R1和R2的值进行按位异或操作,结果存储在寄存器R3

BIC:清除寄存器中指定的位。

BIC R3, R1, #0xFF  ; 清除寄存器R1的最低8位,结果存储在寄存器R3

2.4 数据移位指令

LSL (Logical Shift Left): 将一个寄存器中的值逻辑左移指定位数。

1LSL R0, R1, #3      ; R0 <- R1 << 3

LSR (Logical Shift Right): 将一个寄存器中的值逻辑右移指定位数。

1LSR R2, R3, #2      ; R2 <- R3 >> 2

2.5 比较和跳转指令

CMP:比较两个寄存器的值,并设置条件码。

CMP R1, R2  ; 比较寄存器R1和R2的值

B(或BL):无条件跳转到指定的地址(BL还会将返回地址保存在链接寄存器中)。

B Label  ; 无条件跳转到Label标签处
B 0x12345678     ; 无条件跳转到绝对地址0x12345678
BL subroutine     ; 调用子程序subroutine,返回地址保存在LR

BEQBNEBGTBLT等:根据条件码的值跳转到指定的地址。

BEQ Next  ; 如果相等,跳转到Next标签处
BNE Next  ; 如果不相等,跳转到Next标签处CMP R0, R1        ; 比较R0和R1,更新条件标志
BGT label         ; 如果R0 > R1,则跳转到label

2.6 其他常用指令

NOP: 执行空操作,常用于占位、填充指令流水线或调试。

NOP                ; 执行一个空指令周期

PUSH/POP: 在栈上压入/弹出多个寄存器的值。

PUSH {R1, R2, R3}  ; 将R1、R2、R3的值依次压入栈
POP {R4, R5, R6}   ; 将栈顶的值依次弹出到R4、R5、R6

3 局部变量的分配与初始化

4 全局变量、静态变量初始化

5 栈和堆

6 函数

7 指针

8 结构体

9 联合体

10 位域

11 头文件

12 链表

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

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

相关文章

日本Mitutoyo三丰仪器维修QM-Data200数据处理器QMData100 光学测量仪深圳捷达工控维修

QM-DATA200 和视觉单元 扩展 2D 光学测量仪器的功能 为测量提供强大的支持 在当今工业世界的不断进步中&#xff0c;光学器件的重要性 随着加工技术的发展&#xff0c;允许非接触式测量工件尺寸的测量机正在不断增加。 同时&#xff0c;由于车间需要更多的合理化和更少的人力&…

《HCIP-openEuler实验指导手册》1.6 Apache静态资源配置(目录访问)

知识点 常用用途&#xff1a; 软件仓库镜像及提供下载服务&#xff1a; 配置步骤 删除网站主目录中的文件&#xff08;本实验机目录为/home/source ip为192.168.12.137 端口为81&#xff09; cd /home/source rm -rf *在主目录中新建6个文件夹如下图 mkdir test{1..6}新建…

Midjourney之绘画背景的选择

hello 小伙伴们&#xff0c;我是你们的老朋友——树下&#xff0c;今天分享Midjourney提示词中绘画背景的选择&#xff0c;话不多说&#xff0c;直接开始~ 对于背景的选择&#xff0c;Midjourney中主要体现在年代和所处的环境对绘画产生不同的影响 科技的发展&#xff0c;我们…

搭建和配置Stable Diffusion环境,超详细的本地部署教程

跃然纸上的创意、瞬息万变的想象&#xff0c;Stable Diffusion以AI的力量赋予您无限创作可能。在这篇详尽的本地部署教程中&#xff0c;我们将携手走进Stable Diffusion的世界&#xff0c;从零开始&#xff0c;一步步搭建和配置这个强大的深度学习环境。无论您是热衷于探索AI艺…

每日OJ题_DFS爆搜深搜回溯剪枝②_力扣526. 优美的排列

目录 力扣526. 优美的排列 解析代码 力扣526. 优美的排列 526. 优美的排列 难度 中等 假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm&#xff08;下标从 1 开始&#xff09;&#xff0c;只要满足下述条件 之一 &#xff0c;该数组就是一个 优美的排列 &#…

个人如何首次申请专利(详细教程)

环境&#xff1a; win10 专业版 问题描述&#xff1a; 自然人如何首次申请专利&#xff08;详细教程&#xff09; 解决方案&#xff1a; 先提前在国家知识产权局检索查询一下&#xff0c;有没和你要申请专利相关的已经公布的专利&#xff0c;有的话就申请成功机会就比较小 …

安卓手机APP开发_媒体开发部分__保持设备处于唤醒状态

安卓手机APP开发_媒体开发部分__保持设备处于唤醒状态 目录 概述 使用唤醒锁的用法 保持屏幕在亮着 电视的环境模式 保持CPU处于运行状态 概述 为了避免多消耗电池电量,安卓设备会很快进入休眠状态.然而,也是需要保持它一直 处于唤醒的状态,来完成某些工作. 你使用的方…

Agent AI智能体的未来杂谈

Agent AI智能体的未来杂谈 随着AI智能体&#xff0c;特别是Agent AI技术的飞速发展和智能化程度不断提升&#xff0c;其在未来社会中的地位和作用愈发凸显&#xff0c;并将在多个维度深刻影响我们的生活和工作。 首先&#xff0c;在角色定位方面&#xff0c;AI智能体将从单一…

电脑使用笔记

1.电脑亮度调节 亮度&#xff1a;50 对比度&#xff1a;45 暗部平衡&#xff1a;40

mysql分组排序

具体需求为&#xff1a;mysql有一个表model_cluster_info, 字段包括id, city_code, household等&#xff0c;现要求按city_code分组并排序&#xff0c;返回在相同city_code下households特定排名的记录&#xff08;如60%&#xff09; mysql5.7&#xff0c;我用用户自定义变量实…

tomcat部署

1.客户端和服务器端的交互过程 客户端发送请求给服务器 由服务器中的服务器软件拦截请求 根据请求调动相应的Java业务逻辑执行相关的处理 我们前面知道Java代码的运行势必提前将其装载在JVM上 而服务器软件一般都是由Java代码编写 所以两者都要装载在JVM上 而Java业务逻辑装载…

OpenVoice——强大的语音克隆与生成技术

OpenVoice 是一款由 MyShell TTS 开发的令人惊叹的技术。它只需一小段参考发言者的音频片段&#xff0c;就能精确复制其声音&#xff0c;并能够生成多种语言的语音。 其主要功能包括准确的音色克隆&#xff0c;能够精确地克隆参考音色&#xff0c;并在多种语言和口音中生成语音…

OMG 一个方法的调用改动居然优化了一倍性能!!! ConcurrentHashMap.computeIfAbsent 学习

背景 前提&#xff1a;抖音小程序有qps的监控&#xff0c;如果说qps过低就会导致小程序被下架掉。 业务代码非常的简单 一个easy的查询 但是当并非达到 20就 会发现qps降低了10倍 业务需求实现大概这么一个链路 ok 那么此前我们在认识一下 computeIfAbsent 方法&#xff08;大…

38 线程互斥

目录 1.问题 2.互斥相关概念 3.互斥量 4.互斥量接口 5.修改买票代码 6.互斥量原理 7.锁的封装 8.可重入和线程安全 1. 问题 用一个模拟抢票过程的程序引出本节话题&#xff0c;如果有1000张票&#xff0c;设为全局变量&#xff0c;生成3个线程每隔一秒抢一张票&#xff0c;如…

快速搭建 Web自动化测试框架

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测…

美国站群服务器常见的操作系统选项

美国站群服务器常见的操作系统选项 美国站群服务器是一种灵活且可扩展的服务器解决方案&#xff0c;可以用于托管和管理多个网站和应用程序。在选择合适的美国站群服务器时&#xff0c;一个重要的考虑因素是其支持的操作系统。本文将介绍美国站群服务器常见的操作系统选项&…

第十五届蓝桥杯省赛第二场C/C++B组H题【质数变革】题解

解题思路 首先&#xff0c;我们考虑一下整个数组都是由质数构成的情况。 当我们要将质数 x x x 向后移 k k k 个时&#xff0c;如果我们可以知道质数 x x x 在质数数组的下标 j j j&#xff0c;那么就可以通过 p r i m e s [ j k ] primes[j k] primes[jk] 来获取向后…

C语言实验-函数与模块化程序设计

一&#xff1a; 编写函数fun&#xff0c;其功能是&#xff1a;输入一个正整数&#xff0c;将其每一位上为偶数的数取出重新构成一个新数并输出。主函数负责输入输出&#xff0c;如输入87653142&#xff0c;则输出8642。&#xff08;main函数->fun函数&#xff09; #define _…

前端科举八股文-HTML篇

前端面试-HTML篇 什么是http?http和https有什么区别https的加密过程?http2.0有什么改进?src和href的区别对html语义化标签的理解?script标签中defer和asyc的区别?举出几个常见的行内、块级元素什么是webworker&#xff1f;iframe的优缺点&#xff1f;介绍一下tcp三次握手f…

python中的进程间通信

进程间数据是否共享 在Python中&#xff0c;进程之间默认是不共享内存的。每个进程都有自己独立的内存空间&#xff0c;这意味着在一个进程中对数据的修改不会影响到另一个进程中的同名数据。然而&#xff0c;Python提供了几种方式来实现进程间的数据共享&#xff1a; 使用 mu…