ARM嵌入式学习--第四天

汇编与C混合编程

-汇编指令中调用C语言

.global _start
_start:
    mov r0,#5
    mov r1,#3
    bl add
stop:
    b stop
int add(int a,int b)
{
    int c = a + b;
    return c;
}

无优化情况:(反汇编之后,发现多了很多很多指令,运行之后结果是错误的

 无优化的情况下,在汇编中调用C语言代码,需要指定SP寄存器的值

.global _start
_start:
    mov r0,#5
    mov r1,#3
    ldr sp,=0x2000fff0
    bl add
stop:
    b stop

-C语言内嵌汇编指令

    在C语言中是无法操作寄存器,如果想操作寄存器,就可以在C语言中嵌套汇编指令

 格式:

        asm(

        "指令1\n"

        "指令2\n"

        ......

        :输出列表

        :输入列表

        :修改列表(通用的寄存器)

        );

指令:ARM汇编指令

输出列表:将内嵌汇编中的寄存器值输出到C变量

输入列表:将C变量输入到内嵌汇编中使用的寄存器

修改列表:内嵌汇编中修改的寄存器

实例:

int operate(int num1,int num2)
{
    int result = 0;//result = num1*num2;
    asm(
    "mul r0,%1,%2\n"
    "mov %0,r0"
    :"=r"(result)
    :"r"(num1),"r"(num2)
    :"r0"
    );
    return result;
}

注意:

    C语言的引用,从输出列表到输入列表开始编号;第一个C变量%0,第二个C变量%1...

 gcc优化与volatile关键字

-gcc优化

    gcc编译器常用的优化级别有三个:

        1.O1(一级优化)

        2.O2(speed)/Os(size)(二级优化)

        3.O3(三级优化)

优化的思想:

    如果我们在前面已经将这个变量所对应的内存数据读到寄存器中,而当我们再次需要读这个变量所对应内存的数据的时候,编译器认为前面我们已经在寄存器中,存放过值了,为了提高效率,它直接会使用上一次寄存器中的值,而不重新从内存中读值

优化的问题:

    如果内存中的值已经被其他执行单元(中断处理函数或其他线程)做了更改,而优化后的代码每次存寄存器读值,就会带来寄存器中的值和内存中的值不一致的问题

-volatile关键字

    volatile(译:易改变的)修饰一个变量,防止编译器优化(本质),告诉编译器每次在使用这个变量的时候,必须从变量所在的内存中重新读值

变量涉及被多个执行单元修改,则应该使用volatile修饰

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌握关键:全面数据分析键盘市场

键盘数据分析 一、市场分析 大盘销售额,销量: 共获取100个品牌每个品牌至多100页的数据,共计3***9个商品及其销量,销售额。 大盘数据 9月份键盘销售额:9***124.58元, 9月份键盘销量:1***0…

遇到“mfc100u.dll丢失”的系统错误要怎么处理?科学修复mfc100u.dll

遇到“mfc100u.dll丢失”的系统错误会非常麻烦,因为mfc100u.dll是Microsoft Visual C 2010 Redistributable Package的重要部分,许多应用程序和游戏在运行时都需要调用这个文件。如果这个文件缺失,可能会导致相关软件或游戏启动失败。面对这种…

操作系统实验三:基于BPF机制的系统跟踪与探测

实验内容 学习BPF机制,了解BCC(BPF Compiler Collection)和bpftarce的实现原理,利用BPF工具实现对系统的跟踪和探测,如跟踪新创建的进程,统计线程占用CPU的时间,统计某内核函数的调用次数&…

98. UE5 GAS RPG 实现技能眩晕效果

我们在技能伤害基类上面设置了对应的负面效果应用的配置项,用来实现技能的负面效果应用。 在之前实现火球术的负面效果时,我们我们在创建火球时,通过伤害基类上的创建技能配置用于后续应用。 在火球攻击到敌人时,通过函数库书写…

电脑技巧:优化Edge浏览器占用C盘空间的解决方案

大家在日常使用电脑的使用,Edge浏览器作为Windows电脑自带的浏览器,使用体验还是非常不错的。对于电脑新手来说直接使用微软自带的Edge浏览器也可以满足使用需求。但是随着电脑使用的越久,整体Edge浏览器也会占用几个G甚至更多的磁盘空间,并且还是C盘。 今天给大家分享如何…

使用Three.js和Force-Directed Graph实现3D知识图谱可视化

先看样式: 在当今信息爆炸的时代,如何有效地组织和展示复杂的知识结构成为一个重要的挑战。3D知识图谱可视化是一种直观、交互性强的方式来呈现知识之间的关系。本文将详细介绍如何使用HTML、JavaScript、Three.js和Force-Directed Graph库来实现一个交互…

【电商购物管理系统】Python+Django网页界面平台+商品管理+数据库

一、介绍 电商购物管理系统,本系统前端使用HTML、CSS、BootStrap等技术搭建前端界面,后端使用Django框架处理用户的逻辑请求。主要功能有: 管理员登录与管理:管理员可以登录后台,对用户和商品进行增删改查的操作。用…

stm32 bootloader写法

bootloader写法: 假设app的起始地址:0x08020000,则bootloader的范围是0x0800,0000~0x0801,FFFF。 #define APP_ADDR 0x08020000 // 应用程序首地址定义 typedef void (*APP_FUNC)(void); // 函数指针类型定义 /*main函数中调用rum_app&#x…

vue + 百度地图GL版判断一个点位是否在地图可视区内

利用BMapGLLib中isPointInRect 因为没有找到官方文档因此直接下载了该工具的源码,复制以下部分到自己的项目中,避免再次引用完整的BMapGLLib脚本 关键方法 isPointInRect(point, bounds) {if (!(point.toString() "Point" || point.toString(…

解锁机器人视觉与人工智能的潜力,从“盲人机器”改造成有视觉能力的机器人(下)

机器视觉产业链全景回顾 视觉引导机器人生态系统或产业链分为三个层次。 上游(供应商) 该机器人视觉系统的上游包括使其得以运行的硬件和软件提供商。硬件提供商提供工业相机、图像采集卡、图像处理器、光源设备(LED)、镜头、光…

英飞达医学影像存档与通信系统 WebUserLogin.asmx 信息泄露漏洞复现

0x01 产品简介 英飞达医学影像存档与通信系统 Picture Archiving and Communication System,它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟,DICOM,网络…

93、Python之异常:了解常见的内置异常,遇到不慌

引言 本文接着来聊Python中的异常管理,对于新手来说,一旦看到异常,就会比较慌张。其实,倒不是对异常比较害怕,而是担心不知道该怎么处理这种异常才是比较可怕的。本文就简单列举一下Python中比较常见的异常&#xff0…

python学习-怎么在Pycharm写代码

打开Pycharm,点击文件-新建项目 2.选择pure python-点击箭头 展开 3.选择 Existing interpreter 如果 Existing interpreter 下没有相关环境 (1)点击**…** (2)选择python的安装路径 4.可修改文件名称-点击创建 …

二叉搜索树中第 K 小的元素

二叉搜索树中第 K 小的元素 ​ 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。 示例 1: 输入:root [3,1,4,null,2], k 1 输出:1…

QT实现改变窗口大小其子控件也自动调节大小

创建一个顶层布局即可,一定要在MainWindows或者Widget的下面! 观察图标变化 带有禁止的意思是分拆布局(当前无布局) 现在是添加布局后了 注意:一定是在MainWindows或Widget才可以添加顶层布局,才可以实现…

Golang简介

目录 第一章 go语言起源 第一节 go语言发展 1.知名编程语言或系统的发展简吏 2.Go语言的前世今生 3.go语言的核心特性 4.Go语言的优势和其他语言的对比 5.Go开发环境搭建 第二章 go语言Helloworld 一、go项目工程结构 二、执行go程序 三、go程序的解释说明 第三章 g…

29.第二阶段x86游戏实战2-遍历周围-花指令与二叉树数据结构(有如何阅读vm代码混淆代码)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…

VmWare下的linux虚拟机磁盘空间扩展

我用vmware开启了一个虚拟机,虚拟机操作系统是centos7。今天发现磁盘空间不够了,导数据到里面的mysql,提示没有空间,之后mysql也连不上了。这个mysql部署在docker里,结果停止都停止不了,强制停止也不行。无…

10-Python基础编程之函数

Python基础编程之函数 概念基本使用参数单个参数多个参数不定长参数缺省参数注意事项 返回值使用描述偏函数高阶函数返回函数匿名函数闭包装饰器生成器递归函数函数的作用域 概念 写了一段代码实现了某个小功能:然后把这些代码集中到一块,起一个名字&am…

五、Spring Boot集成Spring Security之认证流程2

一、Spring Boot集成Spring Security专栏 一、Spring Boot集成Spring Security之自动装配 二、Spring Boot集成Spring Security之实现原理 三、Spring Boot集成Spring Security之过滤器链详解 四、Spring Boot集成Spring Security之认证流程 五、Spring Boot集成Spring Se…