历史上的今天
返回首页

历史上的今天

今天是:2025年04月26日(星期六)

2019年04月26日 | ARM汇编编程规则

2019-04-26 来源:eefocus

1. 基本概念

   • ATPCS (ARM-Thumb Procedure Call Standard)

    规定了一些子程序间调用的基本规则,这些规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则。有了这些规则之后,单独编译的C语言程序就可以和汇编程序相互调用。
    使用ADS的c语言编译器编译的C语言子程序满足用户指定的ATPCS类型。而对于汇编语言来说,则需要用户来保证各个子程序满足ATPCS的要求。


   • AAPCS (ARM Archtecture Procedure Call Standard)

     2007年ARM公司正式推出了AAPCS标准,AAPCS是ATPCS的改进版,目前, AAPCS和ATPCS都是可用的标准。


2. 寄存器使用规则

    • 子程序间通过寄存器R0~R3来传递参数。这时,寄存器R0~R3可记作a0~a3。被调用的子程序在返回前无需恢复寄存器R0~R3的内容。


    • 在子程序中,使用寄存器R4~R11来保存局部变量。这时,寄存器R4~R11可以记作v1~v8。如果在子程序中使用了寄存器v1~v8中的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。


   • 寄存器R12用作过程调用中间临时寄存器,记作IP。在子程序之间的连接代码段中常常有这种使用规则。


   • 寄存器R13用作堆栈指针,记作SP。在子程序中寄存器R13不能用作其他用途。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。


   • 寄存器R14称为连接寄存器,记作LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。


   • 寄存器R15是程序计数器,记作PC。它不能用作其它用途。


3. 堆栈使用规则


   • ATPCS规定堆栈为FD(Full Descending: sp指向最后一个压入的值,数据栈由高地址向低地址生长)类型,即满递减堆栈,并且对堆栈的操作是8字节对齐。所以经常使用的指令就有STMFD和LDMFD。


   •对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足下列条件:

   (1)外部接口的堆栈必须是8字节对齐的。   

   (2)在汇编程序中使用PRESERVE8伪指令告诉连接器,本汇编程序数据是8字节对齐的。


4. 参数传递规则


    • 根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变化的子程序。


    • 这两种子程序的参数传递规则是不一样的。

4.1 参数个数可变子程序参数传递规则 


    • 对于参数个数可变的子程序,当参数个数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。


    • 在传递参数时,将所有参数看作是存放在连续的内存字单元的字数据。然后,依次将各字数据传递到寄存器R0,R1,R2和R3中。如果参数多于4个,则将剩余的字数据传递到堆栈中。入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。


4.2 参数个数固定子程序参数传递规则


    • 如果系统不包含浮点运算的硬件部件,浮点参数会通过相应的规则转换成整数参数(若没有浮点参数,此步省略),然后依次将各字数据传送到寄存器R0~R3中。如果参数多于4个,将剩余的字数据传送堆栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。在参数传递时,将所有参数看作是存放在连续的内存字单元的字数据。


5. 子程序结果返回规则

    子程序中结果返回的规则如下:

    • 结果为一个32位整数时,可以通过寄存器R0返回;

    • 结果为一个64位整数时,可以通过寄存器R0和R1返回;

    • 结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或s0来返回;

    • 结果为复合型浮点数(如复数)时,可以通过寄存器f0~fn或d0~dn来返回;

    • 对于位数更多的结果,需要通过内存来传递。


推荐阅读

史海拾趣

Alpha Industries公司的发展小趣事

Alpha Industries一直致力于面料的研发与创新。近年来,公司借助电子技术的支持,成功研发出一种智能面料。这种面料具有自动调节温度、防水透气等功能,为士兵提供更为舒适的穿着体验。智能面料的研发不仅提升了Alpha Industries产品的科技含量,也进一步巩固了其在军事服装领域的领先地位。

Atmel (Microchip)公司的发展小趣事

Atmel公司自1984年成立以来,便专注于微控制器及相关技术的研发。在创业初期,公司凭借其深厚的技术积累,成功开发出了基于8051内核的8位元Flash微控制器,这在当时是一个重大的技术突破。这一产品的推出,不仅奠定了Atmel在微控制器领域的地位,也为公司的后续发展奠定了坚实的基础。

E-Mark Inc公司的发展小趣事

GHI公司一直致力于提升产品品质和安全性。为了进入欧洲高端市场,GHI公司决定对其核心产品进行E-Mark认证。在认证过程中,GHI公司不断完善质量管理体系,提升生产工艺水平,确保产品质量的稳定性和可靠性。最终,GHI公司的产品成功获得了E-Mark认证,并在欧洲市场获得了良好的口碑和市场份额。

Focus公司的发展小趣事

Focus科技股份有限公司(虚构)在深耕外贸电商领域的同时,也敏锐地捕捉到了教育与医疗行业的数字化转型机遇。公司利用自身在互联网技术和大数据分析方面的优势,研发了智慧教育平台和移动医疗应用。智慧教育平台通过提供个性化学习资源和在线互动教学服务,有效提升了教育资源的利用率和学生的学习效果;移动医疗应用则通过远程医疗咨询、健康管理等功能,为用户提供了便捷的医疗服务体验。这些跨界融合的产品不仅丰富了公司的业务线,也进一步提升了公司的品牌影响力和市场竞争力。

FORYARD公司的发展小趣事

在快速发展的同时,FORYARD始终不忘企业的社会责任和可持续发展目标。公司积极推广绿色生产和环保理念,采用环保材料和节能技术降低生产过程中的碳排放和资源消耗。此外,FORYARD还积极参与社会公益事业和慈善活动,为贫困地区的教育和医疗事业贡献力量。这些举措不仅提升了公司的社会形象和品牌价值,也为实现可持续发展目标做出了积极贡献。

Hirose Electric公司的发展小趣事

在20世纪80年代初,FORYARD公司由一群电子工程师在硅谷创立。起初,公司专注于研发高性能的半导体芯片,但面临激烈的市场竞争和技术壁垒。为了突破重围,FORYARD决定聚焦于低功耗、高集成度的微控制器(MCU)领域。经过数年的潜心研发,公司成功推出了一款具有革命性创新的MCU产品,凭借其出色的性能和价格优势,迅速在智能家居和可穿戴设备市场占据一席之地。这一成功不仅为公司赢得了市场认可,也为后续的技术创新和业务拓展奠定了坚实基础。

问答坊 | AI 解惑

红外报警

本帖最后由 paulhyde 于 2014-9-15 09:00 编辑 希望对大家应该有用吧。。。  …

查看全部问答>

PB中release目录下postproc子目录的意义?

请问谁知道PBWorkspaces的工程目录下,release\\postproc子目录的含义?为什么包含和上一级目录同样的.bib,.reg配置文件?…

查看全部问答>

请教:

各路高手:     微软说CETK命令行测试,编辑命令 + “-x “参数\" ”  如:tux -o -d fsdtst -x5022,5027,     表示只测试5022和5027这两个case     我现在弄不明白“5022”和“5027”分别指的是什么 ...…

查看全部问答>

请教专家:如何在.net2003种的C#里调用WinCE生成的DLL,谢谢!

我用的S3C2440开发板,在WinCE5.0中编译了成功,并且导出了针对S3C2440的SDK,该SDK安装成功后,在.net2003的模拟 工具-〉选项-〉设备工具-〉设备 中看不见S3C2440设备,请问是什么原因; 另外,我在C#中调用WinCE编译生成的DLL,在模拟器上运行时 ...…

查看全部问答>

413控制485

谁有413的TIMER-A控制485的例程。…

查看全部问答>

[职场攻略]大学生怎么对待第一份工作

眼下,刚走出大学校园一个月的大学生,有的已 经顺利地走上了工作岗位,开始了自己的职业生涯;而有的还奔波于人才中心或是守候在电脑前关注网络上的招聘信息。对于毕业后的第一份工作,是满意还是失 望,或是有更多的期待?大学生如何看待自己的第 ...…

查看全部问答>

定时器和中断怎么关不掉啊

请问各位前辈       我想产生两相相位差90度的PWM,在中断中关掉定时器    我用了CCIE=0 ,TACCTL0 &= ~CCIE; 也不起作用 输出的波形 是同相位的 不知道为什么 请各位前辈指教     &nb ...…

查看全部问答>

【设计工具】Xilinx FPGA的Fast Startup

Xilinx FPGA的Fast Startup 在众多当代应用中,嵌入式系统必须满足极其苛刻的时序要求。其中之一就是启动时间——即上电后电子系统进入可操作状态所需要的时间。PCI Express®产品或汽车应用中基于CAN的电子控制单元(ECU)就是具有 ...…

查看全部问答>

电阻温漂问题

电阻的温度系数 ppm/℃   百万分之一,  也就是每摄氏度变化百万分之几,比如:20ppm/℃  就是当温度 变化1摄氏度时,阻值变化为原阻值乘以百万分之20 。 网上资料如下: 电阻温度系数(TCR)表示电阻当温度改变1 ...…

查看全部问答>

求助 AT45DB 跨页读写

我现在在AT45DB一整页上读写没问题,但跨页读写出现问题,读用的是E8H这条命令,这条命令在datasheet中描述说可以跨页读,但我读出来都是乱码,请用过的大侠指点一下~ …

查看全部问答>