版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ATPCS寄存器的使用寄存器 R1R2 R4 R8 ATPCS名称a1 v5 LR在子程序中,使用寄存器R4~R11来保存局部变量。这时,寄存器R4~R11可以记为v1~v8。如果在子程序中使用了寄存器v1~v8中的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。另外R9,R10和R11还有 个特殊作用,分别记为:静态基址寄存器SB,数据栈限制指针SL和桢指针FP。寄存器R12用做过程调用中间临时寄存器IP。寄存器R13用做堆栈指针SP。在子程序中寄存器R13不能用做其它用途。寄存器SP在进入子程序时的值和子程序的值必须相等。寄存器R14称为寄存器LR,它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用做其他用途。寄存器R15为程序计数器PC,不能用做其他用途。只有寄存器R0~R7,SP,LR和PC可以在Thumb状态下使用,其中R7常常作为Thumb状态的工作寄存器,记为WR。数据栈使用规则:满降序栈(FD),且8字节关于PCS与ATPCS的点介2008-09-01本文来自网络,稍作 点编辑如果读者使用的是ADS1.2编译器,那么ATPCS.pdf文档就在X:\ProgramFiles\ARM\ADSv12\PDF\specs 面。(X:\指的是ADS1.2编译器所在的安装盘)什么是PCS,什么是PCS即ProcedureCallStandard(过程调用规范),ATPCS即ARM-THUMBprocedurecallstandardPCS规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在起,所以它实际上定义了套有关过程(函数)调用者与被调用者之间的协议。PCS强制实现如下约定:调用函数如何传递参数(即压栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。PCS的制订是系列指标的“tradeoff(折衷)”(因为很大程度上涉及系统的 些性能),如会涉及生成代码的大小,调试功能的支持,函数调用上下文处理速度以及内存消耗。当然,通过编译器的支持可以让生成的代码有不同的特性,如gcc编译选项可以支持或不支持framepointer来支持深入调试功能或提高程序运行性能。PCS是体系结构密切相关的,直接涉及编译器如何使用处理器提供的应用寄存器,如编译器使用什么寄存器作为栈指针,利用哪些寄存器作直接传参等。值得注意的是,没有谁规定说PCS是必须这样而不是那样的。它是应用相关的。任何个操作系统和应用可以处于它自身的考虑定义自己的PCS。当然,如果那样,也必须有自己的编译器。而实际上,在个处理器设计时,都会有某种假设,所以PCS某种程度上应该是样的。ATPCS寄存器的使用规则:寄存器 R2 ATPCS名称 a1a2 v5 子程序间通过寄存器R0~R3来传递参数。被调用的子程序在返回前无须恢复寄存器R0~R3的内容在子 寄存器R4~R11来保存局部变量。这时,寄存器R4~R11可以记为v1~v8。如果在子程序中使用了寄存器v1~v8中的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。另外R9,R10和R11还有 个特殊作用,分别记为:静态基址寄存器SB,数据栈限制指针SL和桢指针FP。寄存器R12用做过程调用中间临时寄存器IP。寄存器R13用做堆栈指针SP。在子程序中寄存器R13不能用做其它用途。寄存器SP在进入子程序时的值和子程序的值必须相等。寄存器R14称为寄存器LR,它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用做其他用途。寄存器R15为程序计数器PC,不能用做其他用途。只有寄存器R0~R7,SP,LR和PC可以在Thumb状态下使用,其中R7常常作为Thumb状态的工作寄存器,记为WR。数据栈使用规则:满降序栈(FD),且8字节对齐。关于PCS与ATPCS的 点介绍2008-09-0122:21:50本文来自网络 稍作 点编辑如果读者使用的是ADS1.2编译器,那么ATPCS.pdf文档就在X:\ProgramFiles\ARM\ADSv12\PDF\specs 什么是PCS,什么是PCS即ProcedureCallStandard(过程调用规范),ATPCS即ARM-THUMBprocedurecallstandardPCS规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在 起,所以它实际上定义了 套有关过程(函数)调用者与被调用者之间的协议。PCS强制实现如下约定:调用函数如何传递参数(即压栈方法,参数),被调用函数如何获取参数,以何种方式传递函数返回值。PCS的制订 系列指的“tradeoff(折衷)”(因为很大程度上涉及系统的 些性能),如会涉及生成代码的大小,调试功能的支持,函数调用上下文处理速度以及内存消耗。当然,通过编译器的支持可以让生成的代码有不同的特性,如gcc编译选项可以支持或不支持framepointer来支持深入调试功能或提高程序运行性能。PCS是体系结构密切相关的,直接涉及编译器如何使用处理器提供的应用寄存器,如编译器使用什么寄存器作为栈指针,利用哪些寄存器作直接传参等。值得注意的是,没有谁规定说PCS是必须这样而不是那样的。它是应用相关的。任何个操作系统和应用可以处于它自身的考虑定义自己的PCS。当然,如果那样,也必须有自己的编译器。而实际上,在个处理器设计时,都会有某种假设,所以PCS某种程度上应该是样的。寄存器的使用必须满足下面的规则子程序间通过寄存器R0R3来传递参数,这时,寄存器R0R3可以记作A1-A4。被调用的子程序在返回前无复寄存器R0-R3的内在子程序中,使用寄存器R4R11来保存局部变量.这时,寄存器R4-R11可以记作V1-V8。如果在子程序中使用到了寄存器V1-V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。在Thumb程序中,通常只能使用寄存器R4-R7来保存局部变量。寄存器R12用作子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip。在序间的连接代码段中常有这种使用规寄存器R13用作数据栈指针,记作sp。在子程序中寄存器R13不能用作其他用途。寄存器sp在进入子程值和子程序时的值必须相等寄存器R14称为连接寄存器,记作lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄器R14则可以用作其他用寄存器R15是程序计数器,记作pc。它不能用作其ATPCS规则(2008-10-2116:04:14):atpcsarm杂 分类:嵌入式基本基本ATPCS规定了在子程序调用时的些基本规则,包括以下三个方面的内容:各寄存器的使用规则及其相应的名字;数据栈的使用规则;参数传递的规则.相对于其他类型的ATPCS,满足基本ATPCS的程序的执行速度更快,所占用的内存更少.但是它不能提供以下的支持:ARM程序和THUMB程序相用;数据以及代码的位置无关的支持;子程序的可重入性;数据栈检查的支持.而派生的其他几种特定的ATPCS就是在基本ATPCS的基础上再添加其他的规则而形成的.其目的就是提供上述的功能...寄存器的使用规子程序通过寄存器R0~R3来传递参数.这时寄存器可以记作:A0~A3,被调用的子程序在返恢复寄存器R0~R3的内容.在子程序中,使用R4~R11来保存局部变量,这时寄存器R4~R11可以记作:V1~V8.如果在子程序中使用到V1~V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作.在THUMB程序中,通常只能使用寄存器R4~R7来保存局部变量.寄存器R12用作子程序间scratch寄存器,记作ip;在子程序的连接代码段中经常会有这种使用寄存器R13用作数据栈指针,记做SP,在子程序中寄存器R13不能用做其他用途.寄存器SP在进时的值和子程序时的值必须相等寄存器R14用作连接寄存器,记作lr;它用于保存子程序的返回地址,如果在子程序中保存了返回地址则R14可用作其它的用途寄存器R15是程序计数器,记作PC;它不能用作其他ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的数据栈的使用规栈指针通常可以指向不同的位置.当栈指针指向栈顶元素(即最后个入栈的数据元素)时,称为FULL栈.当栈指针指向与栈顶元素相邻的个元素时,称为Empty栈.数据栈的增长方向也可以不同.当数据栈向内存减小的地址方向增长时,称为Descending栈;当数据栈向着内存地址增加的方向增长时,称为Ascending栈.综合这两种特点可以由以下4种数据栈:FDEDFAEA.ATPCS规定数据栈为FD类型,并对数据栈的操作是8字节对齐的,下面是个数据栈的示例及相关的名词.数据栈栈指针.stackpointer指向最后个写入栈的数据的内存地址数据栈的址.stackbase是指数据栈的最高地址.由于ATPCS中的数据栈是FD类型的,实际上数栈中最早入栈数据占据的内存单元是址的下个内存单元数据栈界限.stacklimit是指数据栈中可以使用的最低的内存单元地址寄存器的使用规则:寄存器的使用必须满足下面的规则序间通过寄存器R0R3来传递参数,这时,寄存器R0R3可以记作A1-A4。被调用的序在返回前无需恢复寄存器R0-R3的内容。在序中,使用寄存器R4R11来保存局部变量.这时,寄存器R4-R11可以记作V1-V8。如果在序中使用到了寄存器V1-V8中的某些寄存器,序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于序中没有用到的寄存器则不必进行这些操作。在Thumb只能使用寄存器R4-R7来保存局部变量。寄存器R12用作序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip。在序间的连接代码段中常有这种使用规则。寄存器R13用作数据栈指针,记作sp。在序中寄存器R13不能用作其他用途。寄存器sp在进入序时的值和 序时的值必须相等。寄存器R14称为连接寄存器,记作lr。它用于保存序的返回地址。如果在序中保存了返回地址,寄存器R14则可以用作其他用途。寄存器R15是程序计数器,记作pc。它不能用作其他用途。ATPCS规则(2008-10-2116:04:14):atpcsarm杂谈 分类:嵌入式ARM基本ATPCS...基本ATPCS规定了在序调用时的 些基本规则,包括以下三个方面的内容:各寄存器的使用规则及其相应的名字;数据栈的使用规则;参数传递的规则.相对于其他类型的ATPCS,满足基本ATPCS的程序的执行速度更快,所占用的内存更少.但是它不能提供以下的支持:ARM程序和THUMB程序相用;数据以及代码的位置无关的支持;序的可重入性;数据栈检查的支持.而派生的其他几种特定的ATPCS就是在基本ATPCS的基础上再添加其他的规则而形成的.其目的就是提供上述的功能...寄存器的使用规则:序通过寄存器R0~R3来传递参数.这时寄存器可以记作:A0~A3,被调用的序在返回前无需恢复寄存器R0~R3的内容.在序中,使用R4~R11来保存局部变量,这时寄存器R4~R11可以记作:V1~V8.如果在序中使用到V1~V8的某些寄存器,序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于序中没有用到的寄存器则不必执行这些操作.在THUMB程序中,通常只能使用寄存器R4~R7来保存局部变量.寄存器R12用 atch寄存器,记作ip;在序的连接代码段中经常会有这种使用规则寄存器R13用作数据栈指针,记做SP,在序中寄存器R13不能用做其他用途.寄存器SP在进入序时的值和 序时的值必须相等.寄存器R14用作连接寄存器,记作lr;它用于保存序的返回地址,如果在序中保存了返回地址,则R14可用作其它的用途.寄存器R15是程序计数器,记作PC;它不能用作其他用途.ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的.数据栈的使用规则栈指针通常可以指向不同的位置.当栈指入栈的数据元素)时,称为FULL栈.当栈指针指向与栈顶元素相邻的个元素时,称为Empty栈.数据栈的增长方向也可以不同.当数据栈向内存减小的地址方向增长时,称为Descending栈;当数据栈向着内存地址增加的方向增长时,称为Ascending栈.综合这两种特点可以由以下4种数据栈:FDEDFAEA.ATPCS规定数据栈为FD类型,并对数据栈的操作是8字节对齐的,下面是个数据栈的示例及相关的名词.数据栈栈指针.stackpointer指向最后个写入栈的数据的内存地址数据栈的址.stackbase是指数据栈的最高地址.由于ATPCS中的数据栈是FD类型的,实际上数据栈中最早入栈数据占据的内存单元是址的下个内存单元.数据栈界限.stacklimit是指数据栈中可以使用的最低的内存单元地址已占用的数据栈.usedstack是指数据栈的址和数据栈栈指针之间的区域.其中包括数据栈栈指对应的内存单数据栈中的数据帧 是指在数据栈中,为序分配的用来保存寄存器和局部变量的域异常中断的处理程序可以使用被中断程序的数据栈,这时用户要保证中断的程序数据栈足够大 使用ADS译器产生的目标代码中包含了DRFAT2格式的数据帧.在调试过程中,调试器可以使用这些数据帧来查看数据相关信息.而对于汇编语言来说,用户必须使用FRAME伪操作来描述数据栈中的数据帧.ARM汇编器根据这些伪操作在目标文件中产生相应的DRFAT2格式的数据帧.在ARMv5TE中,批量传送指令LDRD/STRD要求数据栈是8字节对齐的,以提高数据的传送速度.用ADS编译器产生的目标文件中,外部接口的数据栈都是8字节对齐的,并且编译器将告诉连接器:本目标文件中的数据栈是8字节对齐的.而对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足以下条件:外部接口的数据栈 定是位对齐的,也就是要保证在进入该汇编代码后,直到该汇编程序调用外部代码之间,数据栈的栈指针变化为偶数个字;在汇编程序中使用PRESERVE8伪操作告诉连接器,本汇编程序是8字节对齐的.参数的传递规则根据参数个数是否固定,可以将序分为参数个数固定的序和参数个数可变的序.这 程的参数传递规则是不同的参数个数可变的序参数传递规对于参数个数可变的序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数.在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。然后,依次将各名字数据传送到寄存器R0,R1,R2,R3;如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后个字数据先入栈.按照上面的规则 个浮点数参数可以通过寄存器传递,也可以通过数据传递,也可 半通过寄存器传递, 半通过数据栈传递参数个数固定的序参数传递规对于参数个数固定的序,参数传递与参数个数可变的序参数传递规则不同,如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递:各个浮点参数按顺序处理;为每个浮点参数分配FP寄存器;分配的方法是,满足该浮点参数需要的且编号最小的组连续的FP寄存器.第个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递.序结果返回结果 个32位的整数时,可以通过寄存器R0返回结果 个64位整数时,可以通过R0和R1返回,依此类推结果 个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回结果 个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回对于位数的结果,需要通过调用内存来传递三.几种特定的A.支持数据栈限制检查的如果在程序设计期间能够准确地计算出程序所需的内存总量,就不需要进行数据栈的检查,但是在通常情况下这是很难做到的,这时需要进行数据栈的检查.在进行数据栈的检查时,使用寄存器R10作为数据栈限制指针,这时寄存器R10又记作sl.用户在程序中不能控制该寄存器.具体来说,支持数据栈限制的ATPCS要满足下面的规则:在已经占有的栈的最低地址和sl之间必须有256字节的空间,也就是说,sl所指的内存地址必须比已经占用的栈的最低地址低256个字节.当中断处理程序可以使用用户的数据栈时,在已经占用的栈的最低地址和sl之间除了必须保留的256个字节的内存单元外,还必须为中断处理预留足够的内存空间;用户在程序中不能修改sl的值;数据栈栈指针sp的值必须不小于sl的值.与支持数据栈限制检查的ATPCS相关的编译/汇编选项有下面几种:选项 指示编译器生成的代码遵支持数据栈限制检查的ATPCS,用户在程序设计期间不能够准确计算程序所需的数据栈大小时,需要指定该选项;选/noswst指示编译器生成的代码不支持数据栈限制检查的功能,用户在程序设计期间能够准确计算出程序所需的数据栈大小,可以指定该选项,这个选项是默认的;选项/SWSTNA如果汇编程序对于是否进行数据栈检查无所谓,而与该汇编程序连接的其他程序指定了选项swst/noswst,这时使用该选项.已占用的数据栈.usedstack是指数据栈的址和数据栈栈指针之间的区域.其中包括数据栈栈指针对应的内存单元.数据栈中的数据帧(stackframes)是指在数据栈中,为序分配的用来保存寄存器和局部变量的域异常中断的处理程序可以使用被中断程序的数据栈,这时用户要保证中断的程序数据栈足够大.使用ADS译器产生的目标代码中包含了DRFAT2格式的数据帧.在调试过程中,调试器可以使用这些数据帧来查看数据栈中的相关信息.而对于汇编语言来说,用户必须使用FRAME伪操作来描述数据栈中的数据帧.ARM汇编器根据这些伪操作在目标文件中产生相应的DRFAT2格式的数据帧.在ARMv5TE中,批量传送指令LDRD/STRD要求数据栈是8字节对齐的,以提高数据的传送速度.用ADS编译器产生的目标文件中,外部接口的数据栈都是8字节对齐的,并且编译器将告诉连接器:本目标文件中的数据栈是8字节对齐的.而对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足以下条件:外部接口的数据栈 定是位对齐的,也就是要保证在进入该汇编代码后,直到该汇编程序调用外部代码之间,数据栈的栈指针变化为偶数个字;在汇编程序中使用PRESERVE8伪操作告诉连接器,本汇编程序是8字节对齐的.参数的传递规则根据参数个数是否固定,可以将序分为参数个数固定的序和参数个数可变的 的参数传递规则是不同的.参数个数可变的序参数传递规对于参数个数可变的序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数.在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。然后,依次将各名字数据传送到寄存器R0,R1,R2,R3;如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后 个字数据先入栈.按照上面的规则, 个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能 半通过寄存器传递,另 半通过数据栈传递.参数个数固定的序参数传递规对定的序,参数传递与参数个数可变的序参数传递规则不同,如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递:各个浮点参数按顺序处理;为每个浮点参数分配FP寄存器;分配的方法是,满足该浮点参数需要的且编号最小的 组连续的FP寄存器.第 个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递.规则结果 个32位的整数时,可以通过寄存器R0返回结果 个64位整数时,可以通过R0和R1返回,依此类推结果 个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回结果 个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回对于位数的结果,需要通过调用内存来传递.三.几种特定的ATPCS...A.支持数据栈限制检查的如果在程序设计期间能够准确地计算出程序所需的内存总量,就不需要进行数据栈的检查,但是在通常情况下这是很难做到的,这时需要进行数据栈的检查.在进行数据栈的检查时,使用寄存器R10作为数据栈限制指针,这时寄存器R10又记作sl.用户在程序中不能控制该寄存器.具体来说,支持数据栈限制的ATPCS要满足下面的规则:在已经占有的栈的最低地址和sl之间必须有256字节的空间,也就是说,sl所指的内存地址必须比已经占用的栈的最低地址低256个字节.当中断处理程序可以使用用户的数据栈时,在已经占用的栈的最低地址和sl之间除了必须保留的256个字节的内存单元外,还必须为中断处理预留足够的内存空间;用户在程序中不能修改sl的值;数据栈栈指针sp的值必须不小于sl的值.与支持数据栈限制检查的ATPCS相关的编译/汇编选项有下面几种:选项/SWST指示编译器生成的代码遵守支持数据栈限制检查的ATPCS,用户在程序设计期间不能够准确计算程序所需的数据栈大小时,需要指定该选项;选项/noswst指示编译器生成的代码不支持数据栈限制检查的功能,用户在程序设计期间能够准确计算出程序所需的数据栈大小,可以指定该选项,这个选项是默认的;选项/SWSTNA如果汇编程序对于是否进行数据栈检查无所谓,而与该汇编程序连接的其他程序指定了选项swst/noswst,这时使用该选项.编写遵守支持数据栈限制检查的ATPCS的汇编语言程对于C程序和C++程序来说,如果在编译时指定了选项SWST,生成的目标代码将遵守支持数据栈限制检查的ATPCS.对于汇编语言程序来说,如果要遵守支持数据栈限制检查的ATPCS,用户在编写程序时必须满足支持数据栈限制检查的ATPCS所要求的规则,然后指定选项SWST,下面介绍用户编写汇编语言程序时的些要求.叶子序是指不调用别的程序的序数据栈小于256字节的叶子序不许要进行数据栈检查,如果几个序组合起来构成的叶子序数据栈也小于256字节,这个规则同样适用;数据栈小于256字节的非叶子序可以使用下面的代码段来进行数据栈检查.ARM程序使用:SUBsp,sp,#size;#size为sp和sl之间必须保留的空间大CMPBLLOARMstackTHUMB程序使用:ADDsp,#-size;#size为sp和sl之间必须保留的空间大CMPBLLOTHUMBstack数据栈大于256字节的序,为了保证sp的值不小于数据栈可用的内存单元最小的地址值,需要引入相的寄存器.ARM程序使用下列代码 THUMB程序使用下列代码:LDRwr,#-支持只读段位置无关的ATPCS...支持ARM程序和THUMB程序混合使用的
CMPBLLOARMstackCMPBLLOTHUMBstack在编译或汇编时,使用/intework告诉编译器或汇编器生成的目标代码遵守支持ARM程序和THUMB程序用的ATPCS,它用在以下场合:程序中存在ARM程序调用THUMB程序的情况;程序中存在THUMB程序调用ARM程序的情况需要连接器来进行ARM状态和THUMB状态切换的情况;.在下述情况下使用选项nointerwork:程序中不包含THUMB程序;用户自己进行ARM程序和THUMB程序切换.需要注意的是:在同 个C/C++程序中不能同时有ARM指令和THUMB指令.处理浮点运算的ATPCS规则1(2008-10-2115:56:12):atpcs规则杂 分类:嵌入式参数传递规参数不超过4个时,可以使用寄存器R0~R3来传递参数,当参数超过4个时,还可以使用数据栈来传递参数。结果 个32位整数时,可以通过寄存器R0返结果 个64位整数时,可以通过寄存器R0和R1返回,依次类推汇编程序、C程序及C++程序 C程序调用汇编程序汇编程序的设置要遵循ATPCS规则,保证程序调用时参数的正确传递在汇编程序中使用EXPORT伪指令本序,使其它程序可以调用 在 语言程序中使用 关键字外部函数(要调用的汇编序),即可调用此汇编序调用汇编的C函数: 对序和C++程序来说,如果在编译时指定了选项SWST,生成的目标代码将遵守支持数据栈限制检查的ATPCS.对于汇编语言程序来说,如果要遵守支持数据栈限制检查的ATPCS,用户在编写程序时必须满足支持数据栈限制检查的ATPCS所要求的规则,然后指定选项SWST,下面介绍用户编写汇编语言程序时的些要求.叶子序是指不调用别的程序的序数据栈小于256字节的叶子序不许要进行数据栈检查,如果几个序组合起来构成的叶子序数据栈也小于256字节,这个规则同样适用;数据栈小于256字节的非叶子序可以使用下面的代码段来进行数据栈检查.ARM程序使用:SUBsp,sp,#size;#size为sp和sl之间必须保留的空间大小CMPsp,sl; ARMstackTHUMB程序使用:ADDsp,#-size;#size为sp和sl之间必须保留的空间大CMP THUMBstack数据栈大于256字节的 证sp的值不小于数据栈可用的内存单元最小的地址值,需要引入相应的寄存器.ARM程序使用下列代码:SUBTHUMB程序使用下列代码:LDRwr,#-支持只读段位置无关的ATPCS...支持ARM程序和THUMB程序混合使用的
CMP ARMstackADDwr,sp;CMP THUMBstack在编译或汇编时,使用/intework告诉编译器或汇编器生成的目标代码遵守支持ARM程序和THUMB程序混合使用的ATPCS,它用在以下场合:程序中存在ARM程序调用THUMB程序的情况;程序中存在THUMB程序调用ARM程序的情况;需要连接器来进行ARM状态和THUMB状态切换的情况;.在下述情况下使用选项nointerwork:程序中不包含THUMB行ARM程序和THUMB程序切换.需要注意的是:在同 个C/C++指令和THUMB指令.处理浮点运算的ATPCS规则1(2008-10-2115:56:12):atpcs规则杂 分类:嵌入式参数传递规参数不超过4个时,可以使用寄存器R0~R3来传递参数,当参数超过4个时,还可以使用数据栈来传递参数。结果为 个32位整数时,可以通过寄存器R0返回结果为 个64位整数时,可以通过寄存器R0和R1返回,依次类推。汇编程序、C程序及C++程序相用C程序调用汇编程序汇编遵循ATPCS规则,保证程序调用时参数的正确传递在汇编程序中使用EXPORT伪指令本序,使其它程序可以调用此序在C语言程序中使用extern关键字外部函数(要调用的汇编序),即可调用此汇编序调用汇编的C函数:示例#externvoidstrcopy(char*d,constchar*s)//外部函数,即要调用的汇 int{constchar*srcstr=“Firststring-source”;//定义字符chardstsrt[]=“Secondstring-destination”;//定义字符串变量printf(“Beforecopying:\n”);printf(“’%s’\n‘%s\n,”srcstr,dststr);//显示源字符串和目标字符串的内容strcopy(dststr,srcstr);//调用汇编序,R0=dststr,R1=srcstrprintf(“Aftercopying:\n”)printf(“’%s’\n‘%s\n,”srcstr,dststr);//显示 字符串结}被调用汇编序AREAEXPORTstrcopy;汇编程序strcopy,以便外部程序strcopy ;R0为目标字符串的地址;R1为源字符串的地址LDRBR2,[R1],#1;字节数据,源地址加STRBR2,[R0],#1;保存的1字节数据,目标地址加1CMPr2,#0 ;判断字符串是否完毕BNE ;没有完毕,继续循MOV ;汇编程序调用C程汇编程序的设置要遵循ATPCS规则,保证程序调用时参数的正确传在汇编程序中使用IMPORT伪指令将要调用的C程序函数在调用C程序时,要正确设置参数,然后使用BL调用汇编调用C程序的C函数:intsum5(inta,litb,intc,intd,int{return(a+b+c+d+e);/5个变量}汇编调用C程序的汇编程AREAaplIMPORT ;外部标号sum5,即C函数
STMFD {LR};LR寄存ADDR1,R0,R0 ;设置sum5函数 参数,R0为参数aADDR2,R1,R0 ;R1为参数b,R2为参数cADDSTRR3,[SP,#- 参数e要通过堆栈传 ;R3为参数BLsum5 ;调用um5结果保存在R0ADDSP,SP#4 ;修正SP指针LDMFD ;序返externvoidstrcopy(char*d,constchar*s)//外部函数,即要调用的汇序int{constchar*srcstr=“Firststring-source”;//定义字符串常量chardstsrt[]=“Secondstring-destination”;//定义字符串变量printf(“Beforecopying:\n”);printf(“’%s’\n‘%s\n,”srcstr,dststr);//显示源字符串和目标字符串的内容strcopy(dststr,srcstr);//调用汇编序,R0=dststr,R1=srcstrprintf(“Aftercopying:\n”)printf(“’%s’\n‘%s\n,”srcstr,dststr);//显示strcopy字符串结果}被调用汇编序 EXPORTstrcopy ;汇编程序strcopy,以便外部程序 ;R0为目标字符串的地址;R1为源字符串的地址;LDRBR2,[R1],#1;字节数据,源地址加1STRBR2,[R0],#1;保存的1字节数据,目标地址加1CMPr2,#0 ;判断字符串是否完毕BNEstrcopy ;没有完毕,继续循环MOVpc,lr ;返回汇编程序调用C程汇编遵循ATPCS规则,保证程序调用时参数的正确传递在汇编程序中使用IMPORT伪指令将要调用的C程序函数在调用C程序时,要正确设置参数,然后使用BL调用汇编调用C程序的C函数:intsum5(inta,litb,intc,intd,int{return(a+b+c+d+e);//返回5个变量的和}汇编调用C程序的汇编程序 sampleCODE,READONLYIMPORT ;外部标号sum5,即C函数
STMFD {LR};LR寄存器放栈ADDR1,R0,R0 ;设置sum5函数参数,R0为参数aADDR2,R1,R0 ;R1为参数b,R2为参数cADDSTRR3,[SP,#-4]! ;参数e要通过堆栈传递ADDR3,R1,R1 ;R3为参数dBLsum5 ;调用sum5(),结果保存在R0ADDSP,SP#4 ;修正SP指针LDMFD ;序返嵌入式C编程概述:C语言的优点是运行速度快、编译效率高、植性好和可读性强。C语言支持模块化程序设计,支持自顶向下的结构化程序设计设计中经嵌入式C语言程序设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计。也就是说它首先是C语言程序设计,因此必须符合C语言基本语法,只是它是面向嵌入式的应用而设计的程序。C语言的“预处理伪指令”在嵌入式程序设计中的应用。1、文件包含伪指令格式#lude <头文件名.h> ;标准头文件#lude “头文件名.h” ;自定义头文件2、宏定义伪指令格式#define 宏标识符 例: 3、条件宏:先测试是否定义过某宏标识符,然后决定如何处理。这样做是为了避免重复定义。格式: 宏标识符 宏标识符 宏标识 宏例
宏标识 宏 LUDESERIAL NUM#defineNUM NUART CONSOLE#defineCONSOLE CONSOLEBAUD#defineCONSOLEBAUD 4、条件编译伪指令格式#if(条件表达式…#elif(条件表达式…C语言的优点是运行速度快、编译效率高、植性好和可读性强。C语言支持模块化程序设计,支持自顶向下的结构化程序设计方法。因此在嵌入式程序设计中经常会用到C语言程序设计。嵌入式C语言程序设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计。也就是说它首先是C语言程序设计,因此必须符合C语言基本语法,只是它是面向嵌入式的应用而设计的程序。C语言的“预处理伪指令”在嵌入式程序设计中的应用1、文件包含伪指格式 <头文件名 ;标准头文 “头文件名 ;自定义头文2、宏定义伪指格式# 宏标识 宏nnnn 3、条件宏:先测试是否定义过某宏标识符,然后决定如何处理。这样做是为了避免重格 宏标 宏标 宏标识 宏例
宏标识 宏 LUDESERIAL NUM#defineNUM NUART CONSOLE#defineCONSOLE CONSOLEBAUD#defineCONSOLEBAUD 4、条件编译伪指格#if(条件表达式…#elif(条件表达式#elif(条件表达式这样,编译时,编译器仅对#if()…#endif之间满足 件表达式的源文件部分进行编译。使用寄存器变量当对 个变量频繁被读写时,需要反复内存,从而花费大量的存取时间。为此,C语言提供了 种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要内存,而直接从寄存器中读写,从而提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量,而循环计数是应用寄存器变量的最好候选者。例WORDAddition(BYTE{register for(i=1;i<=n;i++){}return}活用位操作(熟练掌握)使用C语言的位操作可以减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作,因而,灵活的位操作可以有效地提高程序运行的效率。例inti=879/j=562%inti=879>>j=562-(562>>5<<例intRa;//Ra[15:16]=11Ra&=~(3<<15);C语言位运算除了可以提高运算效率外,在嵌入式系统的编程中,它的另个最典型的应用,而且十分广泛地正在被使用着的是位间的(&)、(|)、非(~)操作,这跟嵌入式系统的编程特点有很大关系。例rGPCDAT=(rGPCDAT&0xFFFFFFF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 传感器网络安全防护策略
- 品管圈在护理服务中的应用与效果评估
- 神经外科患者的肠内营养支持与护理
- 灾区护理人员的专业技能提升
- 璧山区出租汽车客运价格调整听证方案
- 广东省汕头市潮南区2026年初中学业水平模拟考试数学试卷附答案
- 眼科患者的自我管理教育
- 失能老人常见疾病预防与护理
- 2026年数字孪生工厂设备预测性维护指南
- 2026年秸秆收储运市场化运营“政府引导 企业主导”模式解析
- 电力迁改协议书
- 2025年皖北卫生职业学院单招职业适应性测试题库附答案解析
- 2026年及未来5年市场数据中国智能两轮电动车市场竞争态势及投资战略规划研究报告
- 2025广西贺州市从“五方面人员”中选拔乡镇领导班子成员81人备考题库附答案
- 2026年通辽职业学院单招职业技能考试题库及答案详解1套
- DB 5107∕T 120.4-2023 地理标志产品 涪城麦冬 第4部分:种植技术规程
- 2025人武专干军事考试题库及答案
- 建标 110-2021 综合医院建设标准
- 煤矿型腰部助力外骨骼机器人
- 亚马逊知识产权培训模板课件
- TGXAS-坤土建中疗法应用技术规范编制说明
评论
0/150
提交评论