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】对于位数更多的结果,需要通过调用内存来传递.
前面提到,我们大部分时候用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 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死
- linux下设定环境变量
- Linux下修改MySQL编码的方法
- Linux串口通信
- 从Windows系统下访问Linux分区相关软件