3.6 C语言和汇编语言混合编程 “每日读书”
在一些嵌入式场合,我们经常看到C程序和汇编程序相互调用,混合编程,如在ARM启动代码中,系统上电首先运行的是汇编代码,等初始化好内存堆栈环境之后,才会跳到C程序中执行,对嵌入式软件进行优化时,在一些性能要求比较高的场合,通常会在C语言中内嵌一些汇编代码,作为一名嵌入式工程师,掌握C语言和汇编的混合编程还是有必要的。
3.6.1 ATPCS规则
无论是在汇编程序中调用C程序,还是在C程序中调用汇编,往往都要涉及子程序调用,子程序的返回,参数传递这些问题。从指令集层面看C语言和汇编语言,两种其实无差别。最终都会被翻译成二进制机器指令,在学习C语言和ARM汇编语言混合编程之前,我们需要先了解一下ATPCS规则。
ATPCS的全称是ARM-thumb procedure call standard, 其核心内容就是定义了ARM子程序调用的基本规则以及堆栈的使用约定等,如ATPCS规定了ARM程序要使用满递减堆栈,入栈/出栈操作要使用STMFD/LDMFD指令,只要所有的程序都遵循这个约定,ARM程序的格式也就统一了。我们编写的ARM程序也就可以在各种各样的ARM处理器上运行了。
ATPCS最重要的内容就是定义了子程序调用的具体规则,无论是程序员编写程序,还是编译器开发商开发编译器工具,一般都要遵循它,规则的主要内容如下。
1 子程序间要通过寄存器R0-R3 传递参数,当参数大于4个时,剩余的参数使用堆栈来传递。
2 子程序通过r0-r1返回结果
3 子程序使用r4-r11来保存局部变量
4 r12作为调用过程中的临时寄存器,一般用来保存函数的栈帧基址,记作FP。
5 r13作为堆栈指针寄存器,一般记作SP
6 R14作为链接寄存器,用来保存函数调用者的返回地址,记作LR。
7 R15作为程序计数器,总是指向当前正在运行的指令,记作PC。
在ARM平台下,无论是C程序,还是汇编程序,只要大家遵守ARM子程序之间的参数传递和调用规则,就可以很方便的在C程序中调用汇编子程序,或者在一个汇编程序中调用C程序。
我们在main.c 中定义了main函数和sum函数,在一个汇编文件SUM.S中定义了一个汇编子程序SUM_ASM。 在main() 函数中,我们直接调用了汇编子程序SUM._ASM 而在SUM_ASM的汇编代码实现中,又调用了在C源文件中定义的sum 函数,使用较差编译器arm-linux-gcc编译这两个源文件运行。
IMPORT sum;
AREA SUM_ASM,CODE,READONLY
EXPORT SUM_ASM
SUM_ASM
STR LR.[SP, #-4] ;去栈变量
LDR R0,=0x3
LDR R1, =0x4
BL sum
LDR PC,[SP],#4
END
int sum(int a, int b)
{
int result = a + b;
return result;
}
int main(void)
{
SUM_ASM();
return 0;
}
3.6.2 在C程序中内嵌汇编代码
为了能在C程序中内嵌汇编代码,ARM编译器在ANSI C标准的基础上,扩展了一个关键字__asm, 通过这个关键字,我们就可以在C程序中内嵌AMR汇编代码,在C程序中内嵌汇编代码的格式如下。
__asm
{
指令
[指令]
}
这里有个细节需要注意下,想再内嵌的汇编代码中添加注释,记得要使用C语言的注释符号,而不是汇编语言的注释。接下来我们通过一个数据块复制的例子。
int src[10] = {1,2,3,4,5,6,7,8,9};
int dst[10] = {0};
//数据块复制的C语言实现
int data_copy_c(void)
{
for (int i = 0; i < 10; i++)
dst[i] = src[i];
return 0;
}
//数据块复制的内容ARM汇编实现
int data_copy_asm(void)
{
__asm
{
LDR R0,=src
LDR R1,=dst
MOV R2, #10
LOOP:
LDR R3, [R0], #4
STR R3,[R1],#4
SUBS R2,R2,#1
BNE LOOP
}
}
为了能在C程序中内嵌汇编代码,不同的编译器给予ANSI C标准扩展了不同的关键字,使用的汇编风格也不一样。
相关文章:

3.6 C语言和汇编语言混合编程 “每日读书”
在一些嵌入式场合,我们经常看到C程序和汇编程序相互调用,混合编程,如在ARM启动代码中,系统上电首先运行的是汇编代码,等初始化好内存堆栈环境之后,才会跳到C程序中执行,对嵌入式软件进行优化时&…...

利用“定时执行专家”循环执行BAT、VBS、Python脚本——含参数指定功能
目录 一、软件概述 二、VBS脚本执行设置 三、触发器设置 四、功能亮点 五、总结 在自动化办公和日常计算机任务管理中,定时执行脚本是一项非常重要的功能。今天,我将为大家带来一款名为“定时执行专家”的软件的评测,特别是其定时执行VB…...

【算法集训】基础算法:模拟
一、基本理解 顾名思义,就是题目要求做什么,代码中就跟着做就可以。 二、题目练习 1252. 奇数值单元格的数目 根据题目要求列出如下代码。需要注意填充列和行的时候注意下标。 int oddCells(int m, int n, int** indices, int indicesSize, int* in…...

基于SSM的房客源信息管理系统设计与实现
目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 SSM框架 3 1.2 Vue框架 3 1.3 ECharts 3 1.4 JQuery技术 3 1.5 本章小结 4 2系统分析 5 2.1 需求分析 5 2.2 非功能需求 8 2.3 本章小节 8 3 系统设计 9 3.1 系统总体设计 9 3.1.1 系统体系结构 9 3.1.2 系统目录结构 9 3…...

常见数据类型
目录 数据类型 字符串 char nchar varchar varchar2 nvarchar 数字 number integer binary_float binary_double float 日期 date timestamp 大文本数据 大对象数据 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 数…...

基于vue的联通积分商城数据可视化APP设计与实现
目 录 摘 要 I Abstract II 引 言 1 1 前端技术介绍 3 1.1 前端开发语言 3 1.1.1 HTML5 3 1.1.2 CSS3 3 1.1.3 JavaScript 3 1.2 MVVM开发模式 4 1.3 Vue框架 4 1.4 Axios技术 5 1.5 ECharts 5 1.6 数据库技术 5 1.7 本章小结 6 2 前端开发的分析 7 2.1 功能性需求分析 7 2.2 …...

2024年flink面试真题(一)
(北京)taskManager和slot、task的关系 ? (北京)flink状态太大怎么解决 ? (北京 flink提交方式和运行模式 ? (北京) 怎么提交的实时任务,有多少Job Manager? &…...

Java面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有1种
线程创建之源 OK!咱们闲话少叙,直接进入正题,回顾一下通过实现Runnable接口,重写run方法创建线程的方式,真的可以创建一个线程吗?来看下面这段demo。 【代码示例1】 public class Test implements Runnab…...

JavaEE面试题
一、String面试题 1、String s1 "123"; 和 String s2 new String("123");的区别 在Java中,"String s1 "123";"和"String s2 new String("123");"这两行代码有一些重要的区别: "…...

探索macOS上的最佳MySQL客户端工具
在数据库管理和开发的世界里,选择一个高效、功能全面的客户端工具对于提升工作效率至关重要。尤其对于使用 macOS 的开发者来说,一个好的 MySQL 客户端不仅可以简化数据库操作,还能提供强大的数据分析和管理功能。本文将介绍几款适用于 macOS…...

[Android] MediaPlayer SDK API glance
参考: https://developer.android.com/reference/android/media/MediaPlayer 如何使用MediaPlayer SDK: https://developer.android.com/media/platform/mediaplayer 概述: 音视频的 playback。创建 MediaPlayer 的线程必须和调用 SDK 接口…...

原始手写helloworld并打jar包允许
1.创建文件夹test统一在其中操作 2.创建hello.java文件 【hello.txt改属性为hello.java】并在里面添加代码 public class hello {public static void main(String[] args) {System.out.println("hello world");} } 注意:类名与文件名一致 然后运行…...

maven 的安装与配置(Command ‘mvn‘ not found)修改配置文件后新终端依旧无法识别到 mvn 命令
下载 maven 安装包 wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz 解压 apache-maven-3.9.4-bin.tar.gz tar -zxvf apache-maven-3.9.4-bin.tar.gz 找到文件解压到的位置,由于解压时我们没有指定路径,因…...

Pycharm无法粘贴外部文本问题
Pycharm无法粘贴外部文本问题 百度找了好多是因为安装了vim,最后发现是因为pycharm粘贴框存在了很多内容导致 操作方法: 1、清理所有缓存的复制内容 ctrlshiftV 可以看到编译器所有缓存下来的复制文本 2、ctrlA然后delete 解决:此时再复…...

学习Java的第四天
目录 一、if选择结构 1、基本if选择结构 语法结构: 流程图: 示例: 2、if-else 选择结构 语法结构: 流程图: 示例: 3、多重if选择结构 语法结构: 流程图: 示例:…...

【Javaweb】【瑞吉外卖】登录功能plus--拦截器filterinterceptors实现
上手第二天,做到登录拦截器部分 需求:完成目标是,只有在登录的情况下才想让其访问后端,没有登录禁止访问,并且让其跳转。 这里有一个比较好的思想是:后端程序要主要需要考虑的是拦截接口,不能让…...

关于 Runes 协议及「公开铭刻」发行机制的拓展讨论
撰文:MiX 编辑:Faust,极客 web3 2024 年 3 月 2 日,Runes 生态基础设施项目 Rune alpha 的创始人,在 Github 的公开议题中,与 Runes 协议创始人 Casey 展开了讨论,双方对如何拓展 Runes 协议的…...

chkdsk修复会造成文件丢失吗?chkdsk数据丢失还能恢复吗
在Windows操作系统中,CHKDSK是一个强大的磁盘检查工具,它可以帮助我们诊断并修复硬盘的各种错误。然而,许多用户在运行CHKDSK之前都会担心一个问题:CHKDSK修复会造成文件丢失吗?如果不幸发生了数据丢失,CHK…...

Hypermesh2019快捷键大全
1、F系列 F* | ShiftF* F1 | 打开帮助文件 | color F2 | delete | temp nodes F3 | replace | edges F4 | distance | tran…...

CSS布局——Flexbox基础使用
基础概念 Flexbox布局的概念 Flexbox布局是一种布局的模式,用来在一个维度上为项目设置布局 容器 在HTML中大多数元素例如div、ul、main块元素,span、em、i行内元素都可以作为Flex容器,它的作用是开启一个Flex布局模式,你只需…...

Kubernetes(K8s):容器化应用的航空母舰
一、Kubernetes简介 Kubernetes(K8s)是一个开源的容器编排系统,它的出现就像是为容器化应用提供了一艘强大的航空母舰。在这艘母舰上,你的应用容器就像是一架架战斗机,Kubernetes负责指挥它们起飞、飞行、降落&#x…...

Java配置49-nginx 反向代理 sftp 服务器
1. 背景 后端服务需要通过部署在跳板机上的 nginx 访问一个外网的 SFTP 服务器。 2. 方法 nginx从 1.9.0 开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等。 首先检查 nginx 版本信息及是否安装了 stream 模块。 进入 ngi…...

Qt添加VTK并绘制图形
文章目录 准备环境使用VS创建Qt Widget项目配置VTK依赖调试C/C链接器 添加vtk窗口测试代码 参考链接: VS2017配置QT环境(详细版)_vs2017 qt-CSDN博客 QT5VTK9.1最新配置方法_qt vtk-CSDN博客 VTK笔记-Qt5.12.11编译VTK9.0.3-QVTKOpenGLNativeWidget-CSDN博客 准…...

VsCode搭建Spring Boot项目环境
VsCode搭建Spring Boot项目环境 1、前提条件:配置Java环境 下载安装JDK配置环境变量 2、VsCode配置SpringBoot环境 安装扩展 配置Maven 找到Maven配置文件,进行打开settings.json,添加如下代码: "workbench.iconThem…...

(黑马出品_05)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
(黑马出品_05)SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术分布式搜索 今日目标1.初识elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2.ELK技术栈1.1.3.elasticsearch和lucene1.1.4.为什么不是其他搜索技…...

window mysql 安装出现的问题
1.安装到最后时,报错:authentication_string doesnt have a default value 解决办法: 1.不要关掉该页面,点击skip。 然后单击 back 回退到如下界面 2.去掉 Enable Strict Mode。 不要勾选 2. 最后一步:Start Servic…...

【3GPP】【核心网】【5G】5G核心网协议解析(二)(超详细)
5G UE 附着过程 UE AMF ----------------- 注册请求(Registration Request) ----------------------> <--------------- 鉴权请求(Authentication Request) ------…...

物联网带来的六大运营挑战
物联网现在被广泛认为是一种变革力量。根据Juniper Research的调查,到2020年底,将有385亿台设备连接到互联网,自2015年以来增长了285%。 但是随着更多的设备互连,故障的数量也会增加。例如,根据Juniper的数…...

【ETCD】简介安装常用操作---图文并茂详细讲解
目录 一 简介 1.1 etcd是什么 1.2. 特点 1.3. 使用场景 1.4 关键字 1.5 工作原理 二 安装 2.1 etcd安装前介绍 2.2 安装 2.3 启动 2.4 创建一个etcd服务 三 常用操作 一 简介 1.1 etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建…...

第四篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas生物信息学领域应用
传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas生物学数据操作应用介绍二、数据加载与清洗示例代码三、数据分析与统计示例代码四、数据可视化示例代码五、基因组数据分析示例代码六、蛋白质数据分析示例代码七、生物医学图像…...