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

发布者:小星星龙猫最新更新时间:2016-07-26 来源: eefocus关键字:ATPCS  ARM体系  汇编语言  c语言  参数传递 手机看文章 扫描二维码
随时随地手机看文章
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.对于位数更多的结果,需要通过调用内存来传递.

关键字:ATPCS  ARM体系  汇编语言  c语言  参数传递 引用地址:ATPCS ARM体系中汇编语言和c语言之间参数传递规则

上一篇:执行nand probe 0 提示找不到NAND flash device . 解决办法
下一篇:openocd 命令行烧写ARM裸机程序 problems and solutions

推荐阅读最新更新时间:2024-03-16 15:01

AT89C51单片机驱动液晶显示汉字C语言
此程序的完整工程文件下载:http://www.51hei.com/f/8952lkj_c.rar 上图是 原理图 及其仿真效果. /******************************************************************* AT89C51 单片机 驱动 液晶显示 汉字C语言 ****************************************************************/ #include AT89x51.h #define uchar unsigned char /************************************
[单片机]
AT89C51单片机驱动液晶显示汉字<font color='red'>C语言</font>
单片机C语言中while(1)的问题
  单片机C语言的主程序,通常要用一个while(1)语句来让程序进入一个无限循环,目的是为了让程序一直保持在我们需要运行的情况下。   虽然这种做法毋庸置疑,在网上还是有不少朋友有疑问,如果程序不加while(1)会出现什么情况,对于这种好学精神,还是值得赞扬的,做学问就需要有追根问底的精神。   首先,大家要理解一件事情,我们编写的C语言程序,最终下载到单片机当中去,在我们单片机的程序存储空间FLASH当中存储的全部是2进制数字代码。比如0x00,0x01,一直到0xff。而我们编写的C代码,依靠的是编译软件,比如keil软件,首先将C语言编译成为汇编语言,最终汇编语言变成2进制代码,也就是我们的HEX文件当中的数据,下载到单片
[单片机]
TQ2440 学习笔记—— 13、GPIO 接口【实验:用汇编语言实现】
GPIO 操作实例:LED 和 按键 1、使用汇编代码点亮一个LED 操作步骤 a、编写源程序(程序) b、生成可执行程序(Makefile) c、烧写程序(USB 下载线烧写) d、运行程序 a、编写源程序 虽然是汇编代码,但是程序很简单,就不解释啦! b、Makefile make 指令比较 第 1 行中文件led_on.bin 和文件 led_on.S 的时间,如果 led_on.S 的时间 比 led_on.bin 的时间新(led_on.bin 未生成时,此条件默认成立),则执行第2,3,4行的命令重新生成led_on.bin 。也可以不用指令make,而直接一条一条的执行2,3,
[单片机]
TQ2440 学习笔记—— 13、GPIO 接口【实验:用<font color='red'>汇编语言</font>实现】
PIC单片机C语言程序设计(15)
  本文是讲座《单片机C 语言程序设计》的结束篇,为了帮助大家更好地掌握前面所学的知识,我们将归纳性地介绍初学者用C 语言编辑PIC 单片机实用程序时应具备的思维方法和基本知识,并通过下面的实例进行一次小结,以期对大家今后深入学习PIC 单片机C 语言程序设计有所帮助。   十六、PIC单片机C语言程序的组成   一个完整的PIC 单片机C 语言源程序应包括:包含头文件、变量定义、常量说明、函数定义、主函数main( )、若干个其他功能函数、各种功能C 语句,以及已定义的函数和函数体、注释等部分组成。   说明:对PIC 单片机中级或中级以下的产品,其头文件是#include pic.h 和#include pic1687x.
[单片机]
PIC单片机<font color='red'>C语言</font>程序设计(15)
C51与汇编语言混合编程之一
1、函数内部混合编程 若想在C语言函数内部使用汇编语言,应使用以下Cx51编译器控制命令: #pragma asm ;;; Assembly code #pragma endasm 功能作用: asm和endasm命令用于将其标记的汇编程序合并到.SRC文件中。这个带有asm和endasm块标记的源程序可看作是在线嵌入式汇编程序。从这点来说,此命令有些类似于#define命令。 具体实现: (1)编译器设置及SRC文件的产生 .SRC文件在命令行编译模式下是使用SRC编译器控制命令产生的,在IDE环境中可以为需要产生SRC文件的C源文件设置特定选项: l 右键单击Project Workspace下的文件标
[单片机]
C语言函数的相关语法及其参数的了解
  1.interrupt 用于中断函数。   定义如下:   语法: interrupt void 函数名()   或者   interrupt[中断向量]void 函数名()   参数:中断函数没有参数。中断函数需要指定中断向量。   返回:中断函数一般是void,没有返回。   说明:interrupt关键字声明了在处理器发生中断时调用;函数的参数必须为空   2.monitor 使函数进入原型(atomic)操作状态。   定义如下:   语法:monitor 函数类型 函数名(参数表)   参数:该函数可以有参数,也可以没有参数。   返回:函数可以有返回,也可以没有返回。   说明:monitor关键字使得在函数执
[单片机]
<font color='red'>C语言</font>函数的相关语法及其<font color='red'>参数</font>的了解
在KEIL中实现C语言嵌套汇编语言
一、讲解背景 在单片机学习的过程中,掌握一点汇编语言是非常有必有的,作为低级语言汇编语言在单片机开发中有它不可取代的作用,比如每条指令可以精确的确定延时时间,便于理解非常适合硬件工程师学习。但是要提高单片机技能,必须掌握C 语言编程,因为C 语言有强大的模块化管理思想。我想在很多人学习的过程中即学了汇编语言,又学习了C 语言,那么一个问题便随之而产生,如果将C 语言与汇编语言相互结合,达到更好的编程效果,本次讲解就是基于这个问题而生成的。 二、操作步骤 第一步: 在KEIL 中新建工程及文件并复制以下程序并保存为C 文件: /* 功能:C 语言里嵌套汇编语言,起到抛砖引玉的作用 作者:三维电子杨荣国 日期:2010
[单片机]
在KEIL中实现<font color='red'>C语言</font>嵌套<font color='red'>汇编语言</font>
如何学习51单片机
学过51单片机的人,都知道这个学习的过程可能不是那么“美好”,所以,今天给大家介绍一些关于51单片机的学习方法。 1、我从不说51是基础,如果我这么说,也请把这句话理解为微机原理是基础。 2、对51单片机的操作本质上就是对寄存器的操作,对其他单片机也是如此。库只是一个接口,方便使用者使用而已。 3、汇编语言在工作中很少用到,了解就好。 4、51单片机的P0口很特别。 5、C语言就是C语言,51单片机就是51单片机,算法就是算法,外围电路就是外围电路,传感器就是传感器,通信器件就是通信器件,电路图就是电路图,PCB图就是PCB图,仿真就是仿真。 当你以后再也不使用51了,C语言的知识还在,算法的知识还在,搭建单片机的最小系统的技
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved