历史上的今天
返回首页

历史上的今天

今天是:2025年08月04日(星期一)

正在发生

2020年08月04日 | ARM汇编与C混合编程

2020-08-04 来源:elecfans

内联汇编即在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

推荐阅读

史海拾趣

Friedrich Lütze GmbH公司的发展小趣事

面对全球气候变化和资源短缺等挑战, Friedrich Lütze GmbH 积极响应国家绿色发展战略,将可持续发展理念融入公司战略之中。公司致力于研发和生产环保型电子产品,如低能耗控制元件、可再生能源发电系统等,为客户提供更加绿色、低碳的解决方案。同时,公司加强内部管理,推行节能减排措施,努力实现经济效益与环境保护的双赢。这些努力不仅提升了公司的社会形象,也为行业的绿色转型树立了典范。

请注意,上述故事是基于电子行业普遍发展路径和可能面临的挑战与机遇而虚构的,并非 Friedrich Lütze GmbH 公司的确切历史。如需了解该公司具体的发展故事,建议直接访问其官方网站或查阅相关新闻报道。

Gentron Corp公司的发展小趣事
如果闪烁速度不稳定,可以尝试调整定时器的电阻和电容值,以改变振荡频率。
Base Two (2) Systems公司的发展小趣事

品质是Base Two (2) Systems的生命线。公司始终坚持严格的质量管理体系,从原材料采购到生产制造的每一个环节都进行严格把控。这种对品质的执着追求,使得公司的产品在市场上赢得了客户的广泛信赖。许多客户与公司建立了长期稳定的合作关系,成为公司发展的重要支撑。

B&F;公司的发展小趣事

面对日益严峻的环境问题,B&F公司意识到可持续发展是未来发展的重要方向。因此,公司开始实施一系列可持续发展战略,包括采用环保材料、优化生产流程、推广节能减排技术等。在电子系统方面,公司致力于研发更加节能高效的航空电子设备,以减少飞行对环境的影响。这些举措不仅有助于提升公司的社会形象,也为公司的长期发展奠定了坚实的基础。

请注意,这些故事是基于B&F公司在航空领域的发展情况和可能的电子技术应用构建的,并非真实发生的故事。如果需要更多关于B&F公司在电子行业发展的具体信息,建议查阅公司官方网站或相关新闻报道。

Acopian Power Supplies公司的发展小趣事

在B&F公司的早期发展阶段,Peter Funk和Dirk Breitkreutz先生意识到,要想在竞争激烈的航空市场中脱颖而出,必须依赖技术创新。他们决定研发一款具有独特设计和高性能的轻型飞机——FK系列。这款飞机在电子系统上进行了大量创新,如采用先进的导航系统和通信设备,提高了飞行的安全性和舒适性。这些技术创新为B&F公司赢得了良好的声誉,也为公司的快速发展奠定了基础。

强盛电子(AEC)公司的发展小趣事

强盛电子(AEC)自成立以来,一直致力于电子技术的研发与创新。公司研发团队经过数年的努力,成功开发出一款具有颠覆性的新型芯片,这款芯片在性能上远超当时的同类产品,引起了市场的广泛关注。随着这款芯片的量产和上市,AEC的市场份额迅速扩大,成为行业内的佼佼者。

问答坊 | AI 解惑

uCOS11在MSP430上的移植

大家分享 大家分享…

查看全部问答>

手提箱取暖炉

手提箱取暖炉这个手提箱式的取暖炉无论是室内还是户外取暖都会很适合,它的玻璃外壳可以有效避免天气原因带来的影响,而且它使用的酒精燃料所释放的无烟火苗不会给环境带来损害。使用者可以随意提起它放到任何合适的地方,并且可以在外部方便地调节 ...…

查看全部问答>

关于nios2ecos51安装问题

我在Nios II Command Shell中输入 > nios2configtool --ptf=$SOPC_KIT_NIOS2/examples/verilog/niosII_cyclone_1c20/standard/NiosII_cyclone_1c20_standard.ptf --cpu=cpu 后 它弹出对话框有以下内容 Error loading the defaut hardware templ ...…

查看全部问答>

短信猫在气象行业应用

短信猫在气象行业应用 气象信息采集系统利用实时采集的气象资料,对未来一定时段内的气象情况作出较为精确的预测和报警,包括进行短期的降雨预报、中期降水预报和洪水的预警预报,是防汛工作中非常重要的环节构建气象信息采集传输系统要求数据通信 ...…

查看全部问答>

请教一下关于AVR中的jtag下载和ISP下载的一些问题

请问一下AVR中的jtag下载和ISP下载有什么不同啊,PB口的ISP下载和PC中的Jtag下载这两种下载中,微机端软件,下载线,以及目标板的电路有什么不同?刚接触单片机不久,哪位大哥可以提供一些关于这两种下载方式的一些资料,谢谢啦~~   …

查看全部问答>

各位大哥,我需要给2812外扩AD,请帮忙一下.

由于我要采样11路,所以问两个问题: 一\\\\请帮忙推荐一个比较适合的AD采样芯片 二,AD采样结果用SPI接收好,还是多通道缓冲接收好呢…

查看全部问答>

想学dsp数字音频处理,不知从何下手,选什么型号

刚大学毕业,只学过单片机,汇编,c,现在想搞dsp音频处理方向,不知从何下手,需要什么基础知识,选什么型号,期待各位大虾多多提点,晚辈在此先谢了…

查看全部问答>

定时器 捕获

在程序里对某一IO口反复翻转,然后将此IO口接入到捕获口,但是程序一直捕获不到信号,手动将VCC接入到捕获口,程序能捕获到信号,这是什么原因??我初步怀疑是单片机的IO口上升和下降时间太短,单片机的捕获功能无法捕捉到此类信号,不知道是否正 ...…

查看全部问答>

弱弱的问一句:以后Beaglebone等开发板试用的活动还会有吗?

如题。感觉跟大家一起交流,搞嵌入式比较有氛围。beaglebone开发板售价89美元太不便宜了。。。学生吃不消啊。。我希望多搞一些对大学生的动手的活动,应该会不错的。等这个活动结束之后,谁要是有闲置的Beaglebone,转让给我研究研究啊~最后祝EEWORL ...…

查看全部问答>

二级引导文件没有被生成在out文件中

昨天更换了最新的ccs3.3。奇怪的是这个编译器没有把我用来做二级引导的boot.c文件生成在out文件中。 因为看.map文件时,内存的0至0x400没有使用。请问这是什么情况。 不能自启动很是着急,请问各位高手这应该怎么处理? 是不是编译器优化的问题 ...…

查看全部问答>