C汇编混合编程课件.ppt

C汇编混合编程课件.ppt

ID:57011718

大小:207.50 KB

页数:19页

时间:2020-07-26

C汇编混合编程课件.ppt_第1页
C汇编混合编程课件.ppt_第2页
C汇编混合编程课件.ppt_第3页
C汇编混合编程课件.ppt_第4页
C汇编混合编程课件.ppt_第5页
资源描述:

《C汇编混合编程课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C和汇编语言混合编程第六章C与汇编语言混合编程ATPCS介绍内嵌汇编C和ARM汇编程序间相互调用ATPCS介绍ATPCS(ARM-ThumbProduceCallStandard)是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。2.1寄存器ARM/Thumb指令集编程时共有16个32位通用寄存器可见,在汇编中表示为r0~r15或R0~R15。在过程调用标准中,每个寄存器都有其特定的角色。寄存器的特定角色寄存器编号可选

2、寄存器名特殊寄存器名寄存器用法R0a1函数调用时的参数寄存器,用来存放前4个函数参数并存放返回值。在函数内如果将这些寄存器用作其他用途,将破坏其值。R1a2R2a3R3a4R4v1通用变量寄存器R5v2R6v3R7v4R8v5R9v6或SB或TR平台寄存器,不同的平台对该寄存器的定义不同R10v7通用变量寄存器。在使用堆栈边界检测的情况下,r10保存堆栈边界地址R11v8通用变量寄存器R12IP临时过渡寄存器,函数调用时会破坏其值R13SP堆栈指针R14LR链接寄存器R15PC程序计数器数据栈的使用规则根据堆栈指针指向位置的不同和增长方向的不同可以分为以下4种数

3、据栈:FD(FullDescending)满递减ED(EmptyDescending)空递减FA(FullAscending)满递增EA(EmptyAscending)空递增ATPCS规定数据栈为FD(满递减)类型,并且对数据栈的操作是8字节对齐的。参数的传递规则参数个数固定的子程序参数传递规则:前4个整数参数,通过寄存器R0~R3来传递。其他参数通过数据栈传递。参数个数可变的子程序参数传递规则:当参数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数子程序结果返回规则结果为一个32位的整数时,可以通过寄存器R0返回;

4、结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。参数传递开始四个字大小的参数直接使用寄存器的R0-R3来传递(快速且高效的)ATPCS如果需要更多的参数,将使用堆栈。(需要额外的指令和慢速的存储器操作)所以通常限制参数的个数,使它为4或更少。如果不可避免,把常用的参数前4个放在R0-R3中Example...ParameterPassing(4parameters)intfunc1(inta,intb,intc,intd){returna+b+c+d;}intcaller1(void){returnfunc1(1,2,3,4);}func10x0

5、00000:ADDr0,r0,r10x000004:ADDr0,r0,r20x000008:ADDr0,r0,r30x00000c:MOVpc,lrcaller10x000014:MOVr3,#40x000018:MOVr2,#30x00001c:MOVr1,#20x000020:MOVr0,#10x000024:BLfunc1ParameterPassing(4parameters)内嵌汇编在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。内嵌

6、的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。嵌入式汇编在形式上表现为独立定义的函数体。内嵌汇编指令的语法格式__asm(“指令[;指令]”);ARMC汇编器使用关键字“__asm"。如果有多条汇编指令需要嵌入,可以用“{}”将它们归为一条语句。如:__asm{指令[;指令]…[指令]}需要特别注意的是__asm是两个下划线。内嵌的汇编指令的特点操作数可以是寄存器、常量或C表达式。它们可以是char、short或者int类型,而且是作为无符号数进行操作。内嵌的汇编指令中使用物理寄存器有一些限制。常

7、量前的符号“#”可以省略只有指令B可以使用C程序中的标号,指令BL不能使用C程序中的标号。不支持汇编语言中用于内存分配的伪操作。指令中如果包含常量操作数,该指令可能会被汇编器展开成几条指令。内嵌汇编注释可使用C风格的注释。内嵌汇编器与armasm汇编器的区别内嵌汇编器不支持通过“·”指示符或PC获取当前指令地址;不支持LDRRn,=expression伪指令,而使用MOVRn,expression指令向寄存器赋值;不支持标号表达式;不支持ADR和ADRL伪指令;不支持BX和BLX指令;不可以向PC赋值;使用0x前缀替代“&”表示十六进制数。内嵌汇编注意事项必须小

8、心使用物理寄存器,如R0

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。