您的位置:首页 > 编程语言

tiny6410裸机实验第1章--------------ARM汇编和编程基础(ATPCS 简介)

2014-02-21 21:56 447 查看
【说明】

              前面提到,我们大部分时候用C编程,但是,我们程序是开始一小段是用汇编写的,那么如何将汇编语言和C语言结合起来使用呢,也就是说,汇编执行到一半如何调用C语言的函数呢,如何传递参数呢,真其实要要按照一定的规则来,由于汇编的过程调用不像C语言后面直接扔参数就可以了,汇编只不过是普通的bl跳转,那么参数放哪?
返回值放哪?
这个规则就是ATPCS。

       

【ATPCS概述】

              ATPCS即ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)的简称,规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。 这些基本规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则.

【寄存器的使用规则】

        1】子程序通过寄存器R0-R3传递参数,且规定被调用的子程序在返回前无需恢复寄存器R0-R3

        2】在子程序中,使用R4-R11来保存局部变量的值,在返回前必须恢复他们。

        3】寄存器R12用作子程序间scratch寄存器,记为IP。

        4】寄存器R13用作数据栈指针SP, 在子程序中寄存器R13不能用作其他用途,SP在进入子程序时和退出子程序时一定要一样。

        5】寄存器R14作为连接寄存器 LR,他用来保存子程序的返回地址,如果在子程序中保存了返回地址,则R14可以用作其他地方。

        6】寄存器R15是程序计数器PC,不能做其他用

【数据栈的使用规则】

                  1】栈指针指向栈顶元素,称为FULL栈

                  2】数据栈向内存地址减小的地方增长

                  3】入栈操作先减栈指针,再写入数据,出栈先读出数据,再加栈指针

                  4】栈操作应8字节对齐

【参数的传递规则】

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

               1)如果可变参数不超过4个,可以用寄存器R0-R3进行参数传递

              2)当可变参数超过4个,将超过4个的部分入栈,且入栈顺序和参数顺序相反,一个浮点数参数可能存在一半在寄存器一半子栈中的情况

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

              1)和上边主要是浮点数不同,如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递:各个浮点参数按顺序处理;为每个浮点参
数分配FP寄存 器;分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器.第一个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递.

【子程序结果返回规则】

          1】如果结果是一个32位整数,用R0返回

          2】如果结果是一个64位整数,用R0和R1返回,以此类推

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

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

          5】对于位数更多的结果,需要通过调用内存来传递.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 嵌入式 汇编