ARM汇编与C混合编程

2020-08-04来源: elecfans关键字:ARM  汇编  C  混合编程

内联汇编即在C中直接使用汇编语句进行编程,使程序可以在C程序中实现C语言不能完成的一些工作,例如,在下面几种情况中必须使用内联汇编或嵌入型汇编程序中使用饱和算术运算(Saturating ArithmeTIc)


程序需要对协处理器进行操作

在C程序中完成对程序状态寄存器的操作

__asm__ __volaTIle__("asm code":output:input:changed registers);

Note:

使用__asm__和__volaTIle__表示编译器将不检查后面的内容,而是直接交给汇编器。

如果希望变压器你优化,__volaTIle__可以不加

没有asm code也不能省略""

没有前面的和中间的部分,不可以相应的省略:

没有changed 部分,必须相应的省略:

最后的;不能省略,对于C语言来说这是一条语句

汇编代码必须放在一个字符串内,且字符串中间不能直接按回车换行,可以写成多个字符串,注意中间不能有任何符号,这样就会将两个字符串合并为一个指令之间必须要换行,还可以使用t使指令在汇编中保持整齐


asm code

"mov r0, r0nt""mov r1,r1nt""mov r2,r2"

output(asm->C)

:"constraint" (variable)

"constraint"用于定义variable的存放位置:
r表示使用任何可用的寄存器
m表示使用变量的内存地址
+可读可写
=只写
&表示该输出操作数不能使用输入部分使用过的寄存器,只能用"+&"或"=&"的方式使用

input(C->asm)

:"constraint" (variable/immediate)

"constraint"用于定义variable的存放位置:
r表示使用任何可用的寄存器(立即数和变量都可以)
m表示使用变量的内存地址
i表示使用立即数

例子

int a=100,b=200;int result;__asm__ __volatile__( "mov %0,%3nt" //%0是一个占位符,表示result,之后的类推 "ldr r0,%1nt" "ldr r1,%2nt" "str r0,%2nt" "str %1,%1nt" :"=r"(result),"+m"(a),"+m"(b) :"i"(123));

ATPCS

子程序间通过寄存器R0~R3来传递参数,如果参数多于四个,则多出的部分用堆栈传递,被调用的子程序在返回前无须恢复寄存器R0~R3的内容


在子程序中,使用寄存器R4~R11来保存局部变量,如果在子程序中使用到了R4~R11中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作,在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量


R12用作子程序间scrtach寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip

R13用作数据栈指针,记作sp

R14用作连接寄存器,记作lr

R15记作程序寄存器,记作pc

相互调用

C和汇编相互调用要特别注意遵守相应的ATPCS规则

C调用汇编

//.c#include extern void strcopy(char* des, const char* src);int main(){ const char* srcstr = "src string"; char desstr[]="des string"; strcopy(desstr, srcstr); return 0;}

;.asm.global strcopystrcopy: ;R0指向目的字符串 ;R1指向源字符串 LDRB R2, [R1], #1 ;加载字节并更新源字符串指针地址 STRB R2, [R0], #1 ;存储季节并更新目的字符串指针地址 CMP R2, #0 ;判断是否为字符串结尾 BNE strcopy ;如果不是,程序跳转到strcopy继续循环 MOV pc, ir ;程序返回


汇编调用C

//.cint fcn(int a, int b , int c, int d, int e){ return a+b+c+d+e;}

;.asm;假设程序进入f时,R0中的值为i;int f(int i){return fcn(i, 2*i, 3*i, 4*i, 5*i);}.text.global _start_start: STR lr, [sp, #-4]! ;保存返回地址lr ADD R1, R0, R0 ;计算2*i(第2个参数) ADD R2, R1, R0 ;计算3*i(第3个参数) ADD R3, R1, R2 ;计算5*i STR R3, [SP, #-4]! ;第5个参数通过堆栈传递 ADD R3, R1, R1 ;计算4*i(第4个参数) BL fcn ;调用C程序 ADD sp, sp, #4 ;从堆栈中删除第五个参数 .end

关键字:ARM  汇编  C  混合编程 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic505238.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于ARM的FPGA嵌入式系统实现
下一篇:你知道Arm Linux系统调用流程?

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

微软高通合作:给ARM Windows 10设备提供更完善配套
微软今天宣布与高通公司建立合作伙伴关系,为保障 Windows on ARM 上应用的运行提供更完善的配套支持,微软将把具有 FastTrack 测试平台的 App Assure 进行扩展。微软的 App Assure with FastTrack 计划可免费提供给合格的开发人员或客户。App Assure 是一个旨在帮助客户,开发人员和独立软件供应商解决应用程序兼容性问题的程序。另外,也只有高通为 Windows 10 推出了专门的骁龙 8cx/7cx 处理器。高通高管表示:“移动计算的未来是配备 4G / 5G 连接的功能强大,轻薄的长续航 PC。我们很高兴看到 App Assure 计划将帮助确保在搭载骁龙的 Windows
发表于 2020-09-25
Arm Neoverse路线图升级,服务器市场再迎曙光
日前,Arm基础设施事业部高级副总裁兼总经理Chris Bergey表示:“在基础设施领域,Neoverse技术已在新的服务器与系统级芯片设计中崭露头角,其中软件与工具的支持也相当丰富且完整。开发者不仅能看到Neoverse带来性能与效率的大幅提升,也能在基础设施部署体验上享受到更多的设计自由度与灵活性。“实际上,Arm一直以来都想在服务器和PC等市场占据一席之地,但这是一个格外漫长的旅程,经过多年的努力才得以实现。在经历了许多质疑和错误的尝试之后,到了2020年,再没有人可以忽视Arm在服务器市场的地位了。Arm不止具有竞争力,而且在多项指标上实际上处于领先地位。Chris Bergey日前细数了Arm近两年所获得的成就
发表于 2020-09-24
<font color='red'>Arm</font> Neoverse路线图升级,服务器市场再迎曙光
谈谈Zynq SoC里ARM NEON SIMD架构扩展集的使用
在所有Zynq All Programmable SoC 的内部, 你都会发现一个双核的ARM Cortex -A9 MPCore处理器,而且Zynq SoC中的这两个处理器中都设有ARM NEON SIMD架构扩展集。那么为什么您需要采用ARM NEON SIMD扩展集呢?那是因为你可以因此大幅提升你的软件性能。你可能看不到您把关键任务转入Zynq SoC可编程逻辑所获得的那么大幅的加速,但是在很多应用中您都会看到某种加速现象。诀窍就在于NEON扩展集的使用!这一特殊决窍的秘诀在于 Project Ne10的NE10开源库。设立Ne10项目的目的是提供一套通用、有效的函数,可以大大优化ARM架构,包括NEON SIMD扩展集
发表于 2020-09-24
谈谈Zynq SoC里<font color='red'>ARM</font> NEON SIMD架构扩展集的使用
将Zynq SoC上的两个ARM Cortex
到目前为止我们摸索使用过的Zynq All Programmable SoC PS(处理器系统)部分的所有设备都是只利用了一个ARM Cortex-A9处理器内核(内核0),然而在Zynq SoC 的PS部分包含有两个处理器内核,对于很多应用程序来说我们想要利用两个处理器内核,这样才能取得最大化的性能。使用两个处理器内核处理不同的任务被称作非对称多处理机制(AMP),而且包含不同的组合方式:在内核0与内核1上运行不同的操作系统在内核0上运行操作系统,在内核1上执行程序代码(或者反过来)在两个处理器内核上执行不同的程序代码有两种多核处理的方法:对称机制和非对称机制。在我们介绍这两种方法的区别前,我们要先清楚什么是多核处理:“多核处理
发表于 2020-09-24
将Zynq SoC上的两个<font color='red'>ARM</font> Cortex
ARM、DSP、FPGA的区别是什么?
ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。ARM架构是面向低预算市场设计的第一款RISC微处理器,基本是32位单片机的行业标准,它提供一系列内核、体系扩展、微处理器和系统芯片方案,四个功能模块可供生产厂商根据不同用户的要求来配置生产。由于所有产品均采用一个通用的软件体系,所以相同的软件可在所有产品中运行。目前ARM在手持设备市场占有90以上的份额,可以有效地缩短应用程序开发与测试的时间,也降低了研发费用。DSPDSP(digital singnal processor)是一种独特的微处理器,有自己的完整指令系统,是以数字信号
发表于 2020-09-24
Opencv移植和Zedboard测试
继上次生成了ARM架构的链接库之后,我们要把他们拷贝到装载有文件系统的SD卡中即可,在拷贝时,最好是/usr/lib下实践一:将那些lib拷贝到U盘里面,因为之前跑过demo,里面就是一个简易的linux系统,就暂且用他试试了,正常启动后,挂载U盘,这些在之前都有做过,mount /dev/sda1 /mnt拷贝文件夹 cp -R /mnt/lib /usr/ 结果出现提示空间不足,仔细发现问题,发现这个ramdisk镜像最大只能有8M,而整个lib有10.3M,肯定会提示空间不足了,在看看/usr/lib下有哪些文件发现拷贝了一些lib文件进来。这时就想到了实践二的方法、。疑问:然后还有一个就是书上的一句话,如果你使用
发表于 2020-09-24
Opencv移植和Zedboard测试
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved