ARM嵌入式学习--第四天

ops/2024/10/24 1:11:31/

汇编与C混合编程

-汇编指令中调用C语言

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

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

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

.global _start
_start:mov r0,#5mov r1,#3ldr sp,=0x2000fff0bl 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修饰


http://www.ppmy.cn/ops/127964.html

相关文章

k8s部署Kafka集群超详细讲解

准备部署环境 Kubernetes集群信息 NAMEVERSIONk8s-masterv1.29.2k8s-node01v1.29.2k8s-node02v1.29.2 Kafka:3.7.1版本,apche版本 Zookeeper:3.6.3版本 准备StorageClass # kubectl get sc NAME PROVISIONER RECLA…

旅游攻略网站毕业设计计算机毕设基于SpringBootSSM框架

目录 1.摘要 2 引言 2.1 开发目标 2.2 项目内容 2.3 项目背景与目的 3. 技术选型 3.1 JAVA 简介 3.2 MySQL 介绍 ‌4. 功能描述与创新点 4.1 功能描述 ‌4.2创新点设计 4.3 功能图展示 5. 数据库设计 6. 项目任务与要求 1.摘要 本文旨在设计并实现一个功能全面、…

C++代码操作指令的定义

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、最简单的函数二、栈设计StackEntry 类std::vector 容器std::vector<StackEntry>的特点std::vector<StackEntry>的操作成员枚举 Type&#xff1…

RabbitMQ service is already present - only updating service parameters

Windows下卸载RabbitMQ之后,然后重新注册RabbitMQ服务的时候,报错以下信息: D:\software\rabbitmq-server-4.0.2\rabbitmq_server-4.0.2\sbin>D:\software\rabbitmq-server-4.0.2\rabbitmq_server-4.0.2\sbin\rabbitmq-service.bat install RabbitMQ service is already …

【Jmeter】jmeter运行时自动获取线程号几种方式

背景&#xff1a; 在模拟多线程场景时&#xff0c;使用序号可以标记并追踪当前执行请求的虚拟用户。 方法1&#xff1a;通过添加BeanShell前置处理器获取或BeanShell预处理程序获取线程号 获取函数&#xff1a;${__BeanShell(ctx.getThread().getThreadName())} Thread.slee…

②PROFINET转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 PROFINET 转 Modbus TCP &#xff08;接上一章&#xff09; 配置使用 与 PROFINET 主站进行组态说明 这里介绍与西门子 PLC 的…

Godot中类和静态类型

目录 类 关键字class_name 除了为类定义方法&#xff0c;我们也可以为类定义属性字段 实例释放前后的打印 Refcounted RefCounted维护了一个引用计数器 get_reference_count 类是引用类型数据 class关键字 静态类型 静态方法 静态方法只能访问静态变量 类 是面向…

“摄像机”跟随及攻击抖动实现

学习Unity的摄像机功能&#xff0c;可以帮助我们实现摄像机对人物的跟随移动&#xff0c;还可以使用这个工具自带的插件&#xff0c;摄像机震动&#xff0c;颤动&#xff0c;增强打击感&#xff1b; 首先来安装一下这个插件&#xff0c;window菜单--packageManage--左上角Unit…