【基于ARM深入分析C程序】1--ARM架构与汇编、分析C语句`a++`的执行过程

news2024/11/24 8:35:10

【基于ARM深入分析C程序】1–ARM架构与汇编、分析C语句a++的执行过程

文章目录

  • 【基于ARM深入分析C程序】1--ARM架构与汇编、分析C语句`a++`的执行过程
    • 一、3个操作指令
    • 二、CPU是怎么知道执行这三条操作指令的?
      • 2.1 CPU的架构
    • 2.2 寄存器

本文作为学习笔记,围绕的一条C语句进行讲解

参考:https://www.100ask.net/

int a = 1;
a++; //a = a + 1

一、3个操作指令

  • a++ ==> a = a + 1这条非常简单的指令,会涉及到3个操作

    • 1、读取a
    • 2、累加操作
    • 3、写操作
  • 提出问题:读什么?写什么?变量a是什么东西?,存放在哪里?

  • 在这里插入图片描述

    • 变量a,保存在内存里面,内存是一种设备,我们可以写数据进去,读数据出来。
    • 读取:cpu读地址addr A,将地址对应的data保存到cpu的寄存器中,
    • 累加:使得寄存器执行累加操作
    • 写:写地址,把寄存器数据写到 内存中的addr A里面

在CPU内部,有R0~R15这些寄存器,这些寄存器用来暂存数据



二、CPU是怎么知道执行这三条操作指令的?

2.1 CPU的架构

在这里插入图片描述

  • Keil 通常被用作一个工具链,用于将高级语言(如 C 或 C++)编写的程序转换成微控制器(MCU)可以执行的二进制文件。这个过程主要包括以下几个步骤:
    • 1、编译、使用 Keil 提供的 ARM Compiler,将源代码转换成 ==>汇编语言(.asm),然后进一步转换成机器码,
    • 2、链接:链接器(Linker)将所有的机器码片段(包括不同源文件编译产生的代码)以及库函数链接成一个单一的二进制文件
    • 3、生成二进制文件:链接后的输出是一个完整的二进制文件,( AXF(ARM eXtended Format)、HEXBIN 格式)。AXF 文件包含了程序的调试信息和符号信息,而 HEX 和 BIN 文件通常用于烧录。
    • 4、烧录:使用 Keil 或其他专用的烧录工具,将生成的二进制文件烧录到微控制器的 Flash 闪存中。
    • 5、执行:当微控制器上电或复位后,其内置的引导加载程序 (Bootloader) 会从 Flash 闪存中读取这些二进制指令,并开始执行

在这里插入图片描述

Flash:断电后还可以保存数据

  • 烧录后,板子可以离开PC、编译器运行,与PC机和编译器没有任何关系。CPU做的任何事情,都是我们的程序告诉CPU去做的,比如:分配内存,分配堆、分配栈。没有什么第三方,没有什么系统、什么编译器、不涉及其他任何东西

2.2 寄存器

寄存器别名功能
R0通用寄存器通常用于存储临时数据、函数参数和局部变量等。
R12也是一个通用寄存器,但在一些指令中它有特殊用途,比如在乘法和分支指令中。
R13SP寄存器栈寄存器;指向当前的栈顶位置。在函数调用和中断处理中,寄存器的值常常被推入(push)到堆栈中,或者从堆栈中弹出(pop)
R14LR寄存器返回地址;通常用于存储函数调用后的返回地址。以便返回到正确的位置上,继续执行。
R15PC寄存器**程序计数器;**它存储着下一条要执行的指令的地址。当CPU执行一条指令时,PC寄存器会自动更新为下一条指令的地址。

R15 ==> PC寄存器:你想去执行某个函数的时候,可以把那个函数的地址扔给PC寄存器,CPU就会跳过去执行



欢迎大家一起交流讨论。

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

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

相关文章

【ARM】v8架构programmer guide(6)_MMU内存管理模块

快进到内存管理模块吧,其他的后面再补充~ 目录 1.1 TLB (Translation Lookaside Buffer) 1.2 Kernel 和 Application 虚拟地址空间 1.3 转换虚拟地址到物理地址 1.3.1 安全和非安全地址空间 1.3.2 配置和使能MMU 1.3.3 当MMU没有使能的时候 1.4 ARMv8-A的页…

6.2 遍历重定位表

本节我们将编写一个遍历重定位表的示例程序,打印重定位表。 本节必须掌握的知识点: 遍历重定位表 6.2.1 遍历重定位表 实验四十三:遍历重定位表 以下代码实现打印"c:\\notepad64.exe"进程重定位表的所有信息。 /*--------------…

衡石分析平台系统-分析人员手册

应用创建​ 用户可以通过多种方式创建应用,不同场景下应用创建方法不同。 新建空白应用​ 新建空白应用是新建一个空的应用,应用中没有数据集和仪表盘。 点击应用创作页面右上方的新建应用,新建空白的分析应用和查询应用。 新建的空白应用…

记录一下,android studio 登录不上github的问题

android studio 2023.3.1.18 版本的编译器,出现问题,之前连接过的项目可以正常提交和拉取到github。 但是新建立的项目无法上传到github,提示错误cannot load information for github.com/:request response;access to this site,…

log4j2实际项目中使用

一 添加依赖 <!--移除spring-boot中默认的logback日志组件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.spring…

实验9 结构体

1、商品信息处理 【问题描述】 设计结构体&#xff0c;用于存储商品的信息&#xff0c;包含商品编号、商品名称、商品价格以及商品折扣信息。 设计函数input&#xff0c;实现商品数据的输入。 设计函数display&#xff0c;实现商品信息的输出。 在主函数main中定义keyboar…

国外解压视频素材哪里找?五个海外解压视频素材网站推荐

国外解压视频素材哪里找&#xff1f;五个海外解压视频素材网站推荐 如果你正在寻找国外的解压视频素材&#xff0c;那么今天这篇文章一定能帮助你。无论是修牛蹄、洗地毯&#xff0c;还是切肥皂、玩解压游戏等&#xff0c;下面分享的几个网站都是你找到高质量海外解压视频素材…

信息抽取数据集处理——RAMS

引言 RAMS数据集&#xff08;RAMS&#xff1a;Richly Annotated Multilingual Schema-guided Event Structure&#xff09;由约翰斯霍普金斯大学于2020年发布&#xff0c;是一个以新闻为基础的事件抽取数据集。它标注了9,124个事件&#xff0c;涵盖了139种不同的事件类型和65种…

celery 项目中mysql 数据库连接数耗尽事故记录

python 项目中使用 celery 中导致mysql数据库连接耗尽记录【mysql数据库连接池使用错误】 结论&#xff1a;由于使用 celery 进行项目的多任务管理&#xff0c;在worker任务定义的过程中&#xff0c;使用了 dbutils 中的 PooledDB 连接池进行 mysql数据库连接&#xff0c; 因此…

IO密集型任务及Vertx框架入门

注意&#xff1a; 本文内容于 2024-10-02 02:25:47 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;IO密集型任务及Vertx框架入门。感谢您的关注与支持&#xff01; 一、背景 1.1 铺垫知识 涉及到…

C++入门基础知识112—【关于C++嵌套 switch 语句】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C嵌套 switch 语句的相关内容&#xff…

C++20中头文件numbers的使用

<numbers>是C20中新增加的头文件&#xff0c;提供一组常量用于表示数学中的某些特殊值&#xff0c;此头文件是numeric库的一部分。包括&#xff1a; 1. 圆周率π:std::numbers::pi、std::numbers::pi_v<T> 2. 圆周率π的倒数&#xff1a;numbers::inv_pi、std::num…

灵当CRM data/pdf.php 任意文件读取漏洞复现

0x01 产品简介 灵当CRM是一款专为中小企业打造的智能客户关系管理工具,由上海灵当信息科技有限公司开发并运营。广泛应用于金融、教育、医疗、IT服务、房地产等多个行业领域,帮助企业实现客户个性化管理需求,提升企业竞争力。无论是新客户开拓、老客户维护,还是销售过程管…

软件开发----SQL基础每日刷题(转载于牛客)

1. 查询语句select stuff(lo ina,3, 1, ve ch)结果为&#xff1f; A love B love china C china love D china 正确答案&#xff1a;B 解析&#xff1a; STUFF(原字符, 开始位置, 删除长度, 插入字符) 从指定的起点处开始删除指定长…

六tomcat

​​​​​​ Java Web环境搭建 1. 初识Tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。Tomcat 是 Apache 服务器…

redis集成到spring boot中使用

&#xff08;一&#xff09;添加依赖 redis服务器在官网中公开了自己使用的协议--RESP&#xff0c;所以我们可以使用这个协议来访问redis服务器&#xff0c;但是如果我们要自己实现库&#xff0c;那肯定是非常麻烦的&#xff0c;所以我们可以使用网上的库&#xff0c;我们直接调…

读数据工程之道:设计和构建健壮的数据系统08主要架构概念

1. 域和服务 1.1. 域是你正在为其构建的现实世界主题区域 1.2. 服务是一组功能&#xff0c;其目标是完成一项任务 1.3. 一个域可以包含多个服务 1.4. 确定领域中应包含的内容 1.4.1. 确定领域应该包含什么以及要包括哪些服务时&#xff0c;最好的建议是简单地去与用户和利益…

SQLAlchemy入门:详细介绍SQLAlchemy的安装、配置及基本使用方法

SQLAlchemy是一个流行的Python SQL工具包和对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;它为开发人员提供了一种高效、灵活的方式来与数据库进行交互。本文将详细介绍SQLAlchemy的安装、配置及基本使用方法&#xff0c;并通过代码示例和案例分析&#xff0c;帮助新…

C++ | Leetcode C++题解之第478题在圆内随机生成点

题目&#xff1a; 题解&#xff1a; class Solution { private:mt19937 gen{random_device{}()};uniform_real_distribution<double> dis;double xc, yc, r;public:Solution(double radius, double x_center, double y_center): dis(0, 1), xc(x_center), yc(y_center),…

Web前端高级工程师培训:异步处理专题

异步处理专题 课前准备 工具 编辑器 VSCode浏览器 Chorme 前置知识 ES6基础语法 课堂主题 同步及异步概念方块运动的实现promise的用法then的返还值Async 函数 和 await 课堂目标 理解并学会使用promise使用方式以及async 、await的使用 同步异步概念 js是单线程 单线程…