




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C与汇编语言混合编程与汇编语言混合编程ATPCS介绍介绍内嵌汇编内嵌汇编C和和ARM汇编汇编 程序间互相调用程序间互相调用一、一、ATPCS介绍介绍 ATPCSARM-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 Empty
4、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指令;指令指令需要特别注意的是_asm是两个下划线。 内嵌的汇编
6、指令的特点内嵌的汇编指令的特点 操作数可以是存放器、常量或C表达式。它们可以是char、short或者int类型,而且是作为无符号数进展操作 。内嵌的汇编指令中使用物理存放器有一些限制。常量前的符号“#可以省略 只有指令B可以使用C程序中的标号,指令BL不能使用C程序中的标号。 不支持汇编语言中用于内存分配的伪操作。指令中假如包含常量操作数,该指令可能会被汇编器展开成几条指令。 内嵌汇编器与内嵌汇编器与armasm汇编器的区别汇编器的区别 内嵌汇编器不支持通过“指示符或PC获取当前指令地址; 不支持LDR Rn,= expression伪指令,而使用MOV Rn, expression指令向存
7、放器赋值; 不支持标号表达式;不支持ADR和ADRL伪指令; 不支持BX和BLX指令; 不可以向PC赋值; 使用0 x前缀替代“表示十六进制数。 内嵌汇编本卷须知内嵌汇编本卷须知 必须小心使用物理存放器,如R0R3,LR和PC。 不要使用存放器寻址变量。 使用内嵌汇编时,编译器自己会保存和恢复它可能用到的存放器,用户无须保存和恢复存放器。 LDM和STM指令的存放器列表只允许物理存放器。 汇编语言用“,作为操作数分隔符 三、三、C和和ARM汇编程序间互相调用汇编程序间互相调用 在C和ARM汇编程序之间互相调用必须遵守ATPCSARM-Thumb Procedure Call Standard规
8、那么。C和汇编之间的互相调用可以从以下这三方面来介绍:汇编程序对C全局变量的访问在C语言程序中调用汇编程序在汇编程序中调用C语言程序汇编程序访问全局汇编程序访问全局C C变量变量 汇编程序可以通过地址间接访问在C语言程序中声明的全局变量。通过使用IMPORT关键词引人全局变量,并利用LDR和STR指令根据全局变量的地址可以访问它们。对于不同类型的变量,需要采用不同选项的LDR和STR指令,如下所示: unsigned char LDRB/STRBunsigned short LDRH/STRHunsigned int LDR/STRchar LDRSB/STRSBshort LDRSH/STR
9、SH AREA globals,CODE,READONLYEXPORT asmsubroutine;IMPORT globvar ;asmsubroutineLDR R1,=globvar ;从文字池读globvar的地 ;址,并将其保存到R1LDR R0,R1 ;再将其值读入到存放器R0中ADD R0,R0,#2STR R0,R1 ;修改后再将存放器R0的值 ;赋予变量globvarMOV PC,LREND在在C语言程序中调用汇编程序语言程序中调用汇编程序 为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在汇编程序中需要使用EXPORT伪操作来声明,使得本程序可以被其它程序
10、调用。同时,在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序。 C源程序:源程序:# include extern void strcopychar *d,const char *s ;用;用extern声明一个函数为外部函数,声明一个函数为外部函数, ;可以被其他文件中的函数调用。;可以被其他文件中的函数调用。int main const char *srcstr =“First stringsource;char * dststr =“Second stringdestination;strcopydststr,srcstr;调用汇编函数;调用汇编函数st
11、rcopyreturn0;汇编源程序:汇编源程序:AREA SCopy,CODE,READONLYEXPORT strcopy ;用;用EXPORT伪操作声明该变量可以被其他伪操作声明该变量可以被其他 ;文件引用,相当于声明了一个全局变量。;文件引用,相当于声明了一个全局变量。 Strcopy ;R0指向目的字符串指向目的字符串,R1指向源字符串指向源字符串 LDRB R2,R1,#1 ;字节加载,并更新地址;字节加载,并更新地址 STRB R2,R0,#1 ;字节保存,并更新地址;字节保存,并更新地址 CMP R2,#0 ;检测;检测R2是否等于是否等于0 BNE strcopy ;假设条件
12、不成立那么继续执行;假设条件不成立那么继续执行 MOV PC,LR ;从子程序返回;从子程序返回END在汇编程序中调用在汇编程序中调用C语言程序语言程序为了保证程序调用时参数的正确传递,汇编程序的设计要遵守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 R1,R0,R0;计算;计算2 * i(第第2个参数个参数)ADD R2,R1,R0;计算;计算3*i(第
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 传统艺术考试题目及答案
- 中国分离式绳头组合项目投资计划书
- 基金考试试题及答案大全解析
- 再生5000m3SCR脱硝催化剂项目环境影响后评价报告
- 中国氧化铱(IV)项目商业计划书
- 初级中控考试题及答案
- 南通铝酸钙项目投资分析报告模板范本
- 2025年3月热工检测技术模拟习题+答案
- 2025年仓储部安全管理员考试模拟试题卷
- 护理制度考试试题及答案
- 电气实验室安全知识培训课件
- 电磁兼容EMC基础知识培训课件
- 渐冻症的康复治疗
- 猪场粪污消纳处置方案(3篇)
- 外科手术发展史-洞察及研究
- 工伤保险知识竞赛试题和答案
- 担保管理办法成效
- 2025-2026年秋季学期各周国旗下讲话安排表+2025-2026学年上学期升旗仪式演讲主题安排表
- 疼痛叙事的文化编码-洞察及研究
- 心内科常见病健康教育
- 银行网点手语管理办法
评论
0/150
提交评论