zoukankan      html  css  js  c++  java
  • ATPCS规则


    title: ATPCS规则
    tags: ARM
    date: 2018-10-14 17:03:23

    ATPCS规则

    ARM指令集E004armproc.chm

    ATPCS介绍与使用.pdf

    ATPCS.pdf

    • 子程序间通过寄存器R0R3来传递参数。被调用的子程序在返回前无须恢复寄存器R0R3的内容。

    • 在子程序中,使用寄存器R4R11来保存局部变量。这时,寄存器R4R11可以记为v1v8。如果在子程序中使用了寄存器v1v8中的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。另外R9,R10和R11还有一个特殊作用,分别记为:静态基址寄存器SB,数据栈限制指针SL和桢指针FP。

    • 存器R12用作子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip(Intra-Procedure-call scratch register)。在子程序间的连接代码段中常有这种使用规则。从汇编来看就是刚进来的时候保存当前的sp,参考反汇编文档 GPIO之LED

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

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

    • 寄存器R15为程序计数器PC,不能用做其他用途。

    • 只有寄存器R0~R7,SP,LR和PC可以在Thumb状态下使用,其中R7常常作为Thumb状态的工作寄存器,记为WR。

    • 堆栈使用规则:

    • ATPCS规定堆栈为FD类型,即满递减堆栈。并且堆栈的操作是8字节对齐。

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

    • (1)、外部接口的数据栈一定是8位对齐的,也就是要保证在进入该汇编代码后,直到该汇编程序调用外部代码之间,数据栈的栈指针变化为偶数个字;

    • (2)、在汇编程序中使用PRESERVE8伪操作告诉连接器,本汇编程序是8字节对齐的.

    • 参数的传递规则:

    • 根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的.

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

    • 对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数. 在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。然后,依次将各名字数据传送到寄存器R0,R1,R2,R3; 如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈. 按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递.

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

    • 对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同,如果系统包含浮点运算的硬件部件。 浮点参数将按照下面的规则传递:

    • (1)各个浮点参数按顺序处理;

    • (2)为每个浮点参数分配FP寄存器; 分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器.第一个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递.

    • 子程序结果返回规则

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

    • 2.结果为一个64位整数时,可以通过R0和R1返回,依此类推.

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

    • 4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回.

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

  • 相关阅读:
    Leetcode Reverse Words in a String
    topcoder SRM 619 DIV2 GoodCompanyDivTwo
    topcoder SRM 618 DIV2 MovingRooksDiv2
    topcoder SRM 618 DIV2 WritingWords
    topcoder SRM 618 DIV2 LongWordsDiv2
    Zepto Code Rush 2014 A. Feed with Candy
    Zepto Code Rush 2014 B
    Codeforces Round #245 (Div. 2) B
    Codeforces Round #245 (Div. 2) A
    Codeforces Round #247 (Div. 2) B
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/10023531.html
Copyright © 2011-2022 走看看