您的位置 首页 设计

ATPCS ARM系统中汇编言语和c言语之间参数传递规矩

ATPCSATPCS即ARM-THUMBprocedurecallstandard的简称。PCS规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连…

ATPCS

  ATPCS即ARM-THUMB procedure call standard的简称。

  PCS规矩了运用程序的函数能够怎么分开地写,分开地编译,最终将它们衔接在一起,所以它实际上界说了一套有关进程(函数)调用者与被调用者之间的协议。

  PCS强制完成如下约好:调用函数怎么传递参数(即压栈办法,以何种办法寄存参数),被调用函数怎么获取参数,以何种办法传递函数回来值。

  PCS的制定是一系列方针的“tradeoff(折衷)”(由于很大程度上触及体系的一些功用),如会触及生成代码的巨细,调试功用的支撑,函数调用上下文处理速度以及内存耗费。当然,经过编译器的支撑能够让生成的代码有不同的特性,如gcc编译选项能够支撑或不支撑framepointer来支撑深化调试功用或进步程序运转功用。

  PCS是体系结构密切相关的,直接触及编译器怎么运用处理器供给的运用寄存器,如编译器运用什么寄存器作为栈指针,运用哪些寄存器作直接传参等。值得注意的是,没有谁规矩说PCS是有必要这样而不是那样的。它是运用相关的。任何一个操作体系和运用能够处于它本身的考虑界说自己的PCS。当然,假如那样,也有必要有自己的编译器。而实际上,在一个处理器设计时,都会有某种假定,所以PCS某种程度上应该是相同的。

  ATPCS便是依据ARM指令集和THUMB指令集进程调用的标准。

  ATPCS概述 为了使独自编译的C言语程序和汇编程序之间能够彼此调用,有必要为子程序之间的调用规矩必定的规矩.ATPCS便是ARM程序和THUMB程序中子程序调用的根本规矩…

  一.ATPCS概述…

  ATPCS规矩了一些子程序之间调用的根本规矩.这些根本规矩包括子程序调用进程中寄存器的运用规矩,数据栈的运用规矩,参数的传递规矩.为习惯一些特定的需求,对这些根本的调用规矩进行一些修正得到几种不同的子程序调用规矩,这些特定的调用规矩包括:支撑数据栈约束查看的ATPCS.支撑只读段方位无关的ATPCS.支撑可读写段方位无关的ATPCS.支撑ARM程序和THUMB程序混合运用的ATPCS.处理浮点运算的ATPCS…

  有调用联系的一切子程序有必要恪守同一种ATPCS. 编译器或许汇编器在ELF格局的方针文件中设置相应的特点,标识用户选定的ATPCS类型.对应不同类型的ATPCS规矩,有相应的C言语库,衔接器依据用户指定的ATPCS类型衔接相应的C言语库…

  运用ADS的C言语编译器编译的C言语子程序满意用户指定的ATPCS类型. 而关于汇编言语程序来说,完全要依靠用户来确保各子程序满意选定的ATPCS类型. 具体来说,汇编言语子程序有必要满意下面三个条件: 在子程序编写时有必要恪守相应的ATPCS规矩; 数据栈的运用要恪守ATPCS规矩; 在汇编编译器中运用-apcs选项…

  二. 根本ATPCS…

  根本ATPCS规矩了在子程序调用时的一些根本规矩,包括以下三个方面的内容:各寄存器的运用规矩及其相应的姓名;数据栈的运用规矩;参数传递的规矩. 相关于其他类型的ATPCS,满意根本ATPCS的程序的履行速度更快,所占用的内存更少. 可是它不能供给以下的支撑: ARM程序和THUMB程序彼此调用; 数据以及代码的方位无关的支撑; 子程序的可重入性; 数据栈查看的支撑. 而派生的其他几种特定的ATPCS便是在根本ATPCS的基础上再增加其他的规矩而构成的.其意图便是供给上述的功用…

  寄存器的运用规矩:

  1.子程序经过寄存器R0~R3来传递参数.这时寄存器能够记作: A1~A4 , 被调用的子程序在回来前无需康复寄存器R0~R3的内容.

  2.在子程序中,运用R4~R11来保存局部变量.这时寄存器R4~R11能够记作: V1~V8 .假如在子程序中运用到V1~V8的某些寄存器,子程序进入时有必要保存这些寄存器的值,在回来前有必要康复这些寄存器的值,关于子程序中没有用到的寄存器则不用履行这些操作.在THUMB程序中,一般只能运用寄存器R4~R7来保存局部变量.

  3.寄存器R12用作子程序间scratch寄存器,记作ip; 在子程序的衔接代码段中经常会有这种运用规矩.

  4. 寄存器R13用作数据栈指针,记做SP,在子程序中寄存器R13不能用做其他用处. 寄存器SP在进入子程序时的值和退出子程序时的值有必要持平.

  5. 寄存器R14用作衔接寄存器,记作lr ; 它用于保存子程序的回来地址,假如在子程序中保存了回来地址,则R14可用作其它的用处.

  6. 寄存器R15是程序计数器,记作PC ; 它不能用作其他用处.

  7. ATPCS中的各寄存器在ARM编译器和汇编器中都是预界说的.

  参数的传递规矩.

  依据参数个数是否固定,能够将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规矩是不同的.

  1.参数个数可变的子程序参数传递规矩

  关于参数个数可变的子程序,当参数不超越4个时,能够运用寄存器R0~R3来进行参数传递,当参数超越4个时,还能够运用数据栈来传递参数. 在参数传递时,将一切参数看做是寄存在接连的内存单元中的字数据。然后,顺次将各姓名数据传送到寄存器R0,R1,R2,R3; 假如参数多于4个,将剩下的字数据传送到数据栈中,入栈的次序与参数次序相反,即最终一个字数据先入栈. 依照上面的规矩,一个浮点数参数能够经过寄存器传递,也能够经过数据栈传递,也或许一半经过寄存器传递,另一半经过数据栈传递.

  2.参数个数固定的子程序参数传递规矩

  关于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规矩不同,假如体系包括浮点运算的硬件部件,浮点参数将依照下面的规矩传递: 各个浮点参数按次序处理;为每个浮点参数分配FP寄存器;分配的办法是,满意该浮点参数需求的且编号最小的一组接连的FP寄存器.第一个整数参数经过寄存器R0~R3来传递,其他参数经过数据栈传递.

  子程序成果回来规矩

  1.成果为一个32位的整数时,能够经过寄存器R0回来.

  2.成果为一个64位整数时,能够经过R0和R1回来,依此类推.

  3.成果为一个浮点数时,能够经过浮点运算部件的寄存器f0,d0或许s0来回来. 4.成果为一个复合的浮点数时,能够经过寄存器f0-fN或许d0~dN来回来. 5.关于位数更多的成果,需求经过调用内存来传递.

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/275455.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部