当前位置: 首页 > news >正文

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语言和汇编语言混合编程 “每日读书”

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

利用“定时执行专家”循环执行BAT、VBS、Python脚本——含参数指定功能

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

【算法集训】基础算法:模拟

一、基本理解 顾名思义&#xff0c;就是题目要求做什么&#xff0c;代码中就跟着做就可以。 二、题目练习 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面试真题(一)

&#xff08;北京&#xff09;taskManager和slot、task的关系 ? &#xff08;北京&#xff09;flink状态太大怎么解决 ? &#xff08;北京 flink提交方式和运行模式 ? &#xff08;北京&#xff09; 怎么提交的实时任务&#xff0c;有多少Job Manager&#xff1f; &…...

Java面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有1种

线程创建之源 OK&#xff01;咱们闲话少叙&#xff0c;直接进入正题&#xff0c;回顾一下通过实现Runnable接口&#xff0c;重写run方法创建线程的方式&#xff0c;真的可以创建一个线程吗&#xff1f;来看下面这段demo。 【代码示例1】 public class Test implements Runnab…...

JavaEE面试题

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

探索macOS上的最佳MySQL客户端工具

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

[Android] MediaPlayer SDK API glance

参考&#xff1a; https://developer.android.com/reference/android/media/MediaPlayer 如何使用MediaPlayer SDK&#xff1a; https://developer.android.com/media/platform/mediaplayer 概述&#xff1a; 音视频的 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");} } 注意&#xff1a;类名与文件名一致 然后运行…...

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 找到文件解压到的位置&#xff0c;由于解压时我们没有指定路径&#xff0c;因…...

Pycharm无法粘贴外部文本问题

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

学习Java的第四天

目录 一、if选择结构 1、基本if选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a; 2、if-else 选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a; 3、多重if选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a…...

【Javaweb】【瑞吉外卖】登录功能plus--拦截器filterinterceptors实现

上手第二天&#xff0c;做到登录拦截器部分 需求&#xff1a;完成目标是&#xff0c;只有在登录的情况下才想让其访问后端&#xff0c;没有登录禁止访问&#xff0c;并且让其跳转。 这里有一个比较好的思想是&#xff1a;后端程序要主要需要考虑的是拦截接口&#xff0c;不能让…...

关于 Runes 协议及「公开铭刻」发行机制的拓展讨论

撰文&#xff1a;MiX 编辑&#xff1a;Faust&#xff0c;极客 web3 2024 年 3 月 2 日&#xff0c;Runes 生态基础设施项目 Rune alpha 的创始人&#xff0c;在 Github 的公开议题中&#xff0c;与 Runes 协议创始人 Casey 展开了讨论&#xff0c;双方对如何拓展 Runes 协议的…...

chkdsk修复会造成文件丢失吗?chkdsk数据丢失还能恢复吗

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

Hypermesh2019快捷键大全

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

CSS布局——Flexbox基础使用

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

PaddleNLP:面向产业级应用的大语言模型全流程开发套件技术深度解析

PaddleNLP&#xff1a;面向产业级应用的大语言模型全流程开发套件技术深度解析 【免费下载链接】PaddleNLP PaddleNLP是一款基于飞桨深度学习框架的大语言模型(LLM)开发套件&#xff0c;支持在多种硬件上进行高效的大模型训练、无损压缩以及高性能推理。PaddleNLP 具备简单易用…...

3种方法永久解决IDM激活弹窗问题 开源工具全解析

3种方法永久解决IDM激活弹窗问题 开源工具全解析 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager&#xff08;IDM&#xff09;作为一款…...

Vmware系列虚拟机系列【仅供参考】:解决 VMware 嵌套虚拟化提示 关闭“侧通道缓解“

解决 VMware 嵌套虚拟化提示 关闭“侧通道缓解“ 解决 VMware 嵌套虚拟化提示 关闭"侧通道缓解" 解决方法 方法1: 方法2: 完全禁用 Hyper-V 方法3 参考链接: 解决 VMware 嵌套虚拟化提示 关闭"侧通道缓解" 最近给电脑做了新版的 Windows 11 LTSC操作系…...

抽象推理终极指南:10个ARC经典案例解析助你掌握核心技巧

抽象推理终极指南&#xff1a;10个ARC经典案例解析助你掌握核心技巧 【免费下载链接】ARC-AGI The Abstraction and Reasoning Corpus 项目地址: https://gitcode.com/GitHub_Trending/ar/ARC-AGI 抽象与推理语料库&#xff08;ARC&#xff09;是一个专门用于评估通用人…...

我的实用设计模式之 关于Policy-based design在Windows Mobile网络连接管理的应用

Raw Data&#xff08;原数据&#xff09;使用不要的分析器&#xff08;分析器使用不同的算法&#xff09;分析出关心的Event&#xff08;事件&#xff0c;对象&#xff0c;告警等等&#xff09;。同时作为behavior模式之一&#xff0c;stragety模式也可以使用在 定义多个behavi…...

深入解析Triton Server的Backend插件机制与自定义开发实践

1. Triton Server与Backend插件机制概述 第一次接触Triton Server时&#xff0c;最让我困惑的就是它的Backend机制。简单来说&#xff0c;Triton就像一个万能插座&#xff0c;而各种Backend就是不同标准的插头。比如你用PyTorch训练了个模型&#xff0c;Triton的pytorch_backen…...

RTX 4090专属SDXL 1.0绘图工坊实测:一键生成电影质感图片,效果惊艳

RTX 4090专属SDXL 1.0绘图工坊实测&#xff1a;一键生成电影质感图片&#xff0c;效果惊艳 1. 开箱体验&#xff1a;当顶级显卡遇上专业绘图模型 拿到这台搭载RTX 4090显卡的工作站时&#xff0c;我就迫不及待地想测试它的AI绘图能力。SDXL 1.0作为Stable Diffusion系列的最新…...

Simulink新手必看:从零搭建四轴飞行器仿真模型(附完整代码)

Simulink实战&#xff1a;四轴飞行器仿真建模全流程解析 四轴飞行器作为无人机领域的经典构型&#xff0c;其控制系统的设计与验证一直是工程师和科研人员的重点课题。对于刚接触Simulink的开发者而言&#xff0c;如何将复杂的飞行动力学转化为可视化的仿真模型往往令人望而生畏…...

Ryzen SDT调试工具:解锁AMD处理器潜能的系统级配置平台

Ryzen SDT调试工具&#xff1a;解锁AMD处理器潜能的系统级配置平台 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://g…...

SiameseUIE中文-base效果对比:在CLUE-NER和COTE-ABSA双基准测试

SiameseUIE中文-base效果对比&#xff1a;在CLUE-NER和COTE-ABSA双基准测试 想找一个开箱即用、效果又好的中文信息抽取工具&#xff1f;今天我们来聊聊阿里巴巴达摩院出品的SiameseUIE中文-base模型。这可不是一个普通的模型&#xff0c;它是一个“通用信息抽取”模型&#x…...