历史上的今天
返回首页

历史上的今天

今天是:2024年10月09日(星期三)

正在发生

2018年10月09日 | 汇编C语言混合编程经验总结

2018-10-09 来源:eefocus

ATPCS规则体现了一种模块化设计的思想,其基本内容是C模块(函数)和汇编模块(函数)相互调用的一套规则(C51中也有类似的一套规则)。我感觉比在线汇编功能强大(不用有很多忌讳),条理更清楚(很简单的几条规则)。

ATPCS规则内容:

1)寄存器的使用规则

1、子程序之间通过寄存器r0~r3来传递参数,当参数个数多于4个时,使用堆栈来传递参数。此时r0~r3可记作A1~A4。

2、在子程序中,使用寄存器r4~r11保存局部变量。因此当进行子程序调用时要注意对这些寄存器的保存和恢复。此时r4~r11可记作V1~V8。

3、寄存器r12用于保存堆栈指针SP,当子程序返回时使用该寄存器出栈,记作IP。

4、寄存器r13用作堆栈指针,记作SP。寄存器r14称为链接寄存器,记作LR。该寄存器用于保存子程序的返回地址。

5、寄存器r15称为程序计数器,记作PC。

2)堆栈的使用规则

ATPCS规定堆栈采用满递减类型(FD,Full Descending),即堆栈通过减小存储器地址而向下增长,堆栈指针指向内含有效数据项的最低地址。

3)参数的传递规则

1、整数参数的前4个使用r0~r3传递,其他参数使用堆栈传递;浮点参数使用编号最小且能够满足需要的一组连续的寄存器传递参数。

2、子程序的返回结果为一个32位整数时,通过r0返回;返回结果为一个64位整数时,通过r0和r1返回;依此类推。结果为浮点数时,通过浮点运算部件的寄存器F0、D0或者S0返回。

比较有条理,很清楚,我举两个例子:

1.汇编主程序调用C子程序

汇编程序的书写要遵循ATPCS规则,以保证程序调用时参数正确传递。在汇编程序中调用C程序的方法为:

1)在汇编程序中使用IMPORT伪指令或者extern事先声明将要调用的C语言函数;

2)通过BL指令来调用C函数。

例如在一个C源文件中定义了如下求和函数:

int add(int x,int y)

{

return(x y);

}

调用add()函数的汇编程序结构如下:

area main,code,readonly ;代码段

entry ;声明程序入口

code32 ;32位ARM指令

IMPORT add 或者extern add;声明要调用的C函数

start

……

MOV r0,1

MOV r1,2

BL add ;调用C函数add

……

end

当进行函数调用时,使用r0和r1实现参数传递,返回结果由r0带回。函数调用结束后,r0的值变成3。

2.C主程序调用汇编子程序

C程序调用汇编程序时,汇编程序的书写也要遵循ATPCS规则,以保证程序调用时参数正确传递。在C程序中调用汇编子程序的方法为:

1)在汇编程序中使用EXPORT伪指令声明被调用的子程序,表示该子程序将在其他文件中被调用;

2)在C程序中使用extern关键字声明要调用的汇编子程序为外部函数。

例如在一个汇编源文件中定义了如下求和函数:

EXPORT add ;声明add子程序将被外部函数调用

……

add ;求和子程序add

.global add ;声明

ADD r0,r0,r1

MOV pc,lr

……

在一个C程序的main()函数中对add汇编子程序进行了调用:

extern int add (int x,int y); //声明add为外部函数

void main(){

int a=1,b=2,c;

c=add(a,b); //调用add子程序,并且隐式地对r0和r1赋值

……

}

当main()函数调用add汇编子程序时,变量a、b的值会给了r0和r1,返回结果由r0带回,并赋值给变量c。函数调用结束后,变量c的值变成3。

3、C程序中内嵌汇编语句

在C语言中内嵌汇编语句可以实现一些高级语言不能实现或者不容易实现的功能。对于时间紧迫的功能也可以通过在C语言中内嵌汇编语句来实现。内嵌的汇编器支持大部分ARM指令和Thumb指令,但是不支持诸如直接修改PC实现跳转的底层功能,也不能直接引用C语言中的变量。

内嵌汇编:在C和C 语言中嵌入汇编语言可以实现一些高级语言中没有的功能。

语法

__asm__( ;注意:前面是两个“_”

“instruction

...

instruction”

);//Linux gcc中支持

__asm{

instruction

...

instruction

}; //ADS中支持

asm(“instruction[; instruction]”); //ARM C 中使用

ARM内嵌汇编语法

asm(

汇编语句模板:

输出部分:

输入部分:

修改部分

);

比如: asm("mov %0, %1, ror #1" :"=r" (result) : "r" (value));

共四个部分:汇编语句模板,输出部分,输入部分,破坏描述部分,各部分使用“:”格开,汇编语句模板必不可少,其他三部分可选,如果使用了后面的部分,而前面部分为空,也需要用“:”格开,相应部分内容为空。例如:

__asm__ __volatile__(

"CLI":

:"memory"

);

示例:

void __main(void)

{

int var=0xAA;

__asm //内嵌汇编标识

{

MOV R1,var

CMP R1,#0xAA

}

while(1);

}


推荐阅读

史海拾趣

Chenmoun Enterprise Ltd公司的发展小趣事

Chenmoun Enterprise Ltd成立之初,专注于研发和生产电子产品的基础元件。随着技术的不断发展,公司敏锐地把握了市场趋势,开始研发具有创新性的芯片技术。通过不懈的努力,Chenmoun成功推出了性能卓越、成本更低的芯片产品,迅速占据了市场份额,并逐渐在电子行业内崭露头角。

Holt Integrated Circuits公司的发展小趣事

Holt在支持ARINC 429标准方面展现出了强大的实力。其ARINC 429 IC产品系列从简单的线路接收器到集成RAM的完整协议解决方案,覆盖了业内最广泛的范围。这些产品设计精巧,能够在单个3.3V电源上运行,显著降低了系统复杂性和板空间,为航空电子系统带来了更高的效率和可靠性。Holt的这一系列创新产品,不仅满足了航空制造商的严格需求,也推动了ARINC 429标准在全球范围内的广泛应用。

Beckhoff Automation GmbH公司的发展小趣事

在电子行业的快速发展中,BCD Semi公司凭借其卓越的技术创新能力,成功研发出了一系列具有竞争力的半导体产品。公司拥有一支经验丰富的研发团队,不断探索新技术和新应用,将最新的科技成果转化为具有市场竞争力的产品。通过技术创新,BCD Semi在行业中逐渐树立起了良好的口碑,赢得了众多客户的信任和支持。

DREMEL公司的发展小趣事

为了进一步扩大市场份额,Dremio公司积极寻求与电子行业的跨界合作。他们与一家知名电子设备制造商达成战略合作,共同开发了一款集成了Dremio数据处理技术的智能设备。这款设备能够实时收集和分析设备使用数据,为企业提供更精准的市场分析和产品优化建议。通过这一合作,Dremio成功将技术应用于电子设备的全生命周期管理,进一步巩固了其在市场中的地位。

冠图电子(GTL-POWER)公司的发展小趣事

随着全球化的趋势日益明显,Dremio公司开始积极拓展国际市场。他们制定了详细的国际化战略,包括在海外市场设立分支机构、与当地企业建立合作关系、参加国际展会等。这些举措不仅提高了Dremio公司在国际市场的知名度,也为其带来了更多的商业机会。通过国际化战略的实施,Dremio公司的业务规模不断扩大,品牌影响力也日益增强。

请注意,以上故事均基于虚构,旨在展示一个类似Dremio公司在电子行业中的可能发展路径和故事。如有需要,请进一步核实相关事实和数据。

High Voltage Semiconductor Inc公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,美高测始终保持着对技术创新的执着追求。公司不断投入研发资源,探索新的测试技术和应用场景,如微电网、新能源汽车等领域的高压半导体测试。同时,美高测还积极构建开放式的创新生态体系,与众多合作伙伴共同推动行业的进步和发展。通过这些努力,美高测在高压半导体测试领域持续保持着领先地位,为电子行业的未来发展贡献着重要力量。

问答坊 | AI 解惑

MP3充电器原理与维修

MP3充电器是最易损坏的配件之一。笔者维修多款充电器后发现,它们基本上都是采用开关电源电路,电路结构大同小异。本文以市面上最常见的昕潮TJ-01型充电器为例,简述其工作原理与常见故障检修,电路见图1。工作原理 (1)开关振荡电路市电经D1~D4整 ...…

查看全部问答>

求一份关于串联和并联谐振的资料

最近在用线圈耦合做无线识别,用12M做载波,求谐振资料。 有功放或放大或滤波图的来几张,多谢。 芯片也行 xuchaoda@126.com…

查看全部问答>

标准数字电路 54-74HC全系列高速CMOS数据手册(中文

标准数字电路 54-74HC全系列高速CMOS数据手册(中文)…

查看全部问答>

变色水龙头

似乎自来水管里除了在管道生锈时才会流出红色的水,剩下便是饮料机的出水口会流出带颜色的饮料,其它情况下正常的自来水都是无色透明的。不过使用 LED Faucet Lights 便可以给家里的自来水加上颜色,不过只是在水流出时,通过 LED 灯来照明显示出颜 ...…

查看全部问答>

开关电源保护电路

摘要:为使开关电源在恶劣环境及突发故障状况下安全可靠,提出了几种实用的保护电路,并对电路的工作原理进行了详尽分析。…

查看全部问答>

如何做到长按power键唤醒系统!?

产品有了新需求:要求长按power键3秒钟,系统进入suspend状态;再长按power键3秒钟,唤醒系统。长按3s让系统suspend这个很好做,但是长按3s唤醒系统就让我郁闷了,这个似乎是控制不了,把power键设置为唤醒源之后,只要短按power键中断上来,系统就 ...…

查看全部问答>

如何使用VC实现两个GPRS之间的数据通信?

能否实现两个GPRS模块上网后点对点的信息交互? 怎样才能实现两个模块之间的通信呢?哪怕通过中转服务器也可以... 我不是通信专业的,搞不太清楚,请各位大牛帮忙,跪谢. 我的邮箱是veyou@yeah.net…

查看全部问答>

硬件仿真时怎么都进不了定时器中断

这是我写的一段测试ad转换速度的程序,但是硬件仿真时发现怎么都进不了定时器中断,换成DCO时钟源也不行,不知问题出在哪里,希望各位牛人指点,谢谢!!!! #include <msp430x14x.h> #define uint unsigned int #define uchar unsi ...…

查看全部问答>

电机控制 - AC 感应电机 (ACIM) 概述

本帖最后由 dontium 于 2015-1-23 13:14 编辑            AC 感应电机 (ACIM) 是消费电子类应用和工业应用中最受欢迎的电机,代表了工业革命的力量。   十九世纪末,Nicola Tesla 首次 ...…

查看全部问答>