




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C与汇编语言混合编程与汇编语言混合编程 ATPCS介绍介绍 内嵌汇编内嵌汇编 C和和ARM汇编汇编 程序间相互调用程序间相互调用一、一、ATPCS介绍介绍 ATPCS(ARM-Thumb Produce Call Standard)是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。 寄存器的使用规则寄存器的使用规则 子程序间通过寄存器R0R3来传递参数,这时,寄存器R0R3可以记作A1A4。 在子程序中,使用寄存器R4R11来保存局部变量。这时,寄存
2、器 R4R11可以记作V1V8。在Thumb程序中,通常只能使用寄存器R4R7来保存局部变量 。 寄存器R12用作子程序间的scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip。 寄存器R13用作数据栈指针,记作sp。 寄存器R14称为链接寄存器,记作lr。 寄存器R15是程序计数器,记作pc。 寄存器别名特殊名使用规则R0a1参数/结果scratch寄存器1R1a2 参数/结果scratch寄存器2R2a3参数/结果scratch寄存器3R3a4参数/结果scratch寄存器4R4v1ARM状态局部变量寄存器1R5v2ARM状态局部变量寄存器2R6v3ARM状态局部变
3、量寄存器3R7v4wrARM状态局部变量寄存器4Thumb状态工作寄存器R8v5ARM状态局部变量寄存器5R9v6sbARM状态局部变量寄存器6,在支持RWPI的ATPCS中为静态基址寄存器R10v7slARM状态局部变量寄存器7,在支持数据栈检查的ATPCS中为数据栈限制指针R11v8fpARM状态局部变量寄存器8/帧指针R12ip子程序内部调用的scratch寄存器R13sp数据栈指针R14lr连接寄存器R15pc程序计数器数据栈的使用规则数据栈的使用规则根据堆栈指针指向位置的不同 和增长方向的不同可以分为以下4种数据栈 : FD (Full Descending) 满递减 ED (Emp
4、ty Descending)空递减 FA (Full Ascending) 满递增 EA (Empty Ascending) 空递增ATPCS规定数据栈为FD(满递减)类型,并且对数据栈的操作是8字节对齐的。 参数的传递规则参数的传递规则参数个数固定的子程序参数传递规则: 第一个整数参数,通过寄存器R0R3来传递。其他参数通过数据栈传递。 参数个数可变的子程序参数传递规则: 当参数不超过4个时,可以使用寄存器R0R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数 子程序结果返回规则: 结果为一个32位的整数时,可以通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和R1返
5、回,依次类推。 二、二、内嵌汇编内嵌汇编 在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。 内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。嵌入式汇编在形式上表现为独立定义的函数体。 内嵌汇编指令的语法格式内嵌汇编指令的语法格式 _asm(“指令;指令”); ARM C汇编器使用关键字“_asm。如果有多条汇编指令需要嵌入,可以用“”将它们归为一条语句。如: _asm 指令;指令 指令 需要特别注意的是_as
6、m是两个下划线。 内嵌的汇编指令的特点内嵌的汇编指令的特点 操作数可以是寄存器、常量或C表达式。它们可以是char、short或者int类型,而且是作为无符号数进行操作 。内嵌的汇编指令中使用物理寄存器有一些限制。常量前的符号“#”可以省略 只有指令B可以使用C程序中的标号,指令BL不能使用C程序中的标号。 不支持汇编语言中用于内存分配的伪操作。指令中如果包含常量操作数,该指令可能会被汇编器展开成几条指令。 内嵌汇编器与内嵌汇编器与armasm汇编器的区别汇编器的区别 内嵌汇编器不支持通过“”指示符或PC获取当前指令地址; 不支持LDR Rn,= expression伪指令,而使用MOV Rn
7、, expression指令向寄存器赋值; 不支持标号表达式;不支持ADR和ADRL伪指令; 不支持BX和BLX指令; 不可以向PC赋值; 使用0 x前缀替代“”表示十六进制数。 内嵌汇编注意事项内嵌汇编注意事项 必须小心使用物理寄存器,如R0R3,LR和PC。 不要使用寄存器寻址变量。 使用内嵌汇编时,编译器自己会保存和恢复它可能用到的寄存器,用户无须保存和恢复寄存器。 LDM和STM指令的寄存器列表只允许物理寄存器。 汇编语言用“,”作为操作数分隔符 三、三、C和和ARM汇编程序间相互调用汇编程序间相互调用 在C和ARM汇编程序之间相互调用必须遵守ATPCS(ARM-Thumb Proce
8、dure Call Standard)规则。C和汇编之间的相互调用可以从以下这三方面来介绍:汇编程序对C全局变量的访问在C语言程序中调用汇编程序在汇编程序中调用C语言程序汇编程序访问全局汇编程序访问全局C C变量变量 汇编程序可以通过地址间接访问在C语言程序中声明的全局变量。通过使用IMPORT关键词引人全局变量,并利用LDR和STR指令根据全局变量的地址可以访问它们。对于不同类型的变量,需要采用不同选项的LDR和STR指令,如下所示: unsigned char LDRB/STRBunsigned short LDRH/STRHunsigned int LDR/STRchar LDRSB/S
9、TRSBshort LDRSH/STRSH AREA globals,CODE,READONLY EXPORT asmsubroutine; IMPORT globvar; asmsubroutine LDR R1,=globvar ;从文字池读globvar的地 ;址,并将其保存到R1 LDR R0,R1 ;再将其值读入到寄存器R0中 ADD R0,R0,#2 STR R0,R1 ;修改后再将寄存器R0的值 ;赋予变量globvar MOV PC,LR END在在C语言程序中调用汇编程序语言程序中调用汇编程序 为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在汇编程序中需要
10、使用EXPORT伪操作来声明,使得本程序可以被其它程序调用。同时,在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序。 C源程序:源程序:# include extern void strcopy(char *d,const char *s) ;用extern声明一个函数为外部函数, ;可以被其他文件中的函数调用。int main() const char *srcstr =“First stringsource”;char * dststr =“Second stringdestination”;strcopy(dststr,srcstr);调用汇编函数str
11、copy()return(0);汇编源程序:汇编源程序:AREA SCopy,CODE,READONLYEXPORT strcopy ;用EXPORT伪操作声明该变量可以被其他 ;文件引用,相当于声明了一个全局变量。 Strcopy ;R0指向目标字符串,R1指向源字符串 LDRB R2,R1,#1 ;字节加载,并更新地址 STRB R2,R0,#1 ;字节保存,并更新地址 CMP R2,#0 ;检测R2是否等于0 BNE strcopy ;若条件不成立则继续执行 MOV PC,LR ;从子程序返回END在汇编程序中调用在汇编程序中调用C语言程序语言程序为了保证程序调用时参数的正确传递,汇编程
12、序的设计要遵守ATPCS。在C程序中不需要使用任何关键字来声明将被汇编语言调用的C程序,但是在汇编程序调用该C程序之前需要在汇编语言程序中使用IMPORT伪操作来声明该C程序。在汇编程序中通过BL指令来调用子程序。 C函数原型:函数原型:int g(int a,int b,int c,int d,int e)return a+b+c+d+e;/汇编程序调用C程序g()计算5个整数i, 2*i, 3*i, 4*i, 5*i 的和。 汇编源程序:汇编源程序:EXPORT fAREA f,CODE,READONLYIMPORT g;声明该变量函数g( ),i在R0中STR LR,SP,#- 4! ;预先保存LRADD R
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 平台经济与农产品流通模式试题及答案
- 舞蹈心理测试题及答案
- 施工现场安全目标管理试题及答案
- 婴儿智力考试题及答案
- 建筑安全竞赛试题及答案
- 物理学的影响力2025年试题及答案
- 针对医疗领域的2025年大数据隐私保护技术合规应用的技术创新与合规挑战报告
- 医院信息化建设中的电子病历系统:2025年智能提醒与优化方案
- 电动汽车充电桩市场化运营试题及答案
- 2025教师上岗考试试题及答案
- AI新时代算力需求高增长-算力网络建设有望奔向太空
- 2024届考研199管理类综合能力真题及解析完整版
- 肠梗阻合并糖尿病护理查房
- DB32T-无锡水蜜桃标准
- 古诗词诵读《登岳阳楼》公开课一等奖创新教学设计统编版高中语文必修下册
- 2024版工厂并购协议书范本
- 中职班主任培训讲座
- 2024年河北省中考化学真题(含解析)
- 2024至2030年中国3C电子产品租赁行业市场运行现状及投资战略研究报告
- 2024年广东省高考化学试卷(真题+答案)
- 教科版六年级下册科学期末测试卷含完整答案(各地真题)
评论
0/150
提交评论