ARM是Advanced RISCMachines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的精简指令集处理器。我们可以从三个层次理解ARM:一个公司的名字;一类微处理器的通称;一种技术的名字。ARM具有以下技术特点:ARM是一种通用的32位RISC处理器。ARM是一种功耗很低的高性能处理器。ARM是一种可扩展,可移植、可集成的处理器。......
2025-09-30
在C程序和ARM汇编程序之间相互调用时必须遵守ATPCS(ARM-Thumb Procedure Call Standard)规则。ATPCS规定了一些子程序间调用的基本规则,这些规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则。有了这些规则之后,单独编译的C语言程序就可以和汇编程序相互调用。2025年ARM公司正式推出了AAPCS(ARM Archtecture Procedure Call Standard)标准,AAPCS是ATPCS的改进版,目前AAPCS和ATPCS都是可用的标准。下面详细介绍子程序间调用的基本规则。
1.寄存器的使用规则
寄存器的使用遵守以下规则:
●子程序间通过寄存器R0~R3来传递参数。这时,寄存器R0~R3可记作a0~a3(Argument/scratch register)。被调用的子程序在返回前无需恢复寄存器R0~R3的内容。R0~R3也可以在子程序中保存局部变量。
●在子程序中,使用寄存器R4~R11来保存局部变量。这时,R4~R11可以记作v1~v8(Variable-register)。如果在子程序中使用了这些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用R4~R7来保存局部变量。
●寄存器R12(IP)用作内部过程调用中间临时寄存器,在子程序之间的连接代码段中常常有这种使用规则。
●寄存器R13(SP)用作堆栈指针,在子程序中R13不能用作其他用途。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。
●链接寄存器R14(LR)用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
●寄存器R15(PC)是程序计数器,不能用作其他用途。
2.堆栈使用规则
堆栈的使用遵守以下规则:
●AAPCS(ATPCS)规定堆栈为FD(full-descending)类型,即满递减堆栈,并且对堆栈的操作是8字节对齐。
●对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足下列条件:外部接口的堆栈必须是8字节对齐的。在汇编程序中使用PRESERVE8伪指令告诉连接器,本汇编程序数据是8字节对齐的。(https://www.chuimin.cn)
3.参数传递规则
根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变化的子程序。这两种子程序的参数传递规则是不一样的。
●对于参数个数可变的子程序,当参数个数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。
●在传递参数时,将所有参数看作是存放在连续的存储字单元的字数据。然后,依次将各字数据传递到寄存器R0,R1,R2和R3中。如果参数多于4个,则将剩余的字数据传递到堆栈中。入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。
●对于参数个数固定的子程序,例如,系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递:各个浮点参数按顺序处理;为每个浮点参数分配FP寄存器;分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器。第一个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递。
4.子程序结果返回规则
子程序的返回遵守以下规则:
●结果为一个32位整数时,可以通过寄存器R0返回。
●结果为一个64位整数时,可以通过寄存器R0和R1返回。
●结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或s0来返回。
●结果为复合型浮点数(如复数)时,可以通过寄存器f0~fn或d0~dn来返回。
●对于位数更多的结果,需要通过存储器来传递。
相关文章
 
                                
                                ARM是Advanced RISCMachines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的精简指令集处理器。我们可以从三个层次理解ARM:一个公司的名字;一类微处理器的通称;一种技术的名字。ARM具有以下技术特点:ARM是一种通用的32位RISC处理器。ARM是一种功耗很低的高性能处理器。ARM是一种可扩展,可移植、可集成的处理器。......
2025-09-30
 
                                
                                嵌入式系统设计与开发工作中,软件工作量约占全部工作量的80%,其中测试和验证部分的工作量占软件工作量的70%。图1.6嵌入式系统设计与开发流程1.需求分析分析用户的需求:产品的功能、性能、价格、体积、功耗等。嵌入式系统(实现)编程:选择硬件、操作系统、编程语言以及开发工具,编写程序。......
2025-09-30
 
                                
                                嵌入式系统的发展大致经历了嵌入式微控制器、嵌入式微处理器和嵌入式数字信号处理器、嵌入式片上系统和以Internet为标志的嵌入式系统等阶段。嵌入式系统的出现最初是基于单片机的,这一阶段的嵌入式系统硬件是单片机,软件停留在无操作系统阶段,采用汇编语言实现系统的功能。第四阶段是以Internet为标志的嵌入式系统。......
2025-09-30
 
                                
                                2.开发模式嵌入式系统本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发,这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。表1.2常用嵌入式开发工具......
2025-09-30
 
                                
                                Thumb不是一个完整的体系结构,不能指望处理器只执行Thumb指令而不支持ARM指令集。因此,Thumb指令只需要支持通用功能,必要时可以借助完善的ARM指令集。Thumb指令集与ARM指令集的区别一般有如下几点:●转指令。Thumb数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第3个寄存器中。在Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0~R7。......
2025-09-30
 
                                
                                
                                        加载/存储指令用于在寄存器和存储器之间传输数据,Load指令用于将存储器中数据传输到寄存器中,Store指令用于将寄存器中的数据保存到存储器中。例如:2.STR指令STR{cond}
2025-09-30
 
                                
                                现在高端嵌入式系统软件都在操作系统的支持下运行。嵌入式操作系统是指用于嵌入式系统的操作系统。嵌入式操作系统负责嵌入式系统的全部软、硬件资源的分配、任务调度,控制、协调并发活动。从20个世纪70年代单片机的出现到今天,嵌入式操作系统经历了发展的四个阶段。这一阶段嵌入式系统的主要特点是:操作系统的实时性得到了很大改善,已经能够运行在各种不同类型的微处理器上,具有高度的模块化特点和扩展性。......
2025-09-30
 
                                
                                具体来说,嵌入式系统是以应用为中心、计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。可以这样认为,嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。表1.1对比了通用计算机系统与嵌入式系统。......
2025-09-30
相关推荐